Преобразование long/lat к пикселю x/y, учитывая уровень масштабирования

Используйте catch-исключение :

// test 
public void testDo() {

   // obj.do(1) must throw either A or B
   catchException(obj).do(1);
   assert caughtException() instanceof A
       || caughtException() instanceof B;

   // obj.do(2) must throw A but not SubclassOfA
   catchException(obj).do(2);
   assert caughtException() instanceof A
       && !(caughtException() instanceof SubclassOfA);

}

7
задан Jonathan 20 October 2009 в 04:59
поделиться

2 ответа

«Если это проекция Меркатора, вам не нужно беспокоиться о кривизне Земли, поскольку все линии широты и долготы находятся на одинаковом расстоянии»

Возможно, вы » Вы думаете о проекции Географическая (она же Плейт Карри)? В проекции Меркатора линии долготы расположены на одинаковом расстоянии, но нет равноудаленных линий широты (lat = atan (sinh (y)), поэтому 90 ° находится на бесконечности).

BTW, математика для проекции Меркатора на сферу здесь , но если Google Maps использует эллипсоид WGS84, и вам нужно уточнить его, это усложняется. В таком случае я бы посмотрел на это , но будьте осторожны: это не для слабонервных.

2
ответ дан 6 December 2019 в 23:10
поделиться

Вот код, который я сейчас использую. Это на PHP.

// Returns longitude in pixels at a certain zoom level
function lonToX($lon, $zoom) {
    $offset = 256 << ($zoom-1);
    return round($offset + ($offset * $lon / 180));
}
// Returns latitude in pixels at a certain zoom level
function latToY($lat, $zoom) {
    $offset = 256 << ($zoom-1);
    return round($offset - $offset/pi() * log((1 + sin($lat * pi() / 180)) / (1 - sin($lat * pi() / 180))) / 2);
}

На основе кода с этой страницы , написанного этим парнем .

Удачи!

Обновление: Эта карта - отличный способ помочь понять, как плитки работают в Google Maps

Изменить: Вот эквивалентный набор функций в VB.NET:

Public Function LonToX(Lon As Double, Zoom as UInteger) As UInteger
    Dim Offset = 256 << (Zoom - 1)
    Return Math.Round(Offset + (Offset * Lon / 180))
End Function

Public Function LatToY(Lat As Double, Zoom as UInteger) As UInteger
    Dim Offset = 256 << (Zoom - 1)
    Return Math.Round(Offset - Offset / Math.Pi * Math.Log((1 + Math.Sin(Lat * Math.Pi / 180)) / (1 - Math.Sin(Lat * Math.Pi / 180))) / 2)
End Function

и C #:

public uint lonToX(double lon, uint zoom) {
    uint offset = 256 << (zoom - 1);
    return Math.Round(offset + (offset * lon / 180));
}

public uint latToY(double lat, uint zoom) {
    uint offset = 256 << (zoom - 1);
    return Math.Round(offset - offset / Math.Pi * Math.Log((1 + Math.Sin(lat * Math.Pi / 180)) / (1 - Math.Sin(lat * Math.Pi / 180))) / 2);
}
9
ответ дан 6 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: