【问题标题】:How to get a bounding box from one cartesian coordinate?如何从一个笛卡尔坐标中获得边界框?
【发布时间】:2015-09-07 17:33:50
【问题描述】:

我正在尝试仅从 1 个坐标(纬度、经度)获取 javascript 中的边界框坐标,然后我可以将其用作 OSM Nominatin API 中的视图框。

对于红点,如何获得地球上任何地区/国家的绿点? (例如 0.15 的原始差异):

for (x,y) will be: (x-2,y+2), (x+2,y-2)?


function get_bounce(lat, lng) { // y,x
    // x-0.15,y+0.15
    //          x,y
    //               x+0.15,y-0.15
    var lng1 = lng - 0.15;
    var lat1 = lat + 0.15;
    var lng2 = lng + 0.15;
    var lat2 = lat - 0.15;
    return [lat1,lng1,lat2,lng2];
}

提前致谢!

【问题讨论】:

  • 不应该是:for (x, y) => (x-2, y-2), (x+2, y+2) 吗?使用上面的代码,您将获得右上角和左下角,但我想您需要左上角和右下角??
  • 请不要在标题中包含标签。
  • @philipp:但是 y-2 会给你一个底部纬度(?)
  • 不要修复 delta-lat 和 delta-long(位移)。当您在地球上的不同区域移动时,覆盖范围会有所不同。
  • 您提供了一个代码示例,但没有说明它的问题所在。你得到了什么?你能指望什么?您是否正在寻找一个完全垂直的边界框?您要考虑沿赤道和子午线的边界吗?

标签: javascript bounding-box


【解决方案1】:

1 度经度距离根据您所在的纬度而有所不同,如评论中所述。经度在赤道处较宽,在两极处变窄,这与在全球范围内具有恒定大小的纬度不同。要可视化这一点,请参阅:

Visualize the globe

另一个对我有帮助的好参考是:

Calculate distance, bearing and more between Latitude/Longitude points

我遇到了类似的问题。这是我想出的代码来获得一个非常好的边界框。给这个函数一个 gps 位置字符串 ("x.xx, y.yy") 和 "radius" 以公里为单位,它会为边界框生成北、南、东、西十进制坐标。这是在 Java 中,但应该很容易转换为另一种语言。

    // Compute bounding Box coordinates for use with Geonames API.
    class BoundingBox
    {
        public double north, south, east, west;
        public BoundingBox(String location, float km)
        {
            //System.out.println(location + " : "+ km);
            String[] parts = location.replaceAll("\\s","").split(","); //remove spaces and split on ,

            double lat = Double.parseDouble(parts[0]);
            double lng = Double.parseDouble(parts[1]);

            double adjust = .008983112; // 1km in degrees at equator.
            //adjust = 0.008983152770714983; // 1km in degrees at equator.

            //System.out.println("deg: "+(1.0/40075.017)*360.0);


            north = lat + ( km * adjust);
            south = lat - ( km * adjust);

            double lngRatio = 1/Math.cos(Math.toRadians(lat)); //ratio for lng size
            //System.out.println("lngRatio: "+lngRatio);

            east = lng + (km * adjust) * lngRatio;
            west = lng - (km * adjust) * lngRatio;
        }

    }

上面的代码给出了一个很好的近似值,根据您的纬度,可能会偏离一英里或两英里。如果你想更准确,那么你可以看看这里的答案:

Geotools: bounding box for a buffer in wgs84 请参阅 Eduardo 对此问题的回答。这似乎是一个非常准确的解决方案。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多