2013-06-04 4 views
4

Я хочу генерировать динамически geoJSON с переменным количеством полигонов. Пример 2 многоугольников:Создание GeoJSON с Python

{ 
       "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": {}} 
       ] 
} 

У меня есть функция, которая дает мне список координат для каждого полигона, так что я могу создать список полигонов, так что я смог построить GeoJSON итерации его для цикла ,

Проблема в том, что я не вижу, как это сделать легко (я думал, например, возвращать список как строку, но построение geoJSON в виде строки выглядит плохой идеей).

Я предложил это очень вещую идею:

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

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

Я мог бы построить его как строку, но я хотел бы сделать это умнее. Есть идеи?

ответ

4

Если вы можете получить установлены библиотеки, Джанго имеет некоторые хорошие инструменты для работы с геометрическими объектами, и эти объекты имеют атрибут geojson, что дает вам доступ к представлению GeoJSON объекта:

https://docs.djangoproject.com/en/1.5/ref/contrib/gis/install/#installation

>>> 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) 
+0

Существует одна проблема с этим подходом: я не знаю, сколько полигонов будет создано для каждого вызова. Насколько я исследовал GeometryCollection, нельзя создать пустым. Что мне делать? –

+0

просто сбрасывайте свои полигоны в списке и подавайте его в GeometryCollection. – monkut

+0

Я попытался передать GeometryCollection список полигонов, но это не сработало. Он работает, если я создаю GeometryCollection с первым полигоном, а затем добавлю остальные, но выглядит уродливым. Я принимаю ваш ответ, но, пожалуйста, предоставьте и пример того, как подавать список, если вы можете –

5
  1. Поскольку вы уже знаете, как построить point, это очень похоже на построение polygon объекта.
  2. можно использовать json.dumps для преобразования объекта питона в строку

Что-то вроде:

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 
8

Существует библиотека питон-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"} 
Смежные вопросы