Có nhiều mô-đun để đọc shapefiles trong Python, cũ hơn ArcPy, hãy xem Chỉ số gói Python (PyPi): shapefiles . Ngoài ra còn có nhiều ví dụ trong GIS SE (ví dụ tìm kiếm [Python] Fiona )
Tất cả đều có thể đọc hình học, các trường và các hình chiếu.
Nhưng các mô-đun khác như PySAL: Thư viện phân tích không gian Python , Cartopy (sử dụng pyshp ) hoặc Matplotlib Basemap cũng có thể đọc shapefiles, trong số những thứ khác.
Cách dễ sử dụng nhất là Fiona , nhưng nếu bạn chỉ biết ArcPy, hãy sử dụng pyshp , vì osgeo và Fiona yêu cầu thư viện GDAL C / C ++ phải được cài đặt, GeoPandas cần mô-đun Pandas và PySAL quá lớn (nhiều, rất nhiều cách xử lý khác)
Nếu bạn chỉ muốn đọc nội dung của một shapefile, bạn không cần những thứ phức tạp, chỉ cần sử dụng giao thức giao diện địa lý (GeoJSON) cũng được triển khai trong ArcPy ( ArcPy: AsShape )
Với Fiona (như từ điển 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')])}
Với pyshp (như từ điển 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'}
Với osgeo / ogr (như từ điển 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}
Với GeoPandas (dưới dạng khung dữ liệu 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)
* lưu ý trên geopandas Bạn phải sử dụng các phiên bản cũ hơn của Fiona và GDAL với nó nếu không nó sẽ không được cài đặt. GDAL: 1.11.2 Fiona: 1.6.0 Công viên địa chất: 0.1.0.dev-
Có rất nhiều hướng dẫn trên Web và thậm chí cả sách ( Phát triển không gian địa lý Python , Phân tích không gian địa lý học với Python và Geoprocessing với Python , trên báo chí)
Tổng quát hơn, nếu bạn muốn sử dụng Python mà không có ArcPy, hãy xem ánh xạ chủ đề đơn giản của shapefile bằng Python?