¿Encontrar pseudo nodos en software SIG gratuito?

16

El software gvSIG OA Digital Edition 2010 tiene herramientas de topología para encontrar pseudo nodos en geometría lineal. Configuré la tolerancia de clúster 0.00002 y el número máximo de errores -10000 para la geometría lineal de conteo de enlaces 20000. Pero resultado infructuoso.

¿Hay alguna solución que encuentre pseudo nodos en el software SIG gratuito?

Necesito superponer pseudo nodos (una solución a este problema: usar la topología de herramientas de ArcInfo, pero la prioridad para mí es usar software libre). La geometría lineal creó varios usuarios en QGIS 1.8.0 en la base de datos PostGIS (v. 2.0.1).

Agregue una nueva imagen: 12 características lineales con tres pseudo nodos en A (línea 4/5), B (línea 6/7), C (línea 9/10). Los pseudo nodos deberían ser puntos en su lugar: dos entidades lineales con intersección en un punto (nodo) deberían ser una entidad lineal (línea 4/5 - línea 4, ...).

¿Es posible hacer una solicitud en PostGIS, lo que dará como resultado una capa de pseudo nodos?

Agregue una nueva imagen de pseudo nodos de ejemplos: si recibo pseudo nodos de capa de punto de capa lineal (rectificaciones azules), corregí los siguientes errores en la capa lineal: A - agregue geometría faltante, B - línea ajustada en la intersección, C - elimine el pseudo nodo.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

HasT
fuente
2
En GRASS existe el comando rmdangle, pero en el resultado el archivo shp sin pseudo nodos. El resultado debería ser un archivo shp (u otro) de pseudo nodos (como gvSIG OA Digital Edition 2010)
HasT
¿Usas PostGIS 2.0? En caso afirmativo, pruebe las funciones Is_Valid y Makevalid.
Giovanni Manghi
Sí, uso PostGIS 2.0. ¿Cómo debo usar estas funciones para buscar pseudo nodos? ¿Es posible encontrarlos con "PgQuery for QGIS"?
HasT
sí, puede usarlos dentro de QGIS en cualquier herramienta que le permita ejecutar una consulta PostGIS, como por ejemplo DB Manager (que admite resaltado de sintaxis y finalización automática).
Giovanni Manghi
El punto rojo en la segunda imagen es una intersección de dos geometrías válidas ... ¿verdad?
vinayan

Respuestas:

8

Aquí una solución genérica, que puede mejorar con PostGIS o cualquier otro software compatible con OGC.

NOTA: como dije antes , un concepto clave en FOSS y GIS es la estandarización : las mejores soluciones adoptan estándares, como OGC .


Su problema es "encontrar pseudo nodos" ... Pero creo que es un poco más, "encontrar no pseudo nodos y unir líneas de pseudo nodos". Mi solución puede usarse para ambos.

Oferta de estándares OGC:

  • ST_Boundary (geom) : para detectar los nodos de las líneas

  • ST_Dump (geom) : para poner cada nodo individual en un registro de tabla SQL.

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap se pueden usar para la tolerancia al cambio. Estoy usando ST_DWithin.

Podemos suponer que su problema principal se puede especificar con estos objetos y propiedades,

  • solo hay segmentos de línea (de una tabla en línea) ), representados por una geometría LINESTRING ... No probé con MULTILNE, si tiene geometrytype = MULTIPOINT, puede dividir y emitir MULTILINEs con ST_Dump y ST_LineMerge;

  • cada segmento de línea tiene un gid (ID de geometría) y un idline (ID de color) .

Entonces, el primer paso es obtener los nodos que provienen de unir líneas,

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;

NOTA: usar cachés porque son más rápidos que las vistas. Use "EXPLAIN SELECT ..." para verificar el tiempo de CPU, puede llevar mucho tiempo.

Aquí se detectan ciclos y líneas continuas (del mismo color) como ncolors=1puntos, y los pseudo nodos por ncolors=2puntos, por lo que tiene una capa con esos puntos.

Su tabla de "nodos buenos" está con los "puntos delimitadores" originales y sin "pseudonodos".

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 ... 
Peter Krauss
fuente
¡Gracias por la solución! Intento ejecutar query (en pgAdmin) pero recibo una excepción: "function array_distinct (integer []) no existe". ¿Qué estoy haciendo mal?
HasT
Lo sentimos, la array_distinctfunción no citada es de una biblioteca postgres.cz . Cualquier otro error, informe, puedo agregar más explicaciones aquí.
Peter Krauss
Agregué la función array_distinct. En la base de datos, la capa lineal tiene el nombre de columna de geometría "the_geom" (en lugar de "geom" en la consulta). Reemplazo "geom" por "the_geom" por "ST_Boundary (the_geom)" después de ejecutar la consulta, recibo el mensaje "columna" geom "no existe" en "como colores, geom DE" lugar. Reemplazo "como colores, geom FROM" a "como colores, the_geom FROM", pero nuevamente recibo el mensaje "columna" the_geom "no existe".
HasT
Ok, cambiado (ver respuesta editada) geoma the_geom. (ST_Dump (x)) permanece como geom, no es un atributo de la base de datos.
Peter Krauss
¡Gracias! La consulta funciona. Reemplacé ST_DWithin en ST_equals y para ST_Buffer doy 0.00002 de tolerancia DD. Como resultado, recibí los nodos correctos (donde en un nodo se cruzan 3 y más características lineales). Quiero recibir el resultado donde en un nodo se cruza con 2 entidades lineales (FROM vw_joinnodes_full WHERE ncolors = 2;), pero recibí la capa de puntos donde en un nodo se cruza con 2 y más entidades lineales. ¿Cómo recibir el resultado donde en un nodo se cruza solo 2 características lineales?
HasT
7

