gpt4 book ai didi

javascript - 获取 Google Static Maps API 的西南 Angular 和东北 Angular

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:54 25 4
gpt4 key购买 nike

我在 Unity 应用程序中获取 Google 静态 map 的边界时遇到问题。我尝试了在 stackoverflow 上找到的多个答案。

.NET related question

Javascript related question

我要计算 Angular 点的 map 是 this map 。

首先,我尝试将 marcelo 他的代码从 javascript 翻译成 C#。翻译成下面的类。

using System;
using UnityEngine;
public class MercatorProjection
{
static double MERCATOR_RANGE = 256;
Point pixelsOrigin;
double pixelsPerLonDegree;
double pixelsPerLonRadian;

public MercatorProjection()
{
pixelsOrigin = new Point(MERCATOR_RANGE / 2, MERCATOR_RANGE / 2);
pixelsPerLonDegree = MERCATOR_RANGE / 360;
pixelsPerLonRadian = MERCATOR_RANGE / (2 * Math.PI);
}

double bound(double value, double opt_min, double opt_max)
{
if (opt_min != 0)
value = Math.Max(value, opt_min);
if (opt_max != 0)
value = Math.Min(value, opt_max);
return value;
}

double degreesToRadians(double deg)
{
return deg * (Math.PI / 180);
}

double radiansToDegrees(double rad)
{
return rad / (Math.PI / 180);
}

Point fromLatLonToPoint(Coordinates latLon)
{
Point point = new Point();
Point origin = pixelsOrigin;

point.X = origin.X + latLon.Longitude * pixelsPerLonDegree;

double sinY = bound(Math.Sin(degreesToRadians(latLon.Latitude)), -0.9999, 0.9999);

point.Y = origin.Y + 0.5 * Math.Log((1 + sinY) / (1 - sinY)) * -pixelsPerLonRadian;

return point;
}

Coordinates fromPointToLatlon(Point point)
{
Point origin = pixelsOrigin;
Coordinates latLon = new Coordinates();

latLon.Latitude = (point.X - origin.X) / pixelsPerLonDegree;
double latRadians = (point.Y - origin.Y) / -pixelsPerLonRadian;
latLon.Longitude = radiansToDegrees(2 * Math.Atan(Math.Exp(latRadians)) - Math.PI / 2);

return latLon;
}

public void GetCorners(Coordinates center, float zoom, float mapWidth, float mapHeight)
{
double scale = Math.Pow(2, zoom);
Point centerPx = fromLatLonToPoint(center);
Point SWPoint = new Point(centerPx.X - (mapWidth / 2) / scale, centerPx.Y + (mapHeight / 2) / scale);
Coordinates SWLatLon = fromPointToLatlon(SWPoint);
Debug.Log(SWLatLon.Latitude + " " + SWLatLon.Longitude + " " + SWPoint.X + " " + SWPoint.Y);
}
}

所以起初我只尝试获取 map 的西南 Angular ,它非常接近,但有点偏离。

MercatorProjection.GetCorners(new Coordinates(Coordinates.Longitude, Coordinates.Latitude), 16, 640, 640);

给我带来了 this 结果。

因为有这么多人投票,首先我尝试翻译 marcelo 他的回答,我想我在将代码翻译成 C# 的过程中做错了什么。

然后我偶然发现了 peterjb's answer,他已经将 javascript 答案翻译成 C#,甚至给出了示例,其中他的代码获得了 Google 静态 map 的正确边界。所以在下面的类中尝试 peterjb 的代码之后;

using System;

