使用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

核心代码:
  1. from osgeo import ogr, osr
  2. import os
  3. def createShpByLayer(shp, layer, fileType):
  4. '''
  5. 根据layer创建shpfile
  6. '''
  7. driver = ogr.GetDriverByName("ESRI Shapefile")
  8. ds = driver.CreateDataSource(shp)
  9. pt_layer = ds.CopyLayer(layer, 'layername')
  10. ds.Destroy()
  11. def splitShp(shpfile, outPath, splitField):
  12. '''
  13. 按属性字段分割shpfile
  14. '''
  15. ds = ogr.Open(shpfile)
  16. lyr = ds.GetLayer(0)
  17. for feat in lyr:
  18. cityName = feat.GetField(splitField) # 以字段名为文件名称
  19. outShp = os.path.join(outPath, str(cityName)+'.shp')
  20. geom = feat.GetGeometryRef()
  21. driver = ogr.GetDriverByName("ESRI Shapefile")
  22. outDs = driver.CreateDataSource(outShp)
  23. outLyr = outDs.CreateLayer("layername", lyr.GetSpatialRef(), ogr.wkbMultiPolygon)
  24. outLyr.CreateFields(lyr.schema) # 创建字段属性
  25. outFeat = ogr.Feature(lyr.GetLayerDefn())
  26. for i in range(feat.GetFieldCount()):
  27. val = feat.GetField(i)
  28. outFeat.SetField(i, val)
  29. outFeat.SetGeometry(geom)
  30. outLyr.CreateFeature(outFeat)
  31. outDs = None
  32. def splitShpByShp(covershp, splitshp, outPath):
  33. '''
  34. @desc: 将一个shp按属性分割后,再用来分割另一个shp(空间查询)
  35. '''
  36. ds = ogr.Open(covershp)
  37. lyr = ds.GetLayer(0)
  38. splitDs = ogr.Open(splitshp)
  39. splitLyr = splitDs.GetLayer(0)
  40. for feat in lyr:
  41. cityName = feat.GetField("NAME") # 以字段名为文件名称
  42. outShp = os.path.join(outPath, str(cityName)+'.shp')
  43. geom = feat.GetGeometryRef()
  44. driver = ogr.GetDriverByName("memory")
  45. outDs = driver.CreateDataSource("temp")
  46. outLyr = outDs.CreateLayer("layername", lyr.GetSpatialRef(), ogr.wkbMultiPolygon)
  47. outLyr.CreateFields(lyr.schema) # 创建字段属性
  48. outFeat = ogr.Feature(lyr.GetLayerDefn())
  49. for i in range(feat.GetFieldCount()):
  50. val = feat.GetField(i)
  51. # val = val.encode('utf8') # 将unicode编码转化为中文,还有点问题
  52. outFeat.SetField(i, val)
  53. outFeat.SetGeometry(geom)
  54. outLyr.CreateFeature(outFeat)
  55. outDs = None
  56. splitLyr.SetSpatialFilter(geom) # 按空间查询
  57. createShpByLayer(outShp, splitLyr, "ESRI Shapefile")
  58. 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. SuperEdge 高可用云边隧道有哪些特点?

    作者 作者李腾飞,腾讯容器技术研发工程师,腾讯云TKE后台研发,SuperEdge核心开发成员. 背景 在边缘集群中,边缘端和云端为单向网络,云端无法主动连接边缘端,常见的解决方案是边缘端主动和云端( ...

  2. 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了

    今天收到运营同学的一个 SQL,有点复杂,尤其是这个 SQL explain 都很长时间执行不出来,于是我们后台团队帮忙解决这个 SQL 问题,却正好发现了一个隐藏很深的线上问题. select a. ...

  3. FreeRTOS-05-队列

    说明 本文仅作为学习FreeRTOS的记录文档,作为初学者肯定很多理解不对甚至错误的地方,望网友指正. FreeRTOS是一个RTOS(实时操作系统)系统,支持抢占式.合作式和时间片调度.适用于微处理 ...

  4. 【Mongodb】数据库备份与还原

    Mongodb 备份与还原 Mongodb 备份与还原 文件快照 快照备份 快照直接还原 从压缩文件还原 复制文件 备份文件 从文件还原 mongodump mongodump备份 mongodump ...

  5. Solon 1.5.24 发布

    本次版本主要变化: 修复 solon.extend.sessionstate.jwt 在特定场景下会无限次解析的问题 优化 solon.extend.cors 对头信息的处理 插件 solon.boo ...

  6. awk-07-IO和printf语句

    IO语句 1.getline 2.getline var 把a文件的行,追加到b文件的结尾 把 a 文件的行替换 b 文件的指定字段 把 a 文件的行替换 b 文件的对应字段 3.command | ...

  7. 过去,我买漫画看;现在,我用Python爬虫来看

    原标题:运用Python多线程爬虫下载漫画 前言: 以前,我都是买漫画书看的,那个时候没有电脑.今天,我到网上看了一下,发现网上提供漫画看,但是时时需要网络啊!为什么不将它下载下来呢!  1.怎样实现 ...

  8. pikachu 不安全的url跳转

    不安全的url跳转问题可能发生在一切执行了url地址跳转的地方.如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生&q ...

  9. Skywalking-07:OAL原理——解释器实现

    OAL 解释器实现 OAL 解释器是基于 Antlr4 实现的,我们先来了解下 Antlr4 Antlr4 基本介绍 Antlr4 使用案例 参考Antlr4的使用简介这篇文章,我们实现了一个简单的案 ...

  10. CPU 指令环 ring0,ring1,ring2,ring3

    Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3. Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用.如果 ...