矢量數(shù)據(jù)在數(shù)據(jù)采集過程中由于數(shù)據(jù)處理導(dǎo)致出現(xiàn)局部狹窄的面狀部分,如下圖
1. 定義和解決方法
狹長結(jié)構(gòu)是指圖斑幾何形態(tài)上窄而長的部分,符號化后出現(xiàn)圖形粘連壓蓋現(xiàn)象,導(dǎo)致難以在圖面上清晰地表達出來。因此,依據(jù)地圖表達比例尺因素需要對狹長結(jié)構(gòu)進行融解處理。在遙感影像提取的地物圖斑中,既存在單個圖斑整體上呈現(xiàn)狹長形態(tài),也存在圖斑的局部結(jié)構(gòu)呈狹長狀分布。針對圖斑狹長結(jié)構(gòu)的探測與一致性處理問題已經(jīng)引起相關(guān)學(xué)者的注意,并提出了相應(yīng)的算法模型。例如,艾廷華等人利用約束德勞奈(Delaunay)三角網(wǎng)提取狹長圖斑的骨架結(jié)構(gòu),結(jié)合 空間上的全覆蓋、無重疊特點,設(shè)計了狹長圖斑的無縫剖分與一致性融解方法。 相關(guān)學(xué)者對 狹長圖斑提取的骨架線進行修正,優(yōu)化狹長圖斑區(qū) 域的剖分結(jié)構(gòu)與融解結(jié)果。 江寶得等人運用Delaunay三角網(wǎng)對圖斑局部狹長結(jié)構(gòu)進行分析探測,并建立了專門的一致性剖分策略。
1. 歷史判斷方法
使用圖斑的周長/面積<0.5便是狹長圖斑
但是上述方法存在一定的問題,沒有嚴謹?shù)臄?shù)學(xué)邏輯,所以存在非常大的漏洞
2. 圖形變化消除狹長部分
設(shè):
- 狹長閾值:圖斑中狹長部分的寬度閾值
- S(原有):原有面狀圖斑
解:
- S(內(nèi)縮): 將
S(原有)
數(shù)據(jù)通過Buffer
算法內(nèi)縮狹長閾值
/2 - S(恢復(fù)):將
S(內(nèi)縮)
外擴狹長閾值
/2 - S(結(jié)果):使用
S(恢復(fù))
擦除S(原有)
的面,得到的結(jié)果 - 判斷
S(結(jié)果)
的面積是否大于面積閾值>0
3. 解決方法的細節(jié)
- 不能使用ArcGIS的buffer算法,ArcGIS的buffer算法在拐點處會生成為弧線。
- 面積閾值需要做一些調(diào)整,由于Buffer算法的特殊性會存在小范圍的丟失
-
S(結(jié)果)
就是錯誤結(jié)果。
3.1. PostGIS的Buffer函數(shù)參數(shù)
st_buffer(geometry,5,'endcap=square join=mitre');
具體可以參見筆者博客:PostGIS的Geometry Processing 幾何處理_1 ST_Buffer&&ST_BuildArea
4. 解決方法
4.1. PostGIS
- 原有圖斑
--原始圖斑
select st_geomfromgeojson('
{"type":"MultiPolygon","crs":{"type":"name","properties":{"name":"EPSG:4526"}},"coordinates":[[[[38526197.78691587,3946082.078275221],[38526239.096389465,3946081.883067248],[38526238.06191367,3946036.096619079],[38526272.53906836,3946035.789329056],[38526273.51750401,3946081.464537357],[38526318.149973966,3946079.913959388],[38526314.70475503,3945983.071421279],[38526269.72318699,3945985.068052262],[38526271.88954763,3946029.693470535],[38526238.0934658,3946029.695052562],[38526237.20585602,3945985.275129035],[38526191.99821754,3945985.892739444],[38526191.99821754,3945985.892739444],[38526197.78691587,3946082.078275221]]]]}
');
- 內(nèi)縮圖斑
--內(nèi)縮圖斑
select st_buffer(st_setsrid(st_geomfromtext ('
MULTIPOLYGON (((38526197.78691587 3946082.078275221, 38526239.096389465 3946081.883067248, 38526238.06191367 3946036.096619079, 38526272.53906836 3946035.789329056, 38526273.51750401 3946081.464537357, 38526318.149973966 3946079.913959388, 38526314.70475503 3945983.071421279, 38526269.72318699 3945985.068052262, 38526271.88954763 3946029.693470535, 38526238.0934658 3946029.695052562, 38526237.20585602 3945985.275129035, 38526191.99821754 3945985.892739444, 38526191.99821754 3945985.892739444, 38526197.78691587 3946082.078275221)))
'),4526),-5,'endcap=square join=mitre');
- 還原圖斑
--外擴圖斑
select st_buffer(st_setsrid(st_geomfromtext('
MULTIPOLYGON (((38526202.49370748 3946077.055977445, 38526233.9826907 3946076.9071762124, 38526232.94869538 3946031.14199388, 38526233.12135005 3946031.140455033, 38526232.306116015 3945990.34253409, 38526197.30384319 3945990.820722484, 38526202.49370748 3946077.055977445)), ((38526276.946718015 3946030.749845702, 38526277.432169005 3946030.745518946, 38526278.40783909 3946076.291625642, 38526312.97522189 3946075.090719166, 38526309.88725189 3945988.290182704, 38526274.96075535 3945989.840491601, 38526276.946718015 3946030.749845702)))
'),4526),5,'endcap=square join=mitre');
- 結(jié)果圖斑
select ST_MakeValid(ST_Difference(st_setsrid(st_geomfromtext ('
MULTIPOLYGON (((38526197.78691587 3946082.078275221, 38526239.096389465 3946081.883067248, 38526238.06191367 3946036.096619079, 38526272.53906836 3946035.789329056, 38526273.51750401 3946081.464537357, 38526318.149973966 3946079.913959388, 38526314.70475503 3945983.071421279, 38526269.72318699 3945985.068052262, 38526271.88954763 3946029.693470535, 38526238.0934658 3946029.695052562, 38526237.20585602 3945985.275129035, 38526191.99821754 3945985.892739444, 38526191.99821754 3945985.892739444, 38526197.78691587 3946082.078275221)))
'),4526),st_setsrid(st_geomfromtext ('
MULTIPOLYGON (((38526272.18562671 3946035.79247923, 38526272.53906836 3946035.7893290548, 38526273.51750401 3946081.464537357, 38526318.149973966 3946079.913959388, 38526314.70475503 3945983.071421279, 38526269.72318699 3945985.068052262, 38526272.18562671 3946035.79247923)), ((38526197.78691587 3946082.078275221, 38526239.096389465 3946081.883067248, 38526238.06191367 3946036.096619083, 38526238.221355066 3946036.0951980045, 38526237.20585602 3945985.2751290346, 38526191.99821754 3945985.892739444, 38526197.78691587 3946082.078275221)))
'),4526)))
4.2. Java解決方案
- Buffer算法
使用Java中JTS的算法,其中有部分可以實現(xiàn)上述Buffer效果文章來源:http://www.zghlxwxcb.cn/news/detail-422333.html
bufferDistance=-5
BufferParameters bufferParameters = new BufferParameters();
bufferParameters.setEndCapStyle(BufferParameters.CAP_SQUARE);
bufferParameters.setJoinStyle(BufferParameters.JOIN_MITRE);
bufferParameters.setMitreLimit(8.0);
bufferParameters.setQuadrantSegments(8);
BufferOp bufferOp = new BufferOp(geometry, bufferParameters);
Geometry resultGeometry = bufferOp.getResultGeometry(bufferDistance);
- 圖形計算使用JTS算法即可
序號 | 關(guān)系名稱 | 關(guān)系說明 | JTS接口 |
---|---|---|---|
1 | 相等(Equals): | 幾何形狀拓撲上相等。 | equals(geometry) |
2 | 脫節(jié)(Disjoint): | 幾何形狀沒有共有的點。 | disjoint(geometry) |
3 | 相交(Intersects): | 幾何形狀至少有一個共有點(區(qū)別于脫節(jié)) | intersects(geometry) |
4 | 接觸(Touches): | 幾何形狀有至少一個公共的邊界點,但是沒有內(nèi)部點。 | disjoint(geometry) |
5 | 交叉(Crosses): | 幾何形狀共享一些但不是所有的內(nèi)部點。 | crosses(geometry) |
6 | 內(nèi)含(Within): | 幾何形狀A(yù)的線都在幾何形狀B內(nèi)部。 | within(geometry) |
7 | 包含(Contains): | 幾何形狀B的線都在幾何形狀A(yù)內(nèi)部(區(qū)別于內(nèi)含) | contains(geometry) |
8 | 重疊(Overlaps): | 幾何形狀共享一部分但不是所有的公共點,而且相交處有他們自己相同的區(qū)域。 | overlaps(geometry) |
4.3. C#中的解決方法
使用JTS的C#版本的NTS就可以。文章來源地址http://www.zghlxwxcb.cn/news/detail-422333.html
到了這里,關(guān)于矢量圖斑局部狹長判斷和定位局部狹長部分(PostGIS、Java、C#實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!