【问题标题】:Given a latitude and longitude, and distance, I want to find a bounding box给定经纬度和距离,我想找到一个边界框
【发布时间】:2010-12-11 13:24:45
【问题描述】:

给定纬度和经度以及距离,我想找到一个距离小于给定距离的边界框。

这个问题是在这里问的:How to calculate the bounding box for a given lat/lng location?

我不希望这个特别准确,所以我将其修改并简化为

def boundingBox(latitudeInDegrees, longitudeInDegrees, halfSideInKm):
    lat = math.radians(latitudeInDegrees)
    lon = math.radians(longitudeInDegrees)
    halfSide = 1000*halfSideInKm

    RADIUS_OF_EARTH  = 6371
    # Radius of the parallel at given latitude
    pradius = radius*math.cos(lat)

    latMin = lat - halfSide/radius
    latMax = lat + halfSide/radius
    lonMin = lon - halfSide/pradius
    lonMax = lon + halfSide/pradius
    rad2deg = math.degrees
    return (rad2deg(latMin), rad2deg(lonMin), rad2deg(latMax), rad2deg(lonMax))

但我无法理解这是如何工作的,尤其是这条线对我来说毫无意义halfSide = 1000*halfSideInKm

【问题讨论】:

  • 发布的代码不适用于远距离或两极附近。
  • Nicolai: 只希望它在短距离内工作,所以可以假设一个平坦的地球等。同样对于经度比较,我们正在做一个pradius 除法,所以它没有考虑到附近的变化两极?
  • halfSideInKm 是不是到点的距离?你能解释一下这里要带什么吗?

标签: python geocoding bounding-box


【解决方案1】:

这段代码不太好用,它在 KM 和 M 之间跳转。

修复代码,使名称更具 PEP8 风格,并添加了一个简单的框对象:

class BoundingBox(object):
    def __init__(self, *args, **kwargs):
        self.lat_min = None
        self.lon_min = None
        self.lat_max = None
        self.lon_max = None


def get_bounding_box(latitude_in_degrees, longitude_in_degrees, half_side_in_miles):
    assert half_side_in_miles > 0
    assert latitude_in_degrees >= -90.0 and latitude_in_degrees  <= 90.0
    assert longitude_in_degrees >= -180.0 and longitude_in_degrees <= 180.0

    half_side_in_km = half_side_in_miles * 1.609344
    lat = math.radians(latitude_in_degrees)
    lon = math.radians(longitude_in_degrees)

    radius  = 6371
    # Radius of the parallel at given latitude
    parallel_radius = radius*math.cos(lat)

    lat_min = lat - half_side_in_km/radius
    lat_max = lat + half_side_in_km/radius
    lon_min = lon - half_side_in_km/parallel_radius
    lon_max = lon + half_side_in_km/parallel_radius
    rad2deg = math.degrees

    box = BoundingBox()
    box.lat_min = rad2deg(lat_min)
    box.lon_min = rad2deg(lon_min)
    box.lat_max = rad2deg(lat_max)
    box.lon_max = rad2deg(lon_max)

    return (box)

【讨论】:

  • 这非常有效。谢谢你。一个问题:half_side_in_miles 是什么?我该如何计算?我搜索了内部网络,但一无所获。
  • 顺便说一句,第二个assert 不正确。纬度范围从 -90° 到 90°,而不是 -180° 到 180°。
【解决方案2】:

那条线正在将边界框单位从公里转换为米。

【讨论】:

  • 呵呵.. 很明显你提到了它,但是latMin = lat - halfSide/radius 似乎是错误的。 1Km != 1000/6371 纬度距离,因为纬度每变化 1 度,距离变化约 110 公里。
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多