原标题:shp文件自相交处理的方法

今天基于GDAL使用shp文件对栅格影像进行裁剪时出现了下面的问题,提示多边形自相交了

Warning1: RingSelf-intersectionatornearpoint112 .4866642030000334 .830899357000078

ERROR1: Cutlinepolygonisinvalid.

很多人的第一反应是使用ArcGIS进行拓扑检查,或使用ArcToolBox里的修复几何。确实我的第一反应也是去做这些东西。但是结果却没有检查出任务拓扑错误,几何修复也没有检查出问题。

使用ArcGIS检查不到的原因

强大的ArcGIS居然检查不到,最终找到了这个原因。

在ArcGIS 中无论是拓扑、shapefile文件、还是个人地理数据库都是设置有容差的,小于这个容差的自相交,都是无法检测到的。

解决方案

查阅了很多资料,最终整理了如下的解决方案。

1.使用PostGIS将shape文件导入Postgresql数据库,记得导入的时候要勾选下面的选项。

2.从表里提取出自相交的多边形

CREATETABLEtemp1 asselect* fromm2 whereST_IsValid(geom) = false

3.删除原表中的自相交图形

delete fromm2 whereST_IsValid( geom)= false

4.修复多边形

updatetemp1 setgeom =ST_Buffer(geom, 0.0)

-- update temp1 set geom =ST_MakeValid(geom) 也可以

5.修复完的数据恢复到原来的表

insertintom2 select* fromtemp1

6.最后通过PostGIS插件导出shp文件即可

结果检测

使用gdal对结果进行检测

fromosgeo importogr

shpFile = 'F:/m2.shp'# 裁剪矩形

# # # 注册所有的驱动ogr.RegisterAll

defcheck_shp:# 打开数据ds = ogr.Open(shpFile, 0)ifds isNone:print( "打开文件【%s】失败!", shpFile)returnprint( "打开文件【%s】成功!", shpFile)# 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个m_layer_count = ds.GetLayerCountm_layer = ds.GetLayerByIndex( 0)ifm_layer isNone:print( "获取第%d个图层失败!n", 0)return# 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空m_layer.ResetReadingcount = 0m_feature = m_layer.GetNextFeaturewhilem_feature isnotNone:o_geometry = m_feature.GetGeometryRefifnotogr.Geometry.IsValid(o_geometry):print(m_feature.GetFID)count = count + 1

m_feature = m_layer.GetNextFeatureprint( "无效多边形共"+ str(count) + "个")

check_shp

运行结果

本文作者:GIS无情老博士

java shp求相交面积_shp文件自相交处理的方法相关推荐

  1. java海伦公式求三角形面积_海伦公式求三角形面积出错求教

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 就下面这个程序 输入其他的数字都可以算出面积 但是当输入3,4,6时 计算出面积为零 求吧友指出错误在哪 package javaapplication1 ...

  2. java多态 求形状面积_JAVA多态计算面积main函数调用方法

    public static void main(String[] args) { Shape shape; Scanner input = new Scanner(System.in); System ...

  3. Java查询spark中生成的文件,spark原代码生成方法

    其实关于这个问题在Spark的官网www.igniterealtime.org上有很详尽的介绍,因此本文大部分内容是从英文文档引用而来的,其中还有一些个人的经验. Spark源代码:下载地址 想了解更 ...

  4. geany java编译器乱码_Ubuntu Geany打开文件乱码的解决方法

    Geany是Ubuntu下一款很不错的文本编辑工具和开发工具,但美中不足的是使用Geany打开非UTF-8编码的简体中文文件时,一般显示乱码,查看看属性会发现Geany对于中文文件是按照ISO8859 ...

  5. java 逐行读写文件_用Java逐行读取和写入大文件的最快方法

    小编典典 我怀疑您的真正问题是您的硬件有限,而您所做的只是软件不会带来太大变化.如果您有足够的内存和CPU,可以使用更高级的技巧,但是如果由于文件未缓存而仅在硬盘上等待,则不会有太大的不同. BTW: ...

  6. java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...

  7. java spring mvc 上传_Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) 下载文件代码 @RequestMapping("/file/{name.rp}") public Respo ...

  8. java求小于n的素数_java_Java实现求小于n的质数的3种方法,质数概念 质数,又称素数, - phpStudy...

    Java实现求小于n的质数的3种方法 质数概念 质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为只有1和本身两个因数的数). 最小的素数是2,也是素 ...

  9. java获取扩展名_Java获取文件扩展名称

    有时在处理文件时,需要根据文件类型对它们进行不同的处理. java.io.File没有任何获取文件扩展名的方法,这里提供了一个实用工具方法来获取文件扩展名. Java获取文件扩展名 在句点(.)之后, ...

最新文章

  1. php 500 内部服务器错误,php 500 - 内部服务器错误的解决方法
  2. 如何删除VS2015中的OpenCV的配置
  3. OpenAtom Pika 来了!
  4. python获取app信息的库_Python学习教程:另辟蹊径,appium抓取app应用数据了解一下...
  5. C#调用C++编写的COM DLL
  6. int main ( int argc, char** argv )的说明
  7. 数据结构乐智教学百度云_数据结构 百度网盘分享
  8. edius隐藏快捷键_超级实用的edius常用快捷键
  9. 【辅助开发】游戏辅助开发全流程-golang
  10. MAC dmg转ISO 及命令安装启动U盘
  11. 小学计算机教师面试试题及答案,2019上半年小学信息技术教师资格证面试试题及答案(精选)第一批...
  12. C#——NPOI对Excel的操作、导入导出时异常处理(二)
  13. 航程门业:如何选购实木复合门及如何保养
  14. uniapp框架如何实现仿微信相册 | 图视频过滤、相册选择功能
  15. 人间不正经生活语录(一)
  16. 微信版梦幻西游手游连接不上服务器,梦幻西游手游
  17. STM32F1与STM32CubeIDE编程实例-磁簧开关(Reed Switch)驱动
  18. SMART200PLC与ABB变频器实现MODBUS RTU通讯
  19. PE钢丝网骨架管的性能优势
  20. 质量管理知识点大盘点(之二)

热门文章

  1. linux搭建交换机日志,用LINUX的SYSLOG做交换机、路由器的日志服务器
  2. 目标检测特殊层:ROI Align层详解
  3. Linux驱动编程 step-by-step (二) 简单字符设备驱动
  4. Python开发以太坊智能合约指南(web3.py)
  5. Solidworks公司电脑图纸被加密之后如何解密输出
  6. L2R 三:常用工具包介绍之 XGBoost与LightGBM
  7. java-HTMLjavaSkcriptCSSjQueryajax
  8. OO真经——关于面向对象的哲学体系及科学体系的探讨(下)
  9. Layer 父子页面之间的交互
  10. html5学习笔记(audio)