Как уже не раз говорили проект огромный, нету комментов(минимум), много интерфейсов... и прочее, сложно понять общую картину проекта. Искал класс или метод который конвертирует [lat,lng] в [z,x,y], во время скачки и/или после для чтения из кеша. Сам кроме LatLng2RelativeInternal ничего не нашел, да и тот что "внутреннее выдает" в пределах [0-1]. Сперва хотел исользовать код от гугла, потом нашел и другие, но все дают неправильные координаты тайла для заданного [lat,lng]. Точнее такой результат:
cache\map\z19\173\
x177383\97\
y100095.png
// правильныйcache\map\z19\173\
x177206\97\
y100134.png
Вопрос: Какой класс или метод который конвертирует [lat,lng] в [z,x,y], во время скачки и/или после для чтения из кеша?
В частности интересует EPSG=3785.
- скрытый текст: показать
- Что? Зачем? Для чего? Хочу написать свой mapControl на WPF который будет использовать существующий кеш. Застрял на этом месте. Создал тему с описанием этой же проблемы в этой ветке форума, на след. день "кто-то" удалил. Сейчас вижу "кто-то" обратно вернул, спасибо.
Upd. Хорошо, вопрос с приведением кода.
Входные [lon = 63.355570, lat = 39.054670] подаю на следующую функцию:
- Код: Выделить всё
function TProjectionTypeMercatorOnSphere.LonLat2RelativeInternal(
const APoint: TDoublePoint
): TDoublePoint;
var
z, c: Extended; { Extended is a Pascal type that will hold an extended floating point value.}
begin
Result.x := 0.5 + APoint.x / 360;
z := Sin(APoint.y * Pi / 180);
c := 1 / (2 * Pi);
Result.y := 0.5 - 0.5 * Ln((1 + z) / (1 - z)) * c;
end;
результат подаю на эту:
- Код: Выделить всё
function TProjectionBasic256x256.InternalRelative2TilePosFloat(
const APoint: TDoublePoint
): TDoublePoint;
begin
Result := DoublePoint(APoint.X * FTilesFloat, APoint.Y * FTilesFloat);
end;
на выходе одно и тоже по X RelInt2TilePos Coords X:
177206,118172444
по Y:
117636,115362263 съезжает еще дальше.
Переформулирую вопрос:
Где или как программа сглаживает эту неточность/погрешность расчета координат тайла?