【问题标题】:How do I get the area of a GeoJSON polygon with Python如何使用 Python 获取 GeoJSON 多边形的面积
【发布时间】:2018-07-27 09:11:17
【问题描述】:

我有 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 显示为

我想用 Python 计算它的面积(87106.33m^2)。我该怎么做?

我尝试了什么

# 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-05233827.03300877335 - 第一个没有任何意义是意料之中的,但是我该如何修复第二个呢? (我不知道如何设置pyproj.Proj init 参数)

我猜epsg:4326 是 WGS84 (source) 是有道理的,但对于 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 - 这与 geojson.io 所说的仍然有 148m^2 不同。为什么会这样?

【问题讨论】:

标签: python geojson pyproj


【解决方案1】:

看起来geojson.io并没有像你一样在将球面坐标投影到平面上之后计算面积,而是直接从WGS84使用特定算法来计算球体表面上多边形的面积坐标。如果你想重新创建它,你可以找到源代码here

如果您愿意继续将坐标投影到平面系统以计算面积,因为它对于您的用例来说已经足够准确,那么您可以尝试使用 this 投影代替德国。例如:

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

【讨论】:

  • 嗯...有一个简单的答案正确的投影是什么? 4326和5243的主要区别是什么?
  • @MartinThoma 对于“正确的投影”没有简单的答案。所有的投影都有不同的属性。这在很大程度上取决于您的具体用例。特别是,许多预测仅在世界某些地区给出准确的值。
  • 这太有趣了!您能否列举两个对柏林的合理预测以及它们相互比较的优势?
猜你喜欢
  • 2020-12-14
  • 2012-03-15
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多