使用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. swagger json导出word,Typora软件推荐!!!

    场景: 前几天项目验收,赶了一整天补API接口设计文档,给爷整吐了.周末的时候就想能不能直接把swagger的json文件导出成word? 顺便学习一下NPOI的使用. 实现思路: 1.先把swaag ...

  2. spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

    参考 文章https://blog.csdn.net/weixin_41438728/article/details/110425174 影响版本 Spring Framework 5.0 to 5. ...

  3. 大数据学习(11)—— Hive元数据服务模式搭建

    这一篇介绍Hive的安装及操作.版本是Hive3.1.2. 调整部署节点 在Hadoop篇里,我用了5台虚拟机来搭建集群,但是我的电脑只有8G内存,虚拟机启动之后卡到没法操作,把自己坑惨了. Hive ...

  4. window.location.href下载文件,文件名中文乱码处理

    下载文件方法: window.location.href='http://www.baidu.com/down/downFile.txt?name=资源文件'; 这种情况下载时:文件名资源文件会中文乱 ...

  5. 【Android】真机调试新姿势:无线连接

    由于工作需要,需要无线连接手机调试,特意百度了一下 在进行Android开发时,一般我们都是用usb线把手机和电脑连接起来进行调试工作.但如果你觉得这样不够酷的话,可以尝试一下无线连接,颇简单,GO! ...

  6. 一、Ocelot简单概述

    以下只是本人学习过程的整理 Ocelot官网:http://threemammals.com/ocelot 说明文档:https://ocelot.readthedocs.io/en/latest/ ...

  7. eslint+prettier+husky+lint-staged 统一前端代码规范

    eslint+prettier+husky+lint-staged 统一前端代码规范 遵循编码规范和使用语法检测,可以很好的提高代码的可读性,可维护性,并有效的减少一些编码错误. 1.终极目标 团队中 ...

  8. 浅谈C#取消令牌CancellationTokenSource

    前言 相信大家在使用C#进行开发的时候,特别是使用异步的场景,多多少少会接触到CancellationTokenSource.看名字就知道它和取消异步任务相关的,而且一看便知大名鼎鼎的Cancella ...

  9. Send Excerpts from Jenkins Console Output as Email Contents

    Sometimes we need to send some excerpts from Jenkins console output (job logs) as email, such as tes ...

  10. springboot项目出现Whitelabel Error Page的问题

    springboot项目出现Whitelabel Error Page的问题 大概就是这种情况,然而昨天还是没问题的,通过对比就发现,是自己手欠了 简单来说解决办法就是将springboot的启动项目 ...