Хорошо известный двоичный файл является хорошим двоичным форматом обмена, который можно обменивать с большим количеством программного обеспечения ГИС, включая Shapely и GDAL / OGR.
Это крошечный пример рабочего процесса с osgeo.ogr
:
from osgeo import ogr
from shapely.geometry import Polygon
# Here's an example Shapely geometry
poly = Polygon([(0, 0), (0, 1), (1, 1), (0, 0)])
# Now convert it to a shapefile with OGR
driver = ogr.GetDriverByName('Esri Shapefile')
ds = driver.CreateDataSource('my.shp')
layer = ds.CreateLayer('', None, ogr.wkbPolygon)
# Add one attribute
layer.CreateField(ogr.FieldDefn('id', ogr.OFTInteger))
defn = layer.GetLayerDefn()
## If there are multiple geometries, put the "for" loop here
# Create a new feature (attribute and geometry)
feat = ogr.Feature(defn)
feat.SetField('id', 123)
# Make a geometry, from Shapely object
geom = ogr.CreateGeometryFromWkb(poly.wkb)
feat.SetGeometry(geom)
layer.CreateFeature(feat)
feat = geom = None # destroy these
# Save and close everything
ds = layer = feat = geom = None
Обновление : хотя автор принял ответ GDAL / OGR, вот эквивалент Fiona :
from shapely.geometry import mapping, Polygon
import fiona
# Here's an example Shapely geometry
poly = Polygon([(0, 0), (0, 1), (1, 1), (0, 0)])
# Define a polygon feature geometry with one attribute
schema = {
'geometry': 'Polygon',
'properties': {'id': 'int'},
}
# Write a new Shapefile
with fiona.open('my_shp2.shp', 'w', 'ESRI Shapefile', schema) as c:
## If there are multiple geometries, put the "for" loop here
c.write({
'geometry': mapping(poly),
'properties': {'id': 123},
})
(Обратите внимание, пользователи Windows: у вас нет оправданий )
Я разработал Фиона, чтобы хорошо работать с Шейпли. Вот очень простой пример их совместного использования для «очистки» функций шейп-файлов:
С https://github.com/Toblerity/Fiona/blob/master/examples/with-shapely.py .
источник
Вы также можете написать геометрию Shapely с помощью PyShp (поскольку оригинальный постер также спрашивал о PyShp).
Одним из способов было бы преобразовать вашу геометрическую форму в geojson (с помощью метода shapely.geometry.mapping), а затем использовать мой модифицированный форк PyShp, который предоставляет метод Writer, который принимает словари геометрии geojson при записи в шейп-файл.
Если вы предпочитаете основную версию PyShp, я также предоставил функцию преобразования ниже:
Просто скопируйте и вставьте функцию в свой собственный скрипт и вызовите ее, чтобы преобразовать любую из ваших геометрических фигур в pyshp-совместимую форму. Чтобы сохранить их, вы просто добавляете каждую результирующую форму pyshp в список ._shapes экземпляра shapefile.Writer (пример см. В тестовом скрипте внизу этого поста).
Тем не менее, обратите внимание: функция НЕ будет обрабатывать любые внутренние многоугольные отверстия, если они есть, она просто игнорирует их. Конечно, возможно добавить эту функциональность в функцию, но я просто еще не потрудился. Предложения или изменения для улучшения функции приветствуются :)
Вот полный тестовый скрипт:
источник
Ответ Карима довольно старый, но я использовал его код и хотел поблагодарить его за это. Одна небольшая вещь, которую я понял, используя его код: если тип фигуры Polygon или Multipolygon, он все равно может иметь несколько частей (отверстия внутри). Поэтому часть его кода должна быть изменена на
источник