Answers:
使用消除(需要ArcInfo许可)
通过将多边形与具有最大面积或最长共享边界的相邻多边形合并来消除多边形。消除(Eliminate)通常用于去除重叠操作(例如相交或联合)产生的小条形多边形。
http://help.arcgis.com/zh-CN/arcgisdesktop/10.0/help/index.html#//00170000005p000000.htm
ArcGIS 10用户请注意,此工具的选项中有一项新增功能。
现在可以使用选项> ex_features保留原始的POLYGON或POLYLINE。(可选)定义多边形边界或其一部分的输入多义线或多边形要素类或图层,不应将其消除。
要在QGIS中手动执行此操作,请转到底部Settings|Project Properties...
的General
选项卡上。Snapping options...
检查要捕捉的图层,将模式to vertex
设置为,并将公差设置为小于您两点之间的最短距离的某个值。如果不确定,请将单位设置为pixels
,将公差设置为5之类的值,这样,如果存在一些细节问题,则可以直接放大并确保不捕捉到错误的顶点。
然后编辑矢量层,选择节点工具,然后将误差点移至其对应点。
自动执行操作比较麻烦。AFAIK QGIS没有插件可以使它自动化,尽管PostGIS是在具有捕捉功能的GEOS上构建的,但它们并未暴露于PostGIS。可能可以编写查询来检查多边形的每个点以查找捕捉距离内的邻居,但这目前超出了我的理解范围。
GRASS具有v.clean.snap,您可以通过QGIS对其进行访问,但是还有创建GRASS数据集的额外步骤。
好吧,我一直在使用PostGIS函数(我直接在QGIS上使用),该函数执行递归快照来解决此问题。结果是相当不错的,它只需要一个很好的公差值来获得最佳结果。如果您愿意尝试,请检查一下(在我的情况下,所有的几何都是多重的,因此在我的execute中为st_multi):
CREATE OR REPLACE FUNCTION dsgsnap(tabela text, snap float) RETURNS void AS
$BODY$
DECLARE
id int;
BEGIN
FOR id in execute('select id from '||tabela)
LOOP
EXECUTE
'update '||tabela||' as classe set geom = st_multi(res.geom)
from
(
select st_snap(a.geom, st_collect(b.geom), '||snap||') as geom, a.id as id
from '||tabela||' a, '||tabela||' b
where a.id != b.id and a.id = '||id||'
group by a.id, a.geom
) as res
where res.id = classe.id';
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql;