Учитывая широту, долготу и расстояние, я хочу найти ограничивающую рамку

Учитывая широту, долготу и расстояние, я хочу найти ограничивающую рамку, где расстояния меньше заданного расстояния.

Эти вопросы были заданы здесь: Как рассчитать ограничивающую рамку для заданного местоположения широты / долготы?

Я не хочу, чтобы это было отчасти точным, поэтому я изменил и упростил его до

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


person agiliq    schedule 30.10.2009    source источник
comment
Опубликованный код не работает на больших расстояниях или вблизи полюсов.   -  person Nikolai Ruhe    schedule 30.10.2009
comment
Николай: Я хочу, чтобы он работал только на коротких расстояниях, поэтому можно предположить, что Земля плоская и т. Д. Также для сравнения долготы мы делаем деление pradius, поэтому не учитывается ли изменение вблизи полюсов?   -  person agiliq    schedule 30.10.2009
comment
halfSideInKm - это расстояние от точки или нет? Можете объяснить, что здесь взять?   -  person Seenu S    schedule 06.06.2016


Ответы (2)


Эта линия преобразует единицы ограничивающего прямоугольника из километров в метры.

person Dominic Rodger    schedule 30.10.2009
comment
Хех ... теперь очевидно, что вы упомянули об этом, но тогда latMin = lat - halfSide/radius кажется неправильным. 1 км! = Расстояние по широте 1000/6371, поскольку изменение широты на 1 градус составляет изменение расстояния на ~ 110 км. - person agiliq; 30.10.2009

Этот код не совсем сработал, он перескакивает между 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)
person Ted    schedule 18.08.2011
comment
Это сработало отлично. Спасибо. Один вопрос: что такое half_side_in_miles? Как мне это рассчитать? Я поискал в Интернете и ничего не нашел. - person tmthyjames; 29.05.2015
comment
Кстати, 2-й assert неверен. Широта колеблется от -90 ° до 90 °, а не от -180 ° до 180 °. - person PM 2Ring; 25.03.2016