Ищете библиотеку Python (кроме ArcPy) для геообработки, такой как буфер? [закрыто]


16

За исключением ArcPy, есть ли какая-либо библиотека python, которая может выполнять геообработку, например, буфер / пересечение, с шейп-файлами?

Ответы:


17

Python GDAL / OGR Cookbook имеет некоторые примеры кода для буфера геометрии .

from osgeo import ogr

wkt = "POINT (1198054.34 648493.09)"
pt = ogr.CreateGeometryFromWkt(wkt)
bufferDistance = 500
poly = pt.Buffer(bufferDistance)
print "%s buffered by %d is %s" % (pt.ExportToWkt(), bufferDistance, poly.ExportToWkt())

и рассчитать пересечение между двумя геометриями

from osgeo import ogr

wkt1 = "POLYGON ((1208064.271243039 624154.6783778917, 1208064.271243039 601260.9785661874, 1231345.9998651114 601260.9785661874, 1231345.9998651114 624154.6783778917, 1208064.271243039 624154.6783778917))"
wkt2 = "POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695, 1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528, 1199915.6662253144 633079.3410163528)))"

poly1 = ogr.CreateGeometryFromWkt(wkt1)
poly2 = ogr.CreateGeometryFromWkt(wkt2)

intersection = poly1.Intersection(poly2)

print intersection.ExportToWkt()

Геометрия может быть прочитана и записана в шейп-файлы и множество других форматов.


14

Для упрощения, Shapely: manual разрешает всю обработку геометрии PostGIS в Python.

Первая предпосылка Shapely заключается в том, что программисты Python должны иметь возможность выполнять геометрические операции типа PostGIS вне СУБД ...

Первый пример PolyGeo

from shapely.geometry import Point, LineString, Polygon, mapping
from shapely.wkt import loads  
pt = Point(1198054.34,648493.09)
# or
pt = loads("POINT (1198054.34 648493.09)")
bufferDistance = 500
poly = pt.buffer(bufferDistance)
print poly.wkt
'POLYGON ((1198554.3400000001000000 648493.0899999999700000, 1198551.9323633362000000 
# GeoJSON
print mapping(poly)
{'type': 'Polygon', 'coordinates': (((1198554.34, 648493.09), (1198551.9323633362, 648444.0814298352), (1198544.7326402017, 648395.544838992), ....}

Пример многоугольника из PolyGeo:

poly1 = Polygon([(1208064.271243039,624154.6783778917), (1208064.271243039,601260.9785661874), (1231345.9998651114,601260.9785661874),(1231345.9998651114,624154.6783778917),(1208064.271243039,624154.6783778917)])    
poly2 = loads("POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695, 1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528, 1199915.6662253144 633079.3410163528)))"

intersection = poly1.intersection(poly2)
print intersection.wkt
print mapping(intersection) -> GeoJSON

Вторая предпосылка заключается в том, что постоянство, сериализация и картографическая проекция объектов являются значительными, но ортогональными проблемами. Вам может не понадобиться сотня читателей и писателей в формате ГИС или множество проекций State Plane, и Shapely не обременяет вас ими.

Таким образом, вы комбинируете его с другими модулями Python для чтения или записи шейп-файлов и управления проекциями как osgeo.ogr, Fiona или PyShp .
Ища в Gis StackExchange, вы можете найти много примеров, но я дам вам еще один, чтобы проиллюстрировать комбинацию shapely и Fiona и использование фигурных функций intersection () и buffer () (это можно было сделать с PyShp).

Даны два полилинии шейп-файлов:

введите описание изображения здесь

Вычислить пересечение (функция пересечения () формы)

from shapely.geometry import Point, Polygon, MultiPolygon, MumtiPoint, MultiLineString,shape, mapping
import fiona
# read the shapefiles and transform to MultilineString shapely geometry (shape())
layer1 = MultiLineString([shape(line['geometry']) for line in fiona.open('polyline1.shp')])  
layer2 = MultiLineString([shape(line['geometry']) for line in fiona.open('polyline2.shp')])
points_intersect = layer1.intersection(layer2)

Сохранить результат как новый шейп-файл

# schema of the new shapefile
schema = {'geometry': 'MultiPoint','properties': {'test': 'int'}}
# write the new shapefile (function mapping() of shapely)
with fiona.open('intersect.shp','w','ESRI Shapefile', schema) as e:
  e.write({'geometry':mapping(points_intersect), 'properties':{'test':1}})

Результат:

введите описание изображения здесь

Буфер отдельных точек (функция buffer () из shapely)

 # new schema
 schema = {'geometry': 'Polygon','properties': {'test': 'int'}}
 with fiona.open('buffer.shp','w','ESRI Shapefile', schema) as e:
     for point in points:
          e.write({'geometry':mapping(point.buffer(300)), 'properties':{'test':1}})

Результат

введите описание изображения здесь

Буфер MultiPoint геометрии

schema = {'geometry': 'MultiPolygon','properties': {'test': 'int'}}
points.buffer(300)
with fiona.open('buffer2.shp','w','ESRI Shapefile', schema) as e:
     e.write({'geometry':mapping(points.buffer(300)), 'properties':{'test':1}})

введите описание изображения здесь


9

Shapely предоставляет Python доступ к GEOS, который может делать буферы / пересечения / и т.д. GEOS - это библиотека, которую большинство программ OSGeo используют для выполнения этих операций.


9

Вот мой список программного обеспечения Python для геообработки.

  • Shapely, питон
  • ОГР, питон
  • QGIS, pyqgis, python
  • СагаГИС, питон
  • Трава, питон
  • пространственный, диспространит, питон
  • PostreSQL / PostGIS, Psycopg, python
  • R Project, rpy2, python
  • Whitebox GAT, Python -GeoScript, Jython

1

Моя библиотека геообработки - «Библиотека дистанционного зондирования и ГИС» (RSGISLib). Его легко установить и использовать, а документация действительно хороша. Он имеет функциональность для векторной и растровой обработки - мне очень редко приходится приближаться к графическому интерфейсу. Его можно найти здесь: http://rsgislib.org .

Пример в этом случае:

rsgislib.vectorutils.buffervector(inputvector, outputvector, bufferDist, force)

Команда для буферизации вектора на указанное расстояние.

Где:

  • inputvector - строка, содержащая имя входного вектора
  • outputvector - строка, содержащая имя выходного вектора
  • bufferDist - это число с плавающей точкой, указывающее расстояние от буфера в единицах карты
  • force - это логическое значение, определяющее, принудительно ли удалять выходной вектор, если он существует

Пример:

from rsgislib import vectorutils
inputVector = './Vectors/injune_p142_stem_locations.shp'
outputVector = './TestOutputs/injune_p142_stem_locations_1mbuffer.shp'
bufferDist = 1
vectorutils.buffervector(inputVector, outputVector, bufferDist, True)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.