Можно было и так:
result.y:=round(zoom[Azoom]/2-ll.y*((zoom[Azoom]/2)/180));
Модератор: Tolik
Dimashik78 писал(а):У Google Планета Земля проекция -180 +180 во все стороны.
public static double GetTileX(double lon, int zoom)
{
return Math.Pow(2, (double)(zoom - 2)) * (1 + lon / 180.0);
}
public static double GetTileY(double lat, int zoom)
{
return Math.Pow(2, (double)(zoom - 2)) * (1 - ((Math.Log((1 + Math.Sin(lat * Pi / 180.0)) / (1 - Math.Sin(lat * Pi / 180.0)))) / 2.0 - e2P * (Math.Log((1 + e2P * Math.Sin(lat * Pi / 180.0)) / (1 - e2P * Math.Sin(lat * Pi / 180.0)))) / 2.0) / Pi);
}
public static double GetLon(double tileX, int zoom)
{
return (tileX / Math.Pow(2.0, (double)(zoom - 2)) - 1) * 180.0;
}
public static double GetLat(double tileY, int zoom)
{
double y1 = (1.0 - (tileY / Math.Pow(2.0, (double)(zoom - 2)))) * Math.PI;
double teta0 = 2.0 * Math.Atan(Math.Pow(Math.E, y1)) - Pi / 2.0;
double teta = CalcTeta(teta0, y1);
while (Math.Abs(teta - teta0) > 0.000000001)
{
teta0 = teta;
teta = CalcTeta(teta, y1);
}
return teta * 180.0 / Math.PI;
}
private static double CalcTeta(double teta0, double y1)
{
return Math.Asin(1.0 - (1.0 + Math.Sin(teta0)) * Math.Pow(1.0 - e2P * Math.Sin(teta0), e2P) / (Math.Pow(Math.E, 2.0 * y1) * Math.Pow(1 + e2P * Math.Sin(teta0), e2P)));
}
e2P = 0.081819790992
для южного полушария сами подправите, если надо
feya писал(а):Есть исходники SASPlanet с соответствующими функциями (юнит Ugeofun.pas)
ObiVan писал(а):feya писал(а):Есть исходники SASPlanet с соответствующими функциями (юнит Ugeofun.pas)
А где исходники можно взять? Тоже интересует пересчет.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16