lat/llong -> Units
Использую static google maps API, что бы запрашивать карту., но возник вопрос, как транслировать координаты в x,z Unity относительно карты.
Проблема еще в том, что нужно учесть размер текстуры и zoom.
Перевожу из метров в меркат и обратно таким образом:
PHP код:
public static class MapConverter {
//http://www.smipple.net/snippet/DonnyV/Convert%20x,y%20from%20WGS%2084%20meters%20to%20Lat-%20Long //http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/
public static GoogleMapLocation UnitsToMercatorLocation(Vector2 pos) { Vector2 ret = UnitsToMercator(pos); return new GoogleMapLocation() { longitude = ret.x, latitude = ret.y, address = "" }; }
public static Vector2 MercatorToUnits(GoogleMapLocation pos) { return MercatorToUnits(new Vector2(pos.longitude, pos.latitude)); }
public static Vector2 MercatorToUnits(Vector2 pos) { //float x = pos.y * 20037508.34f / 180; double x = pos.x * 200375.0834 / 180; double y = Math.Log(Math.Tan((90 + pos.y) * Math.PI / 360)) / (Math.PI / 180); y = y * 200375.0834 / 180; return new Vector2((float)x , (float)y); }
public static Vector2 UnitsToMercator(Vector2 pos) { double lon = (pos.x / 200375.0834) * 180; double lat = (pos.y / 200375.0834) * 180;
lat = 180 / Math.PI * (2 * Math.Atan(Math.Exp(lat * Math.PI / 180)) - Math.PI / 2); return new Vector2( (float)lon, (float)lat); } }
но как учесть zoom. Пытаюсь так, но что-то фигня какая-то выходит, постоянное смещение c накоплением:
PHP код:
Vector3 TransformLocationToPos(GoogleMapLocation loc) {
_pos = -MapConverter.MercatorToUnits(loc) + map.CenterLocationUnits; var t = _pos.z; _pos.z = _pos.y; _pos.y = t;
_pos = _pos / (2 << (15 - map.zoom)); return _pos; }
|