Как преобразовать километры в градусы в Geodjango / GEOS?

Я использую метод "buffer" из API GEOS для создания круга на основе точки и радиуса в GeoDjango, согласно этому ответу:GeoDjango: как создать круг на основе точки и радиуса

Как отметил один комментатор, вам придется преобразовать радиус в КМ в градусы... но как? Я думаю, это быстрая формула, но для меня она греческая. Я был бы благодарен за любые советы.

4 ответов


ответ может зависеть от местоположения на земле. Вблизи экватора 1 км будет равняться примерно 0,008 градуса (1 км / 40 000 км * 360 градусов) широты и долготы, но вблизи полюсов 1 км будет равняться примерно 0,008 градуса широты, но может быть много много градусов долготы. (Если вы находитесь в 1 км от полюса, 1 км путешествия "Запад" принесет вам примерно 57 градусов долготы на Запад.)

но, если API просто хочет градусов по большому кругу в качестве измерения, возможно, было бы достаточно использовать (N КМ / 40,000 км * 360 градусов). По крайней мере, 40,000 км "достаточно хорошо для меня" :) более точные цифры доступны.


1 град лат составляет около 110,567 км на экваторе до 111,699 км на полюсах.

этой link может быть вам интересно. Преобразование основано на окружности деления земли на 360 градусов.

1 град длиной также приблизительно 111 км на экваторе и - > 0, когда вы идете к полюсам.


буфер в GEOS django API создаст буфер, используя любые единицы, которые использует ваша текущая система координат.

Если вы храните все в 4326 (в лат/длинных градусах), то вам придется найти какой-то сложный способ преобразования км в градусы. Но теперь ваш буфер будет сильно искажен, чем больше вы пойдете на север.

лучшим решением является перепроектирование геометрии в проекцию, которая поддерживает область, и часто такая проекция может отслеживать единицы измерения в метрах.

например, если вы создаете буферизованные области в Северной Америке, вы можете использовать эту проекцию, которая использует meters http://spatialreference.org/ref/sr-org/7314/

вот пример того, как это сделать с помощью Django GEOS API:

    from django.contrib.gis.geos import Point

    # Defines a point in lat/long
    p = Point(-70, 50) 

    # This projection defines lat/long coordinate system
    p.srid = 4326 

    # Transform into the 7314 projection using the OGC WKT format to define that projection
    p.transform('PROJCS["NA Lambert Azimuthal Equal Area",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["false_easting",0.0],PARAMETER["false_northing",0.0],PARAMETER["longitude_of_center",-100.0],PARAMETER["latitude_of_center",45.0],UNIT["meter",1.0]]')

    # Creates a buffered polygon of 1000 meters in radius
    poly = p.buffer(1000)

расстояние = степень * PI * диаметр / 360

используя грубая оценка радиуса Земли 6378 км

1 градус @ на экваторе или вдоль долготы: 111.317 км

1 градус вдоль широты на латутиде степени КС: (Градусы * PI * диаметр / 360) * cos (широта)

Так @ 60 широте: 55 659 м в направлении долготы.