Если вы имеете дело с большими областями на карте, вы должны установить
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