在免费的GIS软件中查找伪节点?


16

软件gvSIG OA Digital Edition 2010具有用于在线性几何中查找伪节点的工具拓扑。我为20000个链接计数线性几何设置了群集公差0.00002和最大错误数-10000。但结果不成功。

有没有在免费GIS软件中找到伪节点的解决方案?

我需要对伪节点进行分层(此问题的一种解决方案-使用ArcInfo的工具拓扑,但对我而言,优先使用自由软件)。线性几何在PostGIS(v.0.1.2)数据库的QGIS 1.8.0中创建了多个用户。

添加新图像:A(4/5行),B(6/7行),C(9/10行)中具有三个伪节点的12个线性特征。伪节点应改为点-在一个点(节点)中相交的两个线性要素应为一个线性要素(第4/5行-第4行,...)。

是否可以在PostGIS中发出请求,从而导致伪节点层?

添加示例伪节点示例的新图像:如果收到线性层点层伪节点(蓝色矩形),则纠正了线性层中的以下错误:A-添加缺少的几何图形,B-交点处的捕捉线,C-移除伪节点。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


2
在GRASS中存在命令rmdangle,但结果是没有伪节点的shp文件。结果应该是伪节点的shp文件(或其他文件)(例如gvSIG OA Digital Edition 2010)
HasT 2012年

您是否使用PostGIS 2.0?如果是,请尝试使用Is_Valid和Makevalid函数。
乔凡尼·芒吉

是的,我使用PostGIS 2.0。我应该如何使用这些功能搜索伪节点?是否可以通过“ PgQuery for QGIS”找到它们?
HasT

是的,您可以在QGIS中使用任何允许运行PostGIS查询的工具使用它们,例如DB Manager(支持语法突出显示和自动完成)。
Giovanni Manghi'8

第二张图片中的红点是两个有效几何的交集。
vinayan 2012年

Answers:


8

这里是一个通用解决方案,您可以将其与PostGIS或任何其他OGC兼容软件结合使用。

注意:正如我之前所说,FOSS和GIS中的关键概念是标准化:最好的解决方案采用标准,例如OGC


您的问题是“查找伪节点” ...但是我认为还有一点更多,“查找非伪节点并连接伪节点行”。我的解决方案可同时用于两者。

OGC标准提供:

  • ST_Boundary(geom):检测线的节点

  • ST_Dump(geom):将每个单个节点放入SQL表记录中。

  • ST_DWithin,ST_Equals,ST_SnapToGrid,ST_Snap可用于更改容差。我正在使用ST_DWithin。

我们可以假设您的主要问题可以通过这些对象和属性来指定,

  • 只有一个线段(表linesegment的线段)由LINESTRING几何图形表示...我没有使用MULTILNE进行过测试,如果您使用geometrytype = MULTIPOINT,则可以使用ST_Dump和ST_LineMerge拆分和转换MULTILINEs;

  • 每个线段都有一个(geometry ID)gid和一个(color ID)idline

因此,第一步是获得来自连接线的节点,

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

注意:使用缓存是因为它们比视图快。使用“ EXPLAIN SELECT ...”检查CPU时间,这可能需要很长时间。

在这里,循环和连续(相同颜色的)线被检测为ncolors=1点,伪节点按ncolors=2点检测,因此,您拥有一个包含该点的图层。

您的“好节点”表具有原始的“边界点”,而没有“伪节点”。

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

谢谢您的解决方案!我尝试运行查询(在pgAdmin中),但收到异常:“函数array_distinct(integer [])不存在”。我究竟做错了什么?
HasT 2012年

抱歉,未引用array_distinct函数来自postgres.cz库。任何其他错误,请报告,我可以在此处添加更多说明。
彼得·克劳斯

我添加了array_distinct函数。在数据库线性层中具有“ the_geom”几何列名(而不是查询中的“ geom”)。运行查询后,将“ geom”替换为“ ST_Boundary(the_geom)”的“ the_geom”,在“因为颜色,geom FROM”地方收到消息“ column“ geom”不存在”。我将“作为颜色,geom FROM”替换为“作为颜色,the_geom FROM”,但是我再次收到消息“列“ the_geom”不存在”。
HasT 2012年

好吧,改变(见编辑答案)geomthe_geom(ST_Dump(x))保留为geom,不是数据库属性。
彼得·克劳斯

谢谢!查询有效。我在ST_equals上替换了ST_DWithin,并为ST_Buffer设置了0.00002 DD公差。结果,我收到了正确的节点(其中一个节点与3个及更多线性特征相交)。我想接收一个节点中的2个线性特征(FROM vw_joinnodes_full WHERE ncolors = 2;)相交的结果,但是想要接收一个节点中的2个和多个线性特征相交的点层。如何在一个节点中仅与两个线性特征相交的接收结果?
HasT 2012年

