Использую static google maps API, что бы запрашивать карту., но возник вопрос, как транслировать координаты в x,z Unity относительно карты.
Проблема еще в том, что нужно учесть размер текстуры и zoom.
Перевожу из метров в меркат и обратно таким образом:
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 накоплением:
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;
}