Refractions Research ha creado una herramienta Line Cleaner que parece hacer lo que usted desea.

Line Cleaner limpia redes simplificando geometrías complejas, cíclicas, muy cortas y de longitud cero, y eliminando pseudo-nodos y vértices insignificantes. Lo más significativo es que, en la fase de limpieza, puede garantizar que las coincidencias de características se puedan considerar automáticamente

ingrese la descripción de la imagen aquí

El código fuente se puede encontrar en GitHub.

RK
fuente
Gracias por la respuesta. Pero como resultado de los errores, el pseudo nodo necesita una capa de puntos. Los usuarios deben corregir estos errores manualmente, ya que hay veces en que un nodo debe intersecar tres líneas, pero una de las líneas se omite o no se ajusta al vértice.
HasT
Parece que debería funcionar. Tiene dificultades para entender exactamente lo que está tratando de decir aquí. "Como resultado de errores, el pseudo nodo necesita una capa de puntos" No entiendo lo que quiere decir con esto. ¿Necesita una capa de puntos con puntos ajustados al final de cada línea para que esto funcione?
Rayner
@Rayner, agregue una nueva imagen de ejemplos de pseudo nodos (3): si recibo pseudo nodos de capa de punto de capa lineal (rectificaciones azules) corrijo manualmente (no automáticamente) los siguientes errores en la capa lineal: A - agregue la geometría faltante, B - encajé línea en intersección, C - elimina el pseudo nodo. Si soluciono automáticamente los pseudo nodos, dejé errores en los lugares A, B.
HasT
Bien, entiendo B y C. Cuando dices "A - agregar geometría faltante", ¿qué significa eso? ¿Hay algún punto que deba agregarse donde se unen las 2 líneas?
Rayner
@Rayner, significa lo que en 'A' se debe agregar una característica lineal (calle / carretera de acuerdo con las imágenes). En А - el nodo se preparó para agregar nueva geometría de acuerdo con las imágenes, pero la geometría no se agregó (use pseudonodos de capa que no encuentre geometría pintada)
HasT
2

Solución no libre: transformador FME + MRF + SmartCleaner

Solución gratuita GRASS v.clean (El último QGIS 1.8.0 con herramientas GRASS es la forma más fácil de usarlo) y otras herramientas de limpieza de topología

simplexio
fuente
QGIS 1.8.0. Instale el complemento SEXTANTE en el directorio C: \ Archivos de programa \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins (1.0.7). Cargue el archivo shp lineal en el proyecto QGIS (capa CRS y proyecto WGS1984, transformación 'on the fly' activada). Luego aplico 'Definir región de GRASS en el lienzo' (comandos de GRASS - Herramientas) y ejecuto el comando v.clean - rmdangle (Thershold = 0, ingrese dir / name para el vector de salida / errores). Después del proceso de ejecución, reciba el error "No se pudo cargar la capa: D: /error.shp Verifique el registro de SEXTANTE para buscar errores". En TOC se agregó una nueva capa, capa con errores no cargados.
HasT
1
En GRASS existe el comando v.build.polylines: recibo uno de dos líneas que se cruzan en un vértice (pseudo nodo eliminado), pero este comando no lo encuentro en el complemento SEXTANTE
HasT
@simplexio ¿Puede usted por favor sugerir qué opción de muy limpios se puede utilizar para identificar los nodos de pseudo-
osmjit
2

Aquí hay pasos para encontrar sus pseudo nodos usando OpenJump y un SIG gratuito.
QGIS y gvSIG tienen el complemento Sextante, por lo que estos mismos pasos también deberían funcionar,
la unión espacial puede ser ligeramente diferente.
Usé la versión 1.2 para probar.

- guarde la
caja de herramientas Sextante de puntos finales de línea , topología, extraiga puntos finales de líneas -> endpt_0

- separe las líneas de la
caja de herramientas Sextante, herramientas para capas de línea, unir líneas adyacentes

- guarde la caja de
herramientas Sextante de puntos finales de línea sin dividir , topología, extraiga los puntos finales de línea -> endpt_1

- los puntos finales eliminados por "Unir líneas adyacentes" son pseudo nodos

Herramientas, Consultas, Consulta espacial,
Capa de origen "endpt_0"
Relación "Interseca"
Habilite la capa "endpt_1"

o haga clic en Complemento Resultado

klewis
fuente
¡Gracias por la respuesta! Intentaré hacer estos pasos en QGIS Sextante, pero no encuentro allí los comandos "Extraer puntos finales de líneas" y "Unir líneas adyacentes". ¿Es posible agregar QGIS Sextante (en gvSIG 1.12 existen estos comandos) o el comando v.build.polylines?
HasT
Acabo de instalar el plugin QGIS sextante. Tampoco veo las funciones completas, faltan muchas. Debería ser fácil probar los pasos en gvSIG en un archivo shape.
klewis
Acabo de verificar el flujo de trabajo anterior en gvSIG 2.4.0.2834 y funciona bien. He sustituido el paso final con otros dos geoprocesos de la caja de herramientas: primero, la " unión espacial" de gvSIG , luego la "capa de vector de filtro" usando DIST > 0como expresión. Además, todos los geoprocesos se pueden encadenar en un modelo SEXTANTE para crear una nueva herramienta, por ejemplo, "Buscar pseudonodes" .
Antonio Falciano
1

Con PostGIS, puede usar una versión modificada de la consulta para encontrar los colgantes discutidos en este tema , ya que los pseudonodos son nodos que interceptan 2 cadenas lineales y los colgantes son nodos que interceptan 1 cadena lineal.

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;
Gauchoguitar10
fuente