7

Refractions Research开发Line Cleaner工具,该工具似乎可以满足您的要求。

Line Cleaner通过简化复杂的,周期性的,非常短的和零长度的几何结构,并删除伪节点和无关紧要的顶点来清理网络。最重要的是,在清理阶段,它可以确保可以自动考虑功能匹配

在此处输入图片说明

源代码可以在GitHub上找到。


谢谢你的回答。但是由于错误,伪节点需要一个点层。这些错误必须由用户手动纠正,因为有时一个节点中的线与三条线相交,但是其中一条线被跳过或未对齐到顶点。
HasT 2012年

这看起来应该可以工作。难以准确了解您要在此处说的内容。“由于错误,伪节点需要一个点层”,我不明白您的意思。您是否需要一个点层,该点的点对齐到每行的末尾才能起作用?
雷纳2012年

@Rayner,添加示例伪节点的新图像(3):如果收到线性层点层伪节点(蓝色矩形),则手动(不是自动)修复线性层中的下一个错误:A-添加缺少的几何图形,B-捕捉相交的线,C-删除伪节点。如果我自动修复伪节点,则会在A,B地方留下错误。
HasT 2012年

好的,我理解B和C。当您说“ A-添加缺少的几何图形”时,这是什么意思?两行相交处是否需要添加一点?
雷纳2012年

@Rayner,这意味着应在“ A”中添加线性特征(根据图像的街道/道路)。在А-节点准备根据图像添加新的几何,但未添加几何(使用我发现未绘制几何的层伪节点)
HasT 2012年

2

非免费解决方案:FME + MRF + SmartCleaner变压器

免费解决方案GRASS v.clean(使用GRASS工具的最新QGIS 1.8.0是最简单的使用方式)和其他拓扑清理工具


QGIS 1.8.0。在C:\ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins目录(1.0.7)中安装SEXTANTE插件。在QGIS项目中加载线性shp文件(CRS层和WGS1984项目,“进行中”转换)。然后我应用“在画布上定义GRASS区域”(GRASS命令-工具)并运行命令v.clean-rmdangle(阈值= 0,输入目录/名称作为输出矢量/错误)。运行过程后,收到错误“无法加载层:D:/error.shp,检查SEXTANTE日志以查找错误”。在TOC中添加了新层,未加载错误的层。
HasT 2012年

1
在GRASS中,存在命令v.build.polylines-我从相交在一个顶点(已删除的伪节点)的两行中收到一条,但是我在SEXTANTE插件中找不到此命令
HasT 2012年

@simplexio您能否建议使用v.clean的哪个选项来识别伪节点
osmjit

2

以下是使用OpenJump免费GIS查找伪节点的步骤。
QGIS和gvSIG具有Sextante插件,因此这些相同的步骤也应起作用,
空间连接可能会略有不同。
我使用1.2版进行测试。

-保存线端点
Sextante工具箱,拓扑,提取线的端点-> endpt_0-取消拆分

线
Sextante工具箱,线图层的工具,连接相邻线

-保存未拆分线端点
Sextante工具箱,拓扑,提取线的端点line-> endpt_1-

被“加入相邻线”移除的端点是伪节点

工具,查询,空间查询,
源层“ endpt_0”
关系“相交”
遮罩层“ endpt_1”

启用或单击“补余结果”


感谢您的回答!我尝试在QGIS Sextante中进行这些步骤,但是在此找不到“提取线的端点”和“加入相邻的线”命令。是否可以在QGIS Sextante中添加(存在gvSIG 1.12这些命令)或命令v.build.polylines?
HasT 2012年

我刚刚安装了QGIS sextante插件。我也没有看到完整的功能,很多功能都不见了。在shapefile上测试gvSIG中的步骤应该很容易。
klewis 2012年

我刚刚在gvSIG 2.4.0.2834中验证了上述工作流程,并且工作正常。我用其他两个工具箱地理处理代替了最后一步:首先,使用表达式将gvSIG “ Spatial Join”转换为第二个“ Filter vector layer”DIST > 0。此外,可以在SEXTANTE模型中将所有地理过程链接在一起,以便创建一个新工具,例如“查找伪节点”
安东尼奥·法尔恰诺


1

使用PostGIS,您可以使用查询的修改版本来查找本主题中讨论的悬挂,因为伪节点是拦截2个线串的节点,而悬挂是拦截1个线串的节点。

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.