LINUX.ORG.RU

Перевод координат

 ,


0

2

Для перевода координат из географических в пиксельные в проекции EPSG:3395 (Яндекс.Карты) использую такой код (на входе - координаты в градусах и уровень масштаба tile сервера):

long CEPSG3395::GetAbsoluteX( double Longitude, unsigned int Z ) const
{
	return (long)((Longitude + 180.0)/360.0*(256 * pow(2, Z)));
}

long CEPSG3395::GetAbsoluteY( double Latitude, unsigned int Z ) const
{
	double rLat = Latitude * M_PI / 180;
	double a = 6378137.0;
	double k = 0.0818191908426;

	double zz = tan(M_PI_4 + rLat / 2)  / pow((tan(M_PI_4 + asin(k * sin(rLat)) / 2)), k);
	double y = (20037508.342789 - a * log(zz)) * 53.5865938 / pow( 2 ,23 - Z);
	return ((long)y );
}

Помогите найти/написать/поправить этот код для проекции EPSG:3857 (Google Maps)

Подробнее о проекциях: http://www.politerm.com.ru/zuludoc/tile_servers.htm



Последнее исправление: Uter (всего исправлений: 1)

pow для целочисленной степени замените на умножение в цикле. Операции деления на константу замените умножением на обратную величину. Это не к алгоритму, а к эффективности кода.

По сабжу - в Job вообще то. Что непонятно, по ссылке все ведь описано?

AIv ★★★★★
()
Ответ на: комментарий от Uter

Если лень думать (мне вот лень), попробуйте и посмотрите на что будет похожа америка;-)

AIv ★★★★★
()
7 июня 2013 г.

C#

public static double GetAbsX(double lng, int zoom) { return Math.Pow(2, zoom) / 2 * (1 + (lng / 180)); } public static double GetAbsY(double lat, int zoom) { var sin = Math.Sin(lat * Math.PI / 180); return Math.Pow(2, zoom) / 2 * (1 - Math.Log((1 + sin) / (1 - sin)) / Math.PI / 2); }

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.