forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Математика (http://forum.boolean.name/forumdisplay.php?f=85)
-   -   lat/llong -> Units (http://forum.boolean.name/showthread.php?t=20501)

RegIon 21.12.2016 20:30

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;
    } 



Часовой пояс GMT +4, время: 06:36.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot