Arabellek gibi coğrafi işlemler için Python kütüphanesi (ArcPy dışında) mı arıyorsunuz? [kapalı]


Yanıtlar:


17

Python GDAL / OGR Cookbook için bazı örnek kodu vardır Tampon Geometri .

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())

ve İki Geometri arasındaki kesişimin hesaplanması

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()

Geometriler şekil dosyalarına ve diğer çeşitli formatlara okunabilir ve yazılabilir .


14

, Basitleştirmek için düzgün: Manuel Python PostGIS arasında işlem tüm geometrisini verir.

Shapely'nin ilk önceliği, Python programcılarının bir RDBMS dışında PostGIS tipi geometri işlemlerini yapabilmesi gerektiğidir ...

PolyGeo'nun ilk örneği

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), ....}

Polygon'un poligon örneği:

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

İkinci öneri, özelliklerin kalıcılığı, serileştirilmesi ve harita projeksiyonunun önemli fakat dik problemler olmasıdır. Yüz CBS formatında okuyucuya ve yazarlara ya da çok sayıda Devlet Uçağı projeksiyonuna ihtiyacınız olmayabilir ve Shapely size bunlarla yükümlü değildir.

Böylece şekil dosyalarını okumak veya yazmak ve osgeo.ogr, Fiona veya PyShp gibi projeksiyonları değiştirmek için diğer Python modülleriyle birleştirirsiniz .
Gis StackExchange'te arama yaparken birçok örnek bulabilirsiniz, ancak size düzgün ve Fiona kombinasyonunu ve düzgün işlevlerin kesişme () ve buffer () kullanımını göstermek için başka bir örnek verdim (Bu PyShp ile yapılabilirdi).

İki çoklu çizgi şekli dosyası verilir:

resim açıklamasını buraya girin

Düzgün kesişim (işlev kesişimi ())

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)

Sonucu yeni bir şekil dosyası olarak kaydedin

# 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}})

Sonuç:

resim açıklamasını buraya girin

Tek tek noktaları (işlev tamponu () düzgün şekilde) tamponlar

 # 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}})

Sonuç

resim açıklamasını buraya girin

MultiPoint geometrisini arabelleğe alma

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}})

resim açıklamasını buraya girin


9

Düzgün için piton erişim sağlar GEOS vb / tamponlar / intersects yapabilirsiniz. GEOS, çoğu OSGeo programının bu işlemleri gerçekleştirmek için kullandığı kütüphanedir.


9

İşte Python coğrafi işleme yazılımı listem.

  • Şekilli, python
  • OGR, python
  • QGIS, pyqgis, python
  • SagaGIS, python
  • Çim, piton
  • mekansal, pyspatialit, piton
  • PostreSQL / PostGIS, Psycopg, python
  • R Projesi, rpy2, python
  • Whitebox GAT, python -GeoScript, jython

1

'Git' coğrafi işlem kütüphanem 'Uzaktan Algılama ve GIS Kütüphanesi'dir (RSGISLib). Kurulumu ve kullanımı kolaydır ve belgeler gerçekten iyidir. Vektör ve raster işleme için işlevselliğe sahiptir - çok nadiren bir GUI'ye gitmem gerekiyor. Burada bulunabilir: http://rsgislib.org .

Bu örnekte bir örnek:

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

Bir vektörü belirtilen mesafeye arabelleğe alma komutu.

Nerede:

  • inputvector, girdi vektörünün adını içeren bir dizedir
  • outputvector, çıktı vektörünün adını içeren bir dizedir
  • bufferDist, ara birimin arabellek mesafesini belirten bir şamandıradır
  • force bir bool olup çıktı vektörünün var ise kaldırılmasının zorlanıp zorlanmayacağını belirtir

Misal:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.