2011-01-04 8 views
5

I (: http://pubs.usgs.gov/ds/425/ buradan) bir ESRI şekil dosyası var. Verilen bir enlem/boylamda şekil dosyasından (bu durumda da sörf malzemesi) bilgi aramak için python kullanmak istiyorum.Bir ESRI şekil dosyasında belirli enlem/boylamda arama bilgileri için python nasıl kullanılır?

bu sorunu çözme hakkında gitmek için en iyi yolu nedir?

Teşekkürler.

Final çözüm:

#!/usr/bin/python 

from osgeo import ogr, osr 

dataset = ogr.Open('./USGS_DS_425_SHAPES/Surficial_materials.shp') 
layer = dataset.GetLayerByIndex(0) 
layer.ResetReading() 

# Location for New Orleans: 29.98 N, -90.25 E 
point = ogr.CreateGeometryFromWkt("POINT(-90.25 29.98)") 

# Transform the point into the specified coordinate system from WGS84 
spatialRef = osr.SpatialReference() 
spatialRef.ImportFromEPSG(4326) 
coordTransform = osr.CoordinateTransformation(
     spatialRef, layer.GetSpatialRef()) 

point.Transform(coordTransform) 

for feature in layer: 
    if feature.GetGeometryRef().Contains(point): 
     break 

for i in range(feature.GetFieldCount()): 
    print feature.GetField(i) 
+0

ardından Last'ta eşleşme olarak ele alınacaktır (ve alanlar yazdırılır). Ben ayrı değişken 'matched_feature' ilan edip hemen' break' önce kendisine atamak, daha sonra yerine 'feature' değişken –

cevap

2

Sen gdal/ogr araç için piton bağlamaları kullanabilirsiniz.

from osgeo import ogr 

ds = ogr.Open("somelayer.shp") 
lyr = ds.GetLayerByName("somelayer") 
lyr.ResetReading() 

point = ogr.CreateGeometryFromWkt("POINT(4 5)") 

for feat in lyr: 
    geom = feat.GetGeometryRef() 
    if geom.Contains(point): 
     sm = feat.GetField(feat.GetFieldIndex("surface_material")) 
     # do stuff... 
+0

Teşekkürler, bu çözüme bakacağım. – arkottke

+0

Noktayı belirlerken bazı zorluklar yaşıyorum çünkü enlem/boylamtan şekil dosyası tarafından kullanılan referans sisteme bir koordinat dönüşümü olması gerekiyor. Bunun, gdal araç setinde bir yerlerde olduğunu sanıyorum, ama onu bulamıyorum ... henüz. – arkottke

+0

osgeo.osr.SpatialReference ve geom.Transform() 'a (IIRC) bakın. Örneği yarın güncelleyeceğim (afk) – albertov

3

Ödeme Python Shapefile Library

Bu geometri ve farklı bilgi vermelidir.

+0

Evet, sağlar geometrinin sonraki döngü için kullanabilirsiniz, ancak bu yeteneği sağlamaz ediyorum Bir noktanın belirtilen bir geometride olup olmadığını görmek için. – arkottke

2

Diğer bir seçenek düzgün ve Fiona (GEOS, PostGIS için motor dayalı bir Python kütüphanesi) kullanmaktır (okuma için temelde/yazma dosya):

import fiona 
import shapely 

with fiona.open("path/to/shapefile.shp") as fiona_collection: 

    # In this case, we'll assume the shapefile only has one record/layer (e.g., the shapefile 
    # is just for the borders of a single country, etc.). 
    shapefile_record = fiona_collection.next() 

    # Use Shapely to create the polygon 
    shape = shapely.geometry.asShape(shapefile_record['geometry']) 

    point = shapely.geometry.Point(32.398516, -39.754028) # longitude, latitude 

    # Alternative: if point.within(shape) 
    if shape.contains(point): 
     print "Found shape for point." 

İşte bir örnek Poligon büyük/karmaşık ise (örn., Son derece düzensiz kıyı çizgileri olan bazı ülkeler için şekil dosyaları), nokta-in-poligon testlerinin yapılabileceğini unutmayın. Bazı durumlarda daha yoğun testini yapmadan önce hızla şeyler ekarte etmek sınırlayıcı kutuları kullanmaya yardımcı olur: ne yazık ki (

minx, miny, maxx, maxy = shape.bounds 
bounding_box = shapely.geometry.box(minx, miny, maxx, maxy) 

if bounding_box.contains(point): 
    ... 

Son olarak, yük ve büyük/düzensiz shapefiles ayrıştırmak için biraz zaman alır unutmayın, Bu tür poligonlar da hafızada tutmak için pahalıdırlar). nokta `features` hiçbirinde bulunamazsa

+0

teşekkürler [Fiona] (https://pypi.python.org/pypi/Fiona) bu büyük bir paket gibi görünüyor. – arkottke

İlgili konular