有一段时间需要使用python生成shapefile文件,并且转为kml文件,放到Google earth中展示,中间有过摸索特此记下:
环境搭建
读写shape file需要两个库 gdal 和pyshp,其中gdal我在网上看到需要什么C++编译环境,弄了很久都没有成功,后来直接下载了一个whl文件 自己pip install 安装就行了。下载地址下载完后,把这个文件复制到你的python路径Scripts下 然后直接在路径上cmd 输入命令pip install +你下载的文件名,安装好,在命令行输入:python 进入python环境,import osgeo 没有报错即为安装成功~
读取shapefile文件
我看到的维基百科shapefile文件主要由三部分构成:
Shp:图形格式。一个地形的图片。
shx :图形索引格式。几何体位置索引,记录每一个几何体在shp文件之中的位置,能够加快向前或向后搜索一个几何体的效率
Dbf:属性数据格式,以dBaseIV的数据表格式存储每个几何形状的属性数据
我理解的读取shapefile文件主要是使用dbf里面的数据。
代码:
from osgeo import ogr
importjson
data
= ogr.Open('D:/work/python/Tif_to_png/shp/shape file文件名.shp') #返回一个DataSource对象
layer= data.GetLayer(0) #获得第一层数据(多数Shapefile只有一层)
extent= layer.GetExtent() # 当前图层的地理范围
print(f'the extent of the layer: {extent}')
srs= layer.GetSpatialRef()
print(f'the spatial reference system of
the data: {srs.ExportToPrettyWkt()}')
schema=[] # 当前图层的属性字段
ldefn= layer.GetLayerDefn()
forn in range(ldefn.GetFieldCount()):
fdefn = ldefn.GetFieldDefn(n)
schema.append(fdefn.name)
print(f'the fields of this layer: {schema}')
features=[]
fori in range(layer.GetFeatureCount()):
feature = layer.GetFeature(i)
features.append(json.loads(feature.ExportToJson()))
print(f'the first feature represented with JSON: {features[0]}')
写shapefile文件
写shapefile文件,我主要使用pyshp这个库,安装方式为:为 pip install pyshp
假如提示time out 可以尝试:pip install PyShp -i https://pypi.tuna.tsinghua.edu.cn/simple/
代码如下(已生成多个点为例):
import shapefile #这边导入的名字是shapefile 不是pyshp,别到错了。
w = shapefile.Writer('shapefiles/test/point')
w.field('你的字段名', 'C')
w.point(111,22)
w.record(字段名)
w.close()
我的理解:point是增加数值,而record是在增加关于这个数值的描述,其中w.point和w.record都可以循环执行写入数据。
shapefile转kml文件
这次需要在Linux安装一个gdal,(其实windows应该也可以,就是我还没学会)
安装步骤:
tar xvf gal-2.2.1.tar.gz
cd gdal-2.2.1
sudo ./configure --with-python
Sudo make
Sudo make install
出现ImportError: No module named _gdal错误解决方案:
sudo find / -name gdal.py
把这些路径和自己Linux中python的路径全部加到
sudo gedit /etc/profile这里面 格式为:
Export PYTHONPATH ********路径********* :$PYTHPNPATH
- 执行python命令 进去import osgeo 没有反应就是成功了
把你需要转的shapefile文件放到linux 路径下,一定要记得是三个文件(shp、shx、dbf)!!!
然后在Linux执行命令:
ogr2ogr -f KML 转换后的文件名.kml 转换前的文件名.shp
update一下:写shapefile 可以去看pyshp的官方文档,里面的demo非常详细,也很容易入门。
地址:(https://github.com/GeospatialPython/pyshp#writing-shapefiles)