มีโมดูลจำนวนมากเพื่อ shapefiles อ่านในหลาม, เก่ากว่า ArcPy, ดูที่มีเชปไฟล์: งูหลามแพ็คเกจดัชนี (PyPi) นอกจากนี้ยังมีตัวอย่างมากมายใน GIS SE (ค้นหา[Python] Fionaเป็นต้น)
ทุกคนสามารถอ่านรูปทรงเรขาคณิตฟิลด์และเส้นโครง
แต่โมดูลอื่น ๆ เช่นPySAL: Python Spatial Analysis Library , Cartopy (ซึ่งใช้pyshp ) หรือMatplotlib Basemapยังสามารถอ่าน shapefiles เหนือสิ่งอื่นใด
วิธีที่ง่ายที่สุดในการใช้คือFionaแต่ถ้าคุณรู้จัก ArcPy ให้ใช้pyshpเนื่องจากosgeoและFionaต้องการให้ติดตั้งไลบรารีGDAL C / C ++, GeoPandasต้องการโมดูลPandasและPySALมีขนาดใหญ่เกินไป (การรักษาอื่น ๆ อีกมากมาย)
หากคุณเพียงต้องการอ่านเนื้อหาของ shapefile คุณไม่ต้องการสิ่งที่ซับซ้อนเพียงใช้โปรโตคอลอินเตอร์เฟสทางภูมิศาสตร์ (GeoJSON) ที่ใช้ใน ArcPy ( ArcPy: AsShape )
ด้วย Fiona (เหมือนพจนานุกรม Python):
import fiona
with fiona.open('a_shape.shp') as shp:
# schema of the shapefile
print shp.schema
{'geometry': 'Point', 'properties': OrderedDict([(u'DIP', 'int:2'), (u'DIP_DIR', 'int:3'), (u'TYPE', 'str:10')])}
# projection
print shp.crs
{u'lon_0': 4.367486666666666, u'ellps': u'intl', u'y_0': 5400088.438, u'no_defs': True, u'proj': u'lcc', u'x_0': 150000.013, u'units': u'm', u'lat_2': 49.8333339, u'lat_1': 51.16666723333333, u'lat_0': 90}
for feature in shp:
print feature
{'geometry': {'type': 'Point', 'coordinates': (272070.600041, 155389.38792)}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([(u'DIP', 30), (u'DIP_DIR', 130), (u'TYPE', u'incl')])}
{'geometry': {'type': 'Point', 'coordinates': (271066.032148, 154475.631377)}, 'type': 'Feature', 'id': '1', 'properties': OrderedDict([(u'DIP', 55), (u'DIP_DIR', 145), (u'TYPE', u'incl')])}
{'geometry': {'type': 'Point', 'coordinates': (273481.498868, 153923.492988)}, 'type': 'Feature', 'id': '2', 'properties': OrderedDict([(u'DIP', 40), (u'DIP_DIR', 155), (u'TYPE', u'incl')])}
ด้วย pyshp (เป็นพจนานุกรม Python)
import shapefile
reader= shapefile.Reader("a_shape.shp")
# schema of the shapefile
print dict((d[0],d[1:]) for d in reader.fields[1:])
{'DIP_DIR': ['N', 3, 0], 'DIP': ['N', 2, 0], 'TYPE': ['C', 10, 0]}
fields = [field[0] for field in reader.fields[1:]]
for feature in reader.shapeRecords():
geom = feature.shape.__geo_interface__
atr = dict(zip(fields, feature.record))
print geom, atr
{'type': 'Point', 'coordinates': (272070.600041, 155389.38792)} {'DIP_DIR': 130, 'DIP': 30, 'TYPE': 'incl'}
{'type': 'Point', 'coordinates': (271066.032148, 154475.631377)} {'DIP_DIR': 145, 'DIP': 55, 'TYPE': 'incl'}
{'type': 'Point', 'coordinates': (273481.498868, 153923.492988)} {'DIP_DIR': 155, 'DIP': 40, 'TYPE': 'incl'}
ด้วย osgeo / ogr (ในฐานะพจนานุกรม Python)
from osgeo import ogr
reader = ogr.Open("a_shape.shp")
layer = reader.GetLayer(0)
for i in range(layer.GetFeatureCount()):
feature = layer.GetFeature(i)
print feature.ExportToJson()
{"geometry": {"type": "Point", "coordinates": [272070.60004, 155389.38792]}, "type": "Feature", "properties": {"DIP_DIR": 130, "DIP": 30, "TYPE": "incl"}, "id": 0}
{"geometry": {"type": "Point", "coordinates": [271066.032148, 154475.631377]}, "type": "Feature", "properties": {"DIP_DIR": 145, "DIP": 55, "TYPE": "incl"}, "id": 1}
{"geometry": {"type": "Point", "coordinates": [273481.49887, 153923.492988]}, "type": "Feature", "properties": {"DIP_DIR": 155, "DIP": 40, "TYPE": "incl"}, "id": 2}
ด้วย GeoPandas (เป็นดาต้าดาต้าของ Pandas)
import geopandas as gp
shp = gp.GeoDataFrame.from_file('a_shape.shp')
print shp
DIP_DIR DIP TYPE geometry
0 130 30 incl POINT (272070.600041 155389.38792)
1 145 55 incl POINT (271066.032148 154475.631377)
2 155 40 incl POINT (273481.498868 153923.492988)
* หมายเหตุเกี่ยวกับ geopandas คุณต้องใช้เวอร์ชันเก่าของ Fiona และ GDAL ด้วยหรือไม่ติดตั้ง GDAL: 1.11.2 Fiona: 1.6.0 Geopandas: 0.1.0.dev-
มีบทเรียนมากมายบนเว็บและแม้กระทั่งหนังสือ ( การพัฒนา Python Geospatial , การเรียนรู้การวิเคราะห์เชิงพื้นที่ด้วย Pythonและการประมวลผลทางภูมิศาสตร์กับ Pythonในการกด)
โดยทั่วไปหากคุณต้องการใช้ Python โดยไม่ต้องใช้ ArcPy ให้ดูที่การแมปไฟล์แบบง่าย ๆ เฉพาะเรื่องของ shapefile โดยใช้ Python