使用Python构建GeoJSON

15

我想动态生成一个包含可变数量多边形的geoJSON。以下是2个多边形的示例:

{
    "type": "FeatureCollection", 
    "features": [
      {"geometry": {
          "type": "GeometryCollection", 
          "geometries": [
              {
                  "type": "Polygon", 
                  "coordinates": 
                      [[11.0878902207, 45.1602390564],
                       [0.8251953125, 41.0986328125], 
                       [7.63671875, 48.96484375], 
                       [15.01953125, 48.1298828125]]
              }, 
              {
                  "type": "Polygon", 
                  "coordinates": 
                      [[11.0878902207, 45.1602390564], 
                       [14.931640625, 40.9228515625], 
                       [11.0878902207, 45.1602390564]]
              }
          ]
      }, 
      "type": "Feature", 
      "properties": {}}
    ]
}

我有一个函数,可以为每个多边形提供坐标列表,因此我可以创建多边形列表,然后使用for循环迭代以构建geoJSON。

问题在于我不知道如何轻松做到这一点(例如,我考虑将列表作为字符串返回,但是将geoJSON构建为字符串似乎是个不好的想法)。

有人建议我使用这个非常“Pythonic”的想法:

geo_json = [ {"type": "Feature",,
              "geometry": {
                  "type": "Point",
                  "coordinates": [lon, lat] }}
              for lon, lat in zip(ListOfLong,ListOfLat) ] 

但是由于我正在添加可变数量的多边形而不是点列表,因此这种解决方案似乎不太适合。或者至少我不知道该如何进行调整。

我可以将其构建为字符串,但我希望以更智能的方式实现。你有什么想法吗?

3个回答

32

有一个名为python-geojson的库(https://github.com/frewsxcv/python-geojson),它似乎可以使这个任务变得更加容易。以下是该库页面上的示例:

>>> from geojson import Polygon

>>> Polygon([[(2.38, 57.322), (23.194, -20.28), (-120.43, 19.15), (2.38,   57.322)]])  
{"coordinates": [[[2.3..., 57.32...], [23.19..., -20.2...], [-120.4..., 19.1...]]], "type": "Polygon"}

2
这个答案非常好,而且提到了(许多人没有提到的)如何正确创建一个带有两个括号的多边形。至少,如果你想直接在QGIS中读取你的文件,这似乎是必要的。 - William Abma

11
如果您能成功安装库,Django将提供一些处理几何对象的好工具,这些对象有一个"geojson"属性,可以让您访问对象的GeoJSON表示:https://docs.djangoproject.com/en/2.0/ref/contrib/gis/install/
>>> from django.contrib.gis.geos import Polygon, Point, MultiPoint, GeometryCollection
>>>
>>> poly = Polygon( ((0, 0), (0, 1), (1, 1), (0, 0)) )
>>> gc = GeometryCollection(Point(0, 0), MultiPoint(Point(0, 0), Point(1, 1)), poly)
>>> gc.geojson
u'{ "type": "GeometryCollection", "geometries": [ { "type": "Point", "coordinates": [ 0.0, 0.0 ] }, { "type": "MultiPoint", "coordinates": [ [ 0.0, 0.0 ], [ 1.0, 1.0 ] ] }, { "type": "Polygon", "coordinates": [ [ [ 0.0, 0.0 ], [ 0.0, 1.0 ], [ 1.0, 1.0 ], [ 0.0, 0.0 ] ] ] } ] }'

GeometryCollection也可以接受一个几何对象列表:

>>> polys = []
>>> for i in range(5):
...     poly = Polygon( ((0, 0), (0, 1), (1, 1), (0, 0)) )
...     polys.append(poly)
...
>>> gc = GeometryCollection(polys)

更新于2019年:

shapely现在可以通过shapely-geojson使用,因为它不需要django,可能更容易引入。


这种方法存在一个问题:我不知道每次调用会创建多少个多边形。就我所研究的,无法创建空的GeometryCollection。我该怎么办? - Roman Rdgz
只需将您的多边形转储到列表中,并将其提供给GeometryCollection。 - monkut
我尝试使用多边形列表来填充GeometryCollection,但是它没有起作用。如果我使用第一个多边形创建GeometryCollection,然后添加其余的多边形,它可以工作,但看起来很丑。我接受你的答案,但如果可能,请提供使用列表填充的示例。 - Roman Rdgz
请查看更新,其中展示了使用列表polys创建GeometryCollection()的过程。 - monkut
1
链接已损坏。 - Martin Thoma

10
  1. 既然您已经知道如何构造一个point,那么构造一个polygon对象就很相似了。
  2. 您可以使用json.dumps将Python对象转换为字符串。

类似这样:

geos = []
for longs,lats in LongLatList
    poly = {
        'type': 'Polygon',
        'coordinates': [[lon,lat] for lon,lat in zip(longs,lats) ]
    }
    geos.append(poly)

geometries = {
    'type': 'FeatureCollection',
    'features': geos,
}

geo_str = json.dumps(geometries) // import json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接