计算距中心点x平方英里的坐标?


11

我正在尝试围绕一个中心点创建一个ax mile正方形(或圆形),该正方形的所有边都将从中心x英里。我需要4个角坐标。

它正在争先恐后地想让我的大脑转弯吗?我可以使用Haversine公式计算出两点之间的距离,但是数学严重不是我的强项,而且我不了解sin,cos等。尝试解决这一问题使我迷失了!

我遇到过计算距点X英里的纬度/经度吗?但是我不明白!

有人会以苹果和梨的方式来解释我如何做到这一点吗?

确切地解释我想做什么;

我有一个网站,用户可以在其中搜索特定区域的建筑物。他们将进入城镇或地方(我会知道这是最长的时间),并在距该地方10英里的特定半径内进行搜索。

我需要找到10英里半径的最小/最大纬度和经度,以便可以使用类似于以下内容的where子句查询数据库:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

我需要某种配方!

我的座标是十进制度

Answers:


10

为此,简单的近似就足够了。 北或南,一度约为69英里,但东或西,仅69 * cos(纬度)英里。由于纬度在十英里范围内变化不大,因此可以安全地使用“正方形”中心纬度的余弦值。因此,距离中心位置(f,l)r英里处的正方形顶点的所需坐标为latlon,计算如下:

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

例如,假设r = 10英里,中心位置在北纬50度,西经1度,则(f,l)=(50,-1)度。然后

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

当您从正方形的西南角开始顺时针行进时,坐标为(49.855,-1.225),(50.145,-1.225),(50.145,-0.775)和(49.855,-0.775)。

不要在极点附近或侧面大于几度的正方形上使用此近似值。另外,根据GIS的局限性,可能需要注意全球经度切割,通常在+ -180度处进行。


4

取中心的X坐标,并从中减去x英里,这是正方形的左侧。然后取中心的Y坐标,并从中减去X英里,这是正方形的底部。重复这些步骤,但要加法而不是减法以获得右手边和上边缘。现在,您可以构建正方形的四个角。

请注意,以上假设您的中心点是英里。如果不是,则首先对其重新投影。否则,所有赌注都将关闭,您的平方将不会是平方。


您是否在参考示例页面?如何从坐标中减去英里,并且不需要考虑地球的曲率?
Bex

不,它是如此简单,实际上并不需要一个可行的示例。也许您需要指定使用的软件?正如我所说的,我的解决方案假定您已将坐标投影到本地SRS(如果尚未投影,那么这应该是您的第一个问题)
伊恩·特顿

我现在真的很困惑!我更新了我的问题,以确切地说出我要做什么。我有点需要创建一个边界框,以便可以找到最小和最大纬度和经度。
Bex

3
proj4js(proj4js.org)应该会帮助
Ian Turton

1
我的坐标看起来像这样:51.498485,-0.129089那是度数吗?
Bex

4

最后我的答案是:(在C#中)

我可能不需要这4个坐标,但我认为它们相当准确。

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

编辑

刚刚意识到,如果将正方形的角点设置为距中心点x英里,则正方形的边缘将不会是相同的x英里。(说数学不是我的强项)因此,如果我想让正方形的边缘达到x英里,则要获得拐角点到中心点的距离,我用毕达哥拉斯定理求出对角线的距离。(在直角三角形上,斜边的正方形(对角线)等于其他两个边的正方形)


那不会是正方形。
伊恩·特顿

我已经修改了轴承,是钻石。.现在是正方形
Bex

关于编辑,勾股定理适用于小正方形,但通常不适用于球形直角三角形。奇怪的是,您的代码将球面三角函数与基于平面几何的这种近似一起使用。
ub

我的距离永远不会超过100英里,所以我认为这无关紧要。由于距离越短,误差越小。
Bex

1
我认为@whuber的意思是,假设您随后将这些与勾股定理相结合,那么使用复杂的Lat和Long距离计算就没有任何好处。取而代之的是,您可以使用更简单的计算方法,例如whuber或Ewan Todd。使用简单的线性公式将经度转换为英里,将纬度转换为英里,反之亦然。唯一的“棘手”部分是,* cos(lat)将度数转换为英里时以及/ cos(lat)将英里数转换为度数时,都需要调整经度公式。
制造商史蒂夫

0

如果您使用的是空间感知型数据库,则可以将感兴趣的区域转换为存储数据的相同坐标系,然后进行“苹果与苹果”比较。

例如:

  1. 用户选择一个位置,导致经度/纬度。
  2. 要求空间数据库将该点转换为适合该区域的投影坐标系(英尺或米等单位)。
  3. 在预计点周围建立您感兴趣的区域。
  4. 要求空间数据库将该关注区域转换回纬度/经度。
  5. 做任何您需要做的比较。

0

我使用了此页面中的内容

给定目标点距起点的距离和方位

公式:
lat2 = asin(sin(lat1)* cos(d / R)+ cos(lat1)* sin(d / R)* cos(θ))
lon2 = lon1 + atan2(sin(θ)* sin(d / R)* cos(lat1),cos(d / R)-sin(lat1)* sin(lat2))

θ是方位角(以弧度为单位,从北向顺时针方向);d / R是角距离(以弧度为单位),其中d是行进的距离,R是地球半径

对于θ,我为-“左上点”使用-45度(以弧度为单位),为“右下”使用135度

(我最近在数学网站上问了同样的问题)


该解决方案的问题是,您首先必须找出正方形对角线的距离。相反,沿着大地测量学从中心到边的中点移动,然后旋转90度,以沿着正方形的边移动会更容易。
ub

@whuber,如果距离足够小,您不能使用简单的三角函数吗?(d =相对侧/ sin(相邻侧)。之所以这样做,是因为我不需要该距离是精确的。否则,您可以应用此公式两次以完全按照您的要求进行操作(首先使用θ= 0,然后使用θ = -90用于上左例如)

没错,胡安。但是,一个人想知道为什么在开始时假设欧几里得公式首先会起作用,所以为什么要使用更复杂的球面几何公式。使用球形公式并没有错,但是这是不必要的,并且计算效率低下。
ub

@whuber,在第二种情况下,它不是近似值(每边两次应用公式)。您是对的,尽管将它们混合起来没有任何意义。其实,我有这个实现的,但我会改变它(哦,原因是因为我不是那种擅长数学:))
胡安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.