public static class GoogleMapsAPI{

static GoogleMapsAPI()
{
OriginX = TileSize / 2;
OriginY = TileSize / 2;
PixelsPerLonDegree = TileSize / 360.0;
PixelsPerLonRadian = TileSize / (2 * Math.PI);
}

public static int TileSize = 256;
public static double OriginX, OriginY;
public static double PixelsPerLonDegree;
public static double PixelsPerLonRadian;

public static double DegreesToRadians(double deg)
{
return deg * Math.PI / 180.0;
}

public static double RadiansToDegrees(double rads)
{
return rads * 180.0 / Math.PI;
}

public static double Bound(double value, double min, double max)
{
value = Math.Min(value, max);
return Math.Max(value, min);
}

//From Lat, Lon to World Coordinate X, Y. I'm being explicit in assigning to
//X and Y properties.
public static Coordinate Mercator(double latitude, double longitude)
{
double siny = Bound(Math.Sin(DegreesToRadians(latitude)), -.9999, .9999);

Coordinate c = new Coordinate(0, 0);
c.X = OriginX + longitude * PixelsPerLonDegree;
c.Y = OriginY + .5 * Math.Log((1 + siny) / (1 - siny)) * -PixelsPerLonRadian;

return c;
}

//From World Coordinate X, Y to Lat, Lon. I'm being explicit in assigning to
//Latitude and Longitude properties.
public static Coordinate InverseMercator(double x, double y)
{
Coordinate c = new Coordinate(0, 0);

c.Longitude = (x - OriginX) / PixelsPerLonDegree;
double latRadians = (y - OriginY) / -PixelsPerLonRadian;
c.Latitude = RadiansToDegrees(Math.Atan(Math.Sinh(latRadians)));

return c;
}

public static MapCoordinates GetBounds(Coordinate center, int zoom, int mapWidth, int mapHeight)
{
var scale = Math.Pow(2, zoom);

var centerWorld = Mercator(center.Latitude, center.Longitude);
var centerPixel = new Coordinate(0, 0);
centerPixel.X = centerWorld.X * scale;
centerPixel.Y = centerWorld.Y * scale;

var NEPixel = new Coordinate(0, 0);
NEPixel.X = centerPixel.X + mapWidth / 2.0;
NEPixel.Y = centerPixel.Y - mapHeight / 2.0;

var SWPixel = new Coordinate(0, 0);
SWPixel.X = centerPixel.X - mapWidth / 2.0;
SWPixel.Y = centerPixel.Y + mapHeight / 2.0;

var NEWorld = new Coordinate(0, 0);
NEWorld.X = NEPixel.X / scale;
NEWorld.Y = NEPixel.Y / scale;

var SWWorld = new Coordinate(0, 0);
SWWorld.X = SWPixel.X / scale;
SWWorld.Y = SWPixel.Y / scale;

var NELatLon = InverseMercator(NEWorld.X, NEWorld.Y);
var SWLatLon = InverseMercator(SWWorld.X, SWWorld.Y);

return new MapCoordinates() { NorthEast = NELatLon, SouthWest = SWLatLon };
}
}
public class MapCoordinates
{
public Coordinate SouthWest { get; set; }
public Coordinate NorthEast { get; set; }
}

public class Coordinate
{
public double Latitude { get; set; }
public double Longitude { get; set; }

public double Y { get { return Latitude; } set { Latitude = value; } }
public double X { get { return Longitude; } set { Longitude = value; } }

public Coordinate(double lng, double lat)
{
Latitude = lat;
Longitude = lng;
}

public override string ToString()
{
return Math.Round(X, 6).ToString() + ", " + Math.Round(Y, 6).ToString();
}
}

我尝试通过调用以下命令再次计算 SW 和 NE Angular

Coordinates = new Coordinate(51.445691, 5.460318);
var result = GoogleMapsAPI.GetBounds(Coordinates, 16, 640, 640);
Debug.Log("SouthWest: "+result.SouthWest.ToString() + " NorthEast: "+result.NorthEast.ToString());

输出:

SouthWest: 51.438825, 5.453483 NorthEast: 51.452557, 5.467153

SouthWest 坐标与我自己翻译的 javascript 完全相同。因此,由于 peterjb 在他的回答中声称他的解决方案适用于比利时的某个地区,所以我在同一地区尝试了代码。然而,结果又有点不对劲。

因此,我非常随机地尝试使用尼日利亚一个名为 Kano/Static map 的城镇的计算,令我惊讶的是,西南 Angular 非常准确!

输出:

SouthWest: 12.015251, 8.527824 NorthEast: 12.028983, 8.541404

SouthWest position .

之后,我尝试了世界上其他多个地区,但往往距离很远,有时甚至数百英里。所以也许尼日利亚的这个小镇只是巧合,但我希望有人能为我提供解释和/或解决方案。

特别感谢 peterjbmarcelo

最佳答案

Coordinate 类的构造函数接受 (lng, lat) 而不是您可能期望的 (lat, lng),因此参数的顺序与您传入的顺序不同。

我还注意到 Coordinate 的 ToString 也覆盖打印为 (lng, lat),因此如果您希望看到 (lat, lng) 可能会造成混淆。

只需在静态 API 中交换这两者即可。

关于javascript - 获取 Google Static Maps API 的西南 Angular 和东北 Angular ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37008037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com