Создайте полигон из Geojson как текст, используя Python - PullRequest
0 голосов
/ 29 октября 2018

У меня есть лист Excel, в котором один из столбцов содержит координаты многоугольника или многоугольника в виде текста (строки) в формате геоджон, например:

{"type":"MultiPolygon","coordinates":[[[[-53.66244258911961,-29.75558936798518],[-53.66447927551047,-29.75479744502596],[-53.66497701215211,-29.75466967800058],[-53.66539668737831,-29.75517848699731],[-53.66526854910706,-29.75591361056259],[-53.6650635542948,-29.75612467174048],[-53.66486858286636,-29.75644981903961],[-53.66515127770877,-29.7567909579031],[-53.66564072778738,-29.75715257050725],[-53.66631831510097,-29.756760797715],[-53.66578289093859,-29.75598035821501],[-53.66541811733386,-29.75603526880071],[-53.66529349652963,-29.75593510161232],[-53.66541328395244,-29.75517097017889],[-53.66671211596781,-29.75478047547476],[-53.66745257013564,-29.75488704546076],[-53.6675639628448,-29.75500945384272],[-53.66746725317702,-29.75519780225035],[-53.66759379828195,-29.75570701689554],[-53.66769689961644,-29.75583061630008],[-53.66785408698414,-29.75582761347013],[-53.66801872670045,-29.75593573710897],[-53.66830156112037,-29.75632351955843],[-53.66845877777294,-29.75639540596585],[-53.66937831773524,-29.75797111875023],[-53.66873635482919,-29.75818647714824],[-53.66872702211081,-29.75904729569487],[-53.66718029195727,-29.7594060497663],[-53.666981289892,-29.75860798657777],[-53.66558159318289,-29.75794062686812],[-53.66427767673421,-29.7567105113694],[-53.66244258911961,-29.75558936798518]]]]}

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

Мой сценарий:

for i,j,k in zip(account_names,field_ids,geojsons):

    g = [x.buffer(0) for x in shape(json.loads(k)).buffer(0).geoms]
    print i
    [x.buffer(0) for x in shape(json.loads(k)).buffer(0).geoms]
    print ("multipolygon")
    # Now convert it to a shapefile with OGR    
    driver = ogr.GetDriverByName('geojson')
    ds = driver.CreateDataSource('George_Vellidis_2.geojson')
    layer = ds.CreateLayer('', None, ogr.wkbPolygon)
    # Add one attribute
    layer.CreateField(ogr.FieldDefn('id', ogr.OFTInteger))
    defn = layer.GetLayerDefn()
    #loop thru the polygons
    for i in range(len(g)):
        # Create a new feature (attribute and geometry)
        feat = ogr.Feature(defn)
        feat.SetField('id', i+1)

        # Make a geometry, from Shapely object
        geom = ogr.CreateGeometryFromWkb(g[i].wkb)
        feat.SetGeometry(geom)
        layer.CreateFeature(feat)

ds = layer = feat = geom = None

где i, j и k - списки, которые содержат имя учетной записи, идентификатор поля и геоджон в качестве текста, соответственно. Мне нужно имя учетной записи и идентификатор поля, чтобы знать, как назвать выходной файл. K - это список, в котором содержится текст, подобный тому, который я упомянул выше. Все мои многоугольники "type":"MultiPolygon", даже если некоторые из них содержат только один многоугольник. Когда я запускаю этот скрипт, нет проблем с полигонами, которые содержат несколько функций. Однако, когда полигон содержит только одну особенность, я получаю:

WKTReadingError                           Traceback (most recent call last)
<ipython-input-15-e617adc70e95> in <module>()
      1 import shapely.wkt
      2 
----> 3 P = shapely.wkt.loads(k)
      4 print(P)

C:\Users\Ran\Anaconda2\lib\site-packages\shapely\wkt.pyc in loads(data)
      8 def loads(data):
      9     """Load a geometry from a WKT string."""
---> 10     return geos.WKTReader(geos.lgeos).read(data)
     11 
     12 def load(fp):

C:\Users\Ran\Anaconda2\lib\site-packages\shapely\geos.pyc in read(self, text)
    252         if not geom:
    253             raise WKTReadingError(
--> 254                 "Could not create geometry because of errors "
    255                 "while reading input.")
    256         # avoid circular import dependency

WKTReadingError: Could not create geometry because of errors while reading input.

Что мешает читать полигоны с одной функцией?

...