使用ogr裁剪矢量数据

由来:

​ 近期有个需求,内容是这样的:我们有两个矢量数据,现在要求以一个矢量文件为底板,按字段对另一个矢量文件进行分割,生成若干小的shpfile文件

分析:

​ 经过分析之后,将步骤拆解如下:

  1. 首先确保两个shpfile投影坐标系统一

    ​ 如果出现不统一的情况,那么用Arcgis的工具Project进行投影转换。(Data Management Tools--Projections and Transformations--Project),链接如下https://www.sohu.com/a/292487012_488161。

  2. 其次编写按属性字段分割shpfile,生成若干小shpfile的代码

  3. 接着编写根据layer创建shpfile的代码(https://www.cnblogs.com/bobird/articles/3079523.html)-->使用ogr中拷贝方法创建新的shpfile

  4. 最后进行循环,对每次生成的shpfile和原先的shpfile进行空间查询,得到layer后生成需要的shpfile

核心代码:
from osgeo import ogr, osr
import os def createShpByLayer(shp, layer, fileType):
'''
根据layer创建shpfile
'''
driver = ogr.GetDriverByName("ESRI Shapefile")
ds = driver.CreateDataSource(shp)
pt_layer = ds.CopyLayer(layer, 'layername')
ds.Destroy() def splitShp(shpfile, outPath, splitField):
'''
按属性字段分割shpfile
'''
ds = ogr.Open(shpfile)
lyr = ds.GetLayer(0)
for feat in lyr:
cityName = feat.GetField(splitField) # 以字段名为文件名称
outShp = os.path.join(outPath, str(cityName)+'.shp')
geom = feat.GetGeometryRef()
driver = ogr.GetDriverByName("ESRI Shapefile")
outDs = driver.CreateDataSource(outShp)
outLyr = outDs.CreateLayer("layername", lyr.GetSpatialRef(), ogr.wkbMultiPolygon)
outLyr.CreateFields(lyr.schema) # 创建字段属性
outFeat = ogr.Feature(lyr.GetLayerDefn())
for i in range(feat.GetFieldCount()):
val = feat.GetField(i)
outFeat.SetField(i, val)
outFeat.SetGeometry(geom)
outLyr.CreateFeature(outFeat)
outDs = None def splitShpByShp(covershp, splitshp, outPath):
'''
@desc: 将一个shp按属性分割后,再用来分割另一个shp(空间查询)
'''
ds = ogr.Open(covershp)
lyr = ds.GetLayer(0)
splitDs = ogr.Open(splitshp)
splitLyr = splitDs.GetLayer(0)
for feat in lyr:
cityName = feat.GetField("NAME") # 以字段名为文件名称
outShp = os.path.join(outPath, str(cityName)+'.shp')
geom = feat.GetGeometryRef()
driver = ogr.GetDriverByName("memory")
outDs = driver.CreateDataSource("temp")
outLyr = outDs.CreateLayer("layername", lyr.GetSpatialRef(), ogr.wkbMultiPolygon)
outLyr.CreateFields(lyr.schema) # 创建字段属性
outFeat = ogr.Feature(lyr.GetLayerDefn())
for i in range(feat.GetFieldCount()):
val = feat.GetField(i)
# val = val.encode('utf8') # 将unicode编码转化为中文,还有点问题
outFeat.SetField(i, val)
outFeat.SetGeometry(geom)
outLyr.CreateFeature(outFeat)
outDs = None splitLyr.SetSpatialFilter(geom) # 按空间查询
createShpByLayer(outShp, splitLyr, "ESRI Shapefile")
print("按空间查询的要素数量:"+ str(splitLyr.GetFeatureCount()))
不足之处
  1. 转出来的shpfile属性字段中,中文部分乱码,目前未能解决。

使用ogr裁剪矢量数据的更多相关文章

  1. ArcGIS超级工具SPTOOLS-按属性裁剪,矢量数据批量裁剪,矢量数据批量合库

    1.1  按属性裁剪 操作视频: https://weibo.com/tv/v/HwaZRoosq?fid=1034:4376687438183117 按属性裁剪:可以图形表,也可以是非图形表,字段值 ...

  2. GDAL python教程(1)——用OGR读写矢量数据

    本教程的讲义和源码都是取自Utah State University的openGIS课程 相关资料,包括讲义.源码.数据样例,请从此处下载http://www.gis.usu.edu/~chrisg/ ...

  3. gdal中文路径无法打开问题

    在C#中使用OGR读写矢量数据时,需要引用“using OSGeo.OGR;”. 同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下: //为了支持中文路径,请添加下面这句代码(大多 ...

  4. Python与开源GIS

    https://www.osgeo.cn/pygis/ 这里列出了与 GIS 相关的 Python 开源类库与工具. 基础类库(抽象库) • GDAL/OGR 是大部分开源GIS的基础,也包括如Arc ...

  5. ogr ogr2ogr 矢量数据格式转换 ogrinfo 矢量数据图层信息操作 ogr gdal的一部分 gdal 命令行 库操作

  6. ARCGIS多种影像裁剪

    在互联网上下载的遥感影像都进行过分幅处理,下载下来的影像多是规则的四方形,而在进行遥感影像研究时,多是针对特定区域来进行,比如研究北京市的遥感影像,不在北京市范围内的影像对于研究者就没有利用意义,如果 ...

  7. Python中使用面状矢量裁剪栅格影像,并依据Value值更改矢量属性

    本文整体思路:在Python中使用Geopandas库,依次读取shp文件的每一个面状要素,获取其空间边界信息并裁剪对应的栅格影像,计算所裁剪影像Value值的众数,将其设置为对应面状要素的NewTY ...

  8. TerraGate SFS 4.5 版本 发布矢量数据使用的Cache数据如何再返回成shapefile文件

    TerraGate SFS 4.5 版本 发布矢量数据使用的Cache数据如何再返回成shapefile文件? 两年前帮一个朋友解决过这个问题: 如果原来用4.5版本的时候,在网络环境下,为了提升调用 ...

  9. ENVI裁剪

    一.basic tools-->resize data进行规则裁剪 虽然是进行图像重采样工具,但也可以用于简单快速的裁剪 1. 选中要裁剪的图像: 对话框下面选择spatial subset(构 ...

随机推荐

  1. DC-8 靶机渗透测试

    DC-8 渗透测试 冲冲冲 ,好好学习 . 核心:cms上传添加存在漏洞组件,利用该组件getshell 操作机:kali 172.66.66.129 靶机:DC-4 172.66.66.137 网络 ...

  2. C语言复习(二)

    引言: 不会将每一个部分都详述,只关注于一些自己认为重要的或常错的,若有不足,还望指出 switch()细节:括号内必须是整型或枚举类型:遇到break才会跳出:case包含的必须是常量 contin ...

  3. 实战 | Hive 数据倾斜问题定位排查及解决

    Hive 数据倾斜怎么发现,怎么定位,怎么解决 多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例.当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措 ...

  4. linux之frp服务部署(内网穿透)

    frp服务部署(内网穿透) 目的 更快的进行内网穿透调试以及云端开发测试 服务器为CentOS 7,客户端为win11 frp介绍 frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 ...

  5. 洛谷P1377题解

    题面 首先他叫我们建一颗笛卡尔树,所以我们就建一颗笛卡尔树. 然后他说要生成序列中最小的.想到笛卡尔树的一条性质:左<根<右.但是根节点必须先插进去.他的两个儿子用贪心的思想就知道是先选左 ...

  6. 离线webpack创建vue 项目

    参考地址: https://blog.csdn.net/feinifi/article/details/104578546 画重点: // 需要带上参数--offline表示离线初始化. --offl ...

  7. Spring学习笔记-Hello Spring

    实现原理 采用XML方式配置Bean的时候,Bean的定义和实现分离的,采用注解的方式可以将两者合为一体,Bean的定义信息直接以注解形式定义在实现类中,从而实现了零配置. 控制反转是一种通过描述(X ...

  8. Java基础——类型转换注意事项及常见问题

    类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用类型转换 低------------------------------------------------------------ ...

  9. NOIP 模拟 $20\; \rm 玩具$

    题解 \(by\;zj\varphi\) 一道概率与期望好题 对于一棵树,去掉根后所有子树就是一个森林,同理,一个森林加一个根就是一棵树 设 \(f_{i,j}\) 为有 \(i\) 个点的树,高度为 ...

  10. vue 报错http://eslint.org/docs/rules/xxxxx

    vue 对语法的要求过于严格所以编译的时候报下面这个错误 解决办法: bulid文件夹 -> webpack.base.conf.js 找到下面的代码: module: { rules: [ / ...