长水面数据局部更新思路

Posted by WT on January 25, 2024

问题

不同时期的河流水面宽度不同,不同来源的影像纠正后位置偏离也不同,长水面矢量数据可能不会和底图完全匹配,但如果差别特别大,则需要更新。

run1

思路

蒋总写代码cellclip.py前已经将数据区域划分为0.1°*0.1°的小方格,然后根据小方格内的三角形切片生成一个单独的文件,如果哪个网格内的数据出现问题,则重新勾画该网格及接边格区域内的一小块河道(保证新旧河道平滑过渡)即可。然后将这些数据重新计算生成新的json文件,注意json文件的合并规则,确保无缝覆盖。

具体步骤

1、勾画问题区域的河道,有问题的区域要整个网格重新画,兼顾接边处(可以加载旧的三角网,对比绘制,确保平滑过渡)。

run1

2、将绘制的河道通过Merge工具合并为一个要素,如果不是一个要素,后续生成TIN时会有问题。然后使用ArcGIS的Create TIN 生成TIN,而后利用TIN Triangle 工具生成三角网。三角网的顶点是绘制河道时多边形的顶点,如果想要三角网好看,绘制河道时需要考虑多边形点的位置

run1

run1

run1

3、由于蒋总给的cell.shp数据是很大,局部更新的时候只选择与河道相交的网格即可。这样计算速度快!将程序中的feature换成要更新的河道,cell换成筛选后的小范围的网格。 原始代码会检查与网格相交的要素是否都在网格内,把这条注释掉,此判断代码使得位于跨网格的三角形不属于任何网格,造成长水面缺失。

run1

def getInFeatures(selgeo, shp):
    features = arcpy.da.SearchCursor(shp, ["SHAPE@"])
    geos = []
    for featrue in features:
        pgeo = project(featrue, selgeo[0].spatialReference)
        #if isGeoIn(selgeo, pgeo):   #将此判断注释掉
        geo = shpjson.trimGeosNoZ([pgeo])
        geos.append(dict(type="Polygon", coordinates=geo))
    return geos

4、由于画河道的时候,为了接边处理,河道上下网格分别多花了一小块,这一小块不能直接替换,因为数据不全。我们把这一小块合并到相邻的json文件中。此步骤需要手动删除JSON文件中的前缀和后续部分,再合并两个文件。

run1