У меня есть лист 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.
Что мешает читать полигоны с одной функцией?