Используйте 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);
}
«Если это проекция Меркатора, вам не нужно беспокоиться о кривизне Земли, поскольку все линии широты и долготы находятся на одинаковом расстоянии»
Возможно, вы » Вы думаете о проекции Географическая (она же Плейт Карри)? В проекции Меркатора линии долготы расположены на одинаковом расстоянии, но нет равноудаленных линий широты (lat = atan (sinh (y)), поэтому 90 ° находится на бесконечности).
BTW, математика для проекции Меркатора на сферу здесь , но если Google Maps использует эллипсоид WGS84, и вам нужно уточнить его, это усложняется. В таком случае я бы посмотрел на это , но будьте осторожны: это не для слабонервных.
Вот код, который я сейчас использую. Это на 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);
}