Как получить площадь полигона GeoJSON с помощью Python

1

У меня есть GeoJSON

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [[13.65374516425911, 52.38533382814119], [13.65239769133293, 52.38675829106993], [13.64970274383571, 52.38675829106993], [13.64835527090953, 52.38533382814119], [13.64970274383571, 52.38390931824483], [13.65239769133293, 52.38390931824483], [13.65374516425911, 52.38533382814119]]
        ]
      }
    }
  ]
}

которые http://geojson.io отображает как

Изображение 174551

Я хотел бы вычислить его область (87106.33m ^ 2) с Python. Как я могу это сделать?

Что я пробовал

# core modules
from functools import partial

# 3rd pary modules
from shapely.geometry import Polygon
from shapely.ops import transform
import pyproj

l = [[13.65374516425911, 52.38533382814119, 0.0], [13.65239769133293, 52.38675829106993, 0.0], [13.64970274383571, 52.38675829106993, 0.0], [13.64835527090953, 52.38533382814119, 0.0], [13.64970274383571, 52.38390931824483, 0.0], [13.65239769133293, 52.38390931824483, 0.0], [13.65374516425911, 52.38533382814119, 0.0]]
polygon = Polygon(l)

print(polygon.area)
proj = partial(pyproj.transform, pyproj.Proj(init='epsg:4326'),
                   pyproj.Proj(init='epsg:3857'))
print(transform(proj, polygon).area)

Он дает 1.1516745933889345e-05 и 233827.03300877335 - что первый не имеет никакого смысла, как ожидается, но как мне исправить второй? (Я не знаю, как установить параметр pyproj.Proj init)

Я думаю, что epsg:4326 имеет смысл, это WGS84 (источник), но для epsg: 3857 Я не уверен.

Лучшие результаты

Следующее намного ближе:

# core modules
from functools import partial

# 3rd pary modules
import pyproj
from shapely.geometry import Polygon
import shapely.ops as ops

l = [[13.65374516425911, 52.38533382814119, 0],
     [13.65239769133293, 52.38675829106993, 0],
     [13.64970274383571, 52.38675829106993, 0],
     [13.64835527090953, 52.38533382814119, 0],
     [13.64970274383571, 52.38390931824483, 0],
     [13.65239769133293, 52.38390931824483, 0],
     [13.65374516425911, 52.38533382814119, 0]]
polygon = Polygon(l)

print(polygon.area)
geom_area = ops.transform(
    partial(
        pyproj.transform,
        pyproj.Proj(init='EPSG:4326'),
        pyproj.Proj(
            proj='aea',
            lat1=polygon.bounds[1],
            lat2=polygon.bounds[3])),
    polygon)
print(geom_area.area)

он дает 87254.7m ^ 2 - это все еще 148m ^ 2, отличное от того, что geojson.io говорит. Почему это так?

  • 0
    Поскольку Web Mercator не сохраняет области: geography.hunter.cuny.edu/~jochen/GTECH361/lectures/lecture04/… . Добро пожаловать на карту проекций. Ваш вопрос лучше подходит для географических информационных систем (в вашем коде нет ничего плохого, только в выборе проекции.) И лучше определиться с неправильным значением для данной области. А вот ссылка на фактическую проекцию 3857; тот, на который вы ссылаетесь, является чем-то другим.
Теги:
geojson
pyproj

1 ответ

1

Похоже, что geojson.io не вычисляет площадь после проецирования сферических координат на плоскость, как вы, а использует конкретный алгоритм вычисления площади многоугольника на поверхности сферы, непосредственно из координат WGS84. Если вы хотите, чтобы воссоздать его можно найти исходный код здесь.

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

from osgeo import ogr
from osgeo import osr

source = osr.SpatialReference()
source.ImportFromEPSG(4326)

target = osr.SpatialReference()
target.ImportFromEPSG(5243)

transform = osr.CoordinateTransformation(source, target)

poly = ogr.CreateGeometryFromJson(str(geoJSON['features'][0]['geometry']))
poly.Transform(transform)
poly.GetArea()

который возвращает 87127.2534625642

  • 0
    Хм ... Есть простой ответ, что такое правильная проекция? Каковы основные различия между 4326 и 5243?
  • 1
    @MartinThoma Нет такого понятия, как простой ответ на «правильную проекцию». Все проекции имеют разные свойства. Это очень зависит от вашего конкретного случая использования. В частности, многие прогнозы дают точные значения только в определенных районах мира.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню