java shp求相交面积_shp文件自相交处理的方法
原標題: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文件自相交处理的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上龙虎榜的条件
- 下一篇: 2021年碳中和概念龙头股 关注这些上