Площадь полигона GeoDjango

Я реализовал GeoDjango с помощью postgis.

Вот моя модель:

  ...
  geometria = models.PolygonField(srid=4326, null=True)
  ...

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

Вы можете помочь мне?


person Marco Fedele    schedule 12.11.2012    source источник


Ответы (1)


Если вы имеете дело с большими областями на карте, вы должны установить

geometria = models.PolygonField(srid=4326, null=True, geography=True)

Как указано в документации geodjango https://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#geography

Тип geography В PostGIS 1.5 был введен тип geography — он обеспечивает встроенную поддержку пространственных объектов, представленных географическими координатами (например, долгота/широта WGS84). [7] В отличие от плоскости, используемой типом геометрии, тип географии использует сферическое представление своих данных. Операции по расстоянию и измерению, выполняемые в столбце geography, автоматически используют расчеты по дуге большого круга и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается для двух географических регионов, возвращается значение в метрах (в отличие от градусов при вызове для столбца геометрии в WGS84).

Если у вас нет geography=True, мы храним вещи как простые геометрические фигуры, нам нужно будет выполнить преобразование из square degrees (результат с плавающей запятой, который вы получаете) в единицу измерения, которую вы предпочитаете, потому что мы не можем вычислить площадь по географическим координатам. Вместо этого мы можем добавить вспомогательный метод, который находится в спроецированном координатном пространстве для выполнения преобразования:

def get_acres(self): 
    """ 
    Returns the area in acres. 
    """ 
    # Convert our geographic polygons (in WGS84)
    # into a local projection for New York (here EPSG:32118) 
    self.polygon.transform(32118) 
    meters_sq = self.polygon.area.sq_m

    acres = meters_sq * 0.000247105381 # meters^2 to acres

    return acres

Какой прогноз мы используем, зависит от объема данных и от того, насколько точными нам нужны результаты: здесь я проиллюстрировал конкретный прогноз для части Нью-Йорка, но если ваши данные не особенно точны, вы можете легко заменить глобальную проекцию или просто используйте простую формулу.

person Calvin Cheng    schedule 22.11.2012
comment
self.polygon.area возвращает число с плавающей запятой и поэтому не имеет свойства sq_m - person roob; 11.04.2017