Tìm các nút giả trong phần mềm GIS miễn phí?


16

Phần mềm gvSIG OA Digital Edition 2010 có cấu trúc liên kết công cụ để tìm các nút giả trong hình học tuyến tính. Tôi đặt dung sai cụm 0,00002 và số lỗi tối đa -10000 cho hình học tuyến tính đếm 20000 liên kết. Nhưng kết quả không thành công.

Có giải pháp nào tìm thấy các nút giả trong phần mềm GIS miễn phí không?

Tôi cần lớp các nút giả (một giải pháp cho vấn đề này - để sử dụng công cụ cấu trúc liên kết của ArcInfo, nhưng ưu tiên đối với tôi là sử dụng phần mềm miễn phí). Hình học tuyến tính đã tạo ra một số người dùng trong QGIS 1.8.0 trong cơ sở dữ liệu PostGIS (v. 2.0.1).

Thêm hình ảnh mới: 12 tính năng tuyến tính với ba nút giả trong A (dòng 4/5), B (dòng 6/7), C (dòng 9/10). Các nút giả phải là các điểm thay thế - hai tính năng tuyến tính có giao điểm trong một điểm (nút) phải là một tính năng tuyến tính (dòng 4/5 - dòng 4, ...).

Có thể thực hiện một yêu cầu trong PostGIS, điều này sẽ dẫn đến một lớp các nút giả?

Thêm hình ảnh mới của các nút giả ví dụ: nếu tôi nhận được cho các nút giả lớp lớp tuyến tính (các đường viền màu xanh) Tôi đã sửa các lỗi sau trong lớp tuyến tính: A - thêm hình học bị thiếu, đường B bị gãy trong giao lộ, C - loại bỏ nút giả.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


2
Trong GRASS tồn tại lệnh rmdangle, nhưng kết quả là tệp shp không có nút giả. Kết quả là tệp shp (hoặc một tệp khác) của các nút giả (như gvSIG OA Digital Edition 2010)
HasT

Bạn có sử dụng PostGIS 2.0 không? Nếu có, hãy thử các hàm Is_Valid và Makevalid.
Giovanni Manghi

Có, tôi sử dụng PostGIS 2.0. Làm thế nào tôi nên sử dụng các chức năng này để tìm kiếm các nút giả? Có thể tìm thấy chúng với "PGQuery cho QGIS" không?
HasT

có, bạn có thể sử dụng chúng trong QGIS trong bất kỳ công cụ nào cho phép bạn chạy truy vấn PostGIS, ví dụ như Trình quản lý DB (hỗ trợ tô sáng cú pháp và hoàn thành tự động).
Giovanni Manghi

điểm màu đỏ trong bức tranh thứ hai là một giao điểm của hai hình học hợp lệ..vậy?
vinaya

Câu trả lời:


8

Đây là một giải pháp chung, mà bạn có thể áp dụng với PostGIS hoặc bất kỳ phần mềm tương thích OGC nào khác.

LƯU Ý: như tôi đã nói trước đây , một khái niệm quan trọng trong FOSS và GIS là tiêu chuẩn hóa : các giải pháp tốt nhất áp dụng các tiêu chuẩn, giống như các tiêu chuẩn OGC .


Vấn đề của bạn là "tìm các nút giả" ... Nhưng tôi nghĩ rằng đó là một chút nữa, "tìm các nút không giả và nối các dòng của các nút giả". Giải pháp của tôi có thể được sử dụng cho cả hai.

Tiêu chuẩn OGC cung cấp:

  • ST_Boundary (geom) : để phát hiện các nút của các dòng

  • ST_Dump (geom) : để đặt từng nút đơn trong bản ghi bảng SQL.

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap có thể được sử dụng để thay đổi dung sai. Tôi đang sử dụng ST_DWithin.

Chúng tôi có thể giả sử rằng vấn đề chính của bạn có thể được chỉ định với các đối tượng và thuộc tính này,

  • chỉ có đoạn thẳng (của một bảng đoạn thẳng ), đại diện bởi một hình học LineString ... Tôi không thử nghiệm với MULTILNE, nếu bạn có GeometryType = MultiPoint, bạn có thể chia nhỏ và MULTILINEs dàn diễn viên với ST_Dump và ST_LineMerge;

  • mỗi phân đoạn dòng có gid (ID hình học) và idline (ID màu) .

Vì vậy, bước đầu tiên là có được các nút xuất phát từ việc nối các dòng,

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;

LƯU Ý: sử dụng bộ đệm vì chúng nhanh hơn chế độ xem. Sử dụng "GIẢI THÍCH CHỌN ..." để kiểm tra thời gian CPU, có thể mất nhiều thời gian.

Ở đây các chu kỳ và các đường liên tục (cùng màu) được phát hiện dưới dạng ncolors=1các điểm và các nút giả theo ncolors=2điểm, vì vậy, bạn có một lớp với các điểm đó.

Bảng "nút tốt" của bạn có "điểm giới hạn" ban đầu và không có "nút giả".

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 ... 

Cảm ơn bạn cho giải pháp! Tôi thử chạy truy vấn (trong pgAdmin) nhưng tôi nhận được ngoại lệ: "hàm Array_distotype (số nguyên []) không tồn tại". Tôi đang làm gì sai?
HasT

Xin lỗi, array_distinctchức năng không được trích dẫn là từ thư viện postgres.cz . Bất kỳ lỗi nào khác, xin vui lòng báo cáo, tôi có thể thêm giải thích ở đây.
Peter Krauss

Tôi đã thêm chức năng Array_distotype. Trong lớp tuyến tính cơ sở dữ liệu có tên cột hình học "the_geom" (thay vì "geom" trong truy vấn). Tôi thay thế "geom" thành "the_geom" cho "ST_Boundary (the_geom)" sau khi chạy truy vấn, tôi nhận được thông báo "cột" geom "không tồn tại" dưới dạng "màu sắc, geom TỪ". Tôi thay thế "như màu sắc, geom TỪ" thành "như màu sắc, the_geom TỪ", nhưng tôi lại nhận được thông báo "cột" the_geom "không tồn tại".
HasT

Ok, thay đổi (xem câu trả lời chỉnh sửa) geomthành the_geom. (ST_Dump (x)) ở dạng geom, không phải là thuộc tính cơ sở dữ liệu.
Peter Krauss

Cảm ơn! Truy vấn hoạt động. Tôi đã thay thế ST_DWithin trên ST_equals và đối với ST_Buffer, hãy cho phép dung sai 0,00002 DD. Kết quả là tôi đã nhận được các nút chính xác (trong đó một nút giao 3 và nhiều tính năng tuyến tính hơn). Tôi muốn nhận kết quả trong đó trong một nút giao với 2 tính năng tuyến tính (TỪ vw_joinnodes_full WHERE ncolors = 2;), nhưng đã nhận được lớp điểm trong đó trong một nút giao với 2 tính năng tuyến tính. Làm thế nào nhận kết quả trong đó trong một nút chỉ giao nhau 2 tính năng tuyến tính?
HasT

7

Nghiên cứu khúc xạ đã tạo ra một công cụ Line Cleaner dường như làm những gì bạn muốn.

Line Cleaner làm sạch các mạng bằng cách đơn giản hóa các hình học phức tạp, theo chu kỳ, rất ngắn và có độ dài bằng không, và loại bỏ các nút giả và các đỉnh không đáng kể. Đáng kể nhất, trong giai đoạn làm sạch, có thể đảm bảo rằng các tính năng phù hợp có thể được xem xét tự động

nhập mô tả hình ảnh ở đây

Các mã nguồn có thể được tìm thấy tại GitHub.


Cảm ơn bạn đã trả lời. Nhưng do lỗi nút giả cần một lớp điểm. Những lỗi này phải được sửa bởi người dùng bằng tay, vì có những lúc trong một nút nên giao nhau ba dòng, nhưng một trong những dòng bị bỏ qua hoặc không được ngắt vào đỉnh.
HasT

Điều này có vẻ như nó nên làm việc. Gặp khó khăn để hiểu chính xác những gì bạn đang cố gắng nói ở đây. "do lỗi nút giả cần một lớp điểm" Tôi không hiểu ý của bạn là gì. Bạn có cần một lớp điểm với các điểm được ngắt ở cuối mỗi dòng để làm việc này không?
Rayner

@Rayner, thêm hình ảnh mới của các ví dụ các nút giả (3): nếu tôi nhận được cho các nút giả lớp lớp tuyến tính (các đường dẫn màu xanh) Tôi sửa lỗi thủ công (không tự động) trong các lớp tuyến tính: A - thêm hình học bị thiếu, B - bị gãy đường trong giao lộ, C - loại bỏ nút giả. Nếu tôi tự động sửa các nút giả, tôi đã để lại lỗi ở các vị trí A, B.
HasT

Được rồi, tôi hiểu B và C. Khi bạn nói "A - thêm hình học bị thiếu" điều đó có nghĩa là gì? Có một điểm cần được thêm vào nơi 2 dòng gặp nhau không?
Rayner

@Rayner, nó có nghĩa là những gì trong 'A' nên được thêm tính năng tuyến tính (đường / đường theo hình ảnh). Trong nút - được chuẩn bị để thêm hình học mới theo hình ảnh, nhưng hình học không được thêm vào (sử dụng các nút giả lớp tôi thấy không được vẽ hình học)
HasT

2

Giải pháp không miễn phí: Máy biến áp FME + MRF + SmartCleaner

Giải pháp miễn phí GRASS v.clean (QGIS 1.8.0 mới nhất với các công cụ GRASS là cách dễ nhất để sử dụng nó) và các công cụ làm sạch cấu trúc liên kết khác


QGIS 1.8.0. Cài đặt plugin SEXTANTE trong thư mục C: \ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins (1.0.7). Tải tệp shp tuyến tính trong dự án QGIS (lớp CRS và dự án WGS1984, chuyển đổi 'trên đường bay' trên). Sau đó, tôi áp dụng 'Xác định vùng GRASS trên canvas' (lệnh GRASS - Công cụ) và chạy lệnh v.clean - rmdangle (Therskeep = 0, nhập dir / name cho vectơ / lỗi đầu ra). Sau khi chạy quá trình nhận Lỗi 'Không thể tải lớp: D: /error.shp Kiểm tra nhật ký SEXTANTE để xem lỗi'. Trong TOC đã thêm lớp mới, lớp có lỗi không được tải.
HasT

1
Trong GRASS tồn tại lệnh v.build.polylines - Tôi nhận được một từ hai dòng giao nhau trong một đỉnh (nút giả đã xóa), nhưng lệnh này tôi không tìm thấy trong plugin
SEXTANTE

@simplexio Bạn có thể vui lòng đề xuất tùy chọn nào của v.clean có thể được sử dụng để xác định các nút giả
osmjit

2

Dưới đây là các bước để Tìm các nút giả của bạn bằng cách sử dụng OpenJump một GIS miễn phí.
QGIS và gvSIG có Plugin Sextante, vì vậy các bước tương tự cũng sẽ hoạt động,
Spatial Join có thể hơi khác nhau.
Tôi đã sử dụng phiên bản 1.2 để thử nghiệm.

- tiết kiệm Line điểm cuối
Sextante hộp công cụ, Topology, Extract điểm cuối của dòng -> endpt_0

- unsplit dòng của bạn
Sextante hộp công cụ, Dụng cụ cho các lớp dòng, Tham dòng liền kề

- tiết kiệm thiết bị đầu cuối dòng Unsplit
Sextante hộp công cụ, Topology, điểm chiết xuất cuối dòng -> endpt_1

- điểm cuối bị xóa bởi "Tham gia các dòng liền kề" là các nút giả

Công cụ, Truy vấn, Truy vấn không gian,
Lớp nguồn "endpt_0"
Quan hệ "Giao nhau"
Lớp mặt nạ "endpt_1"

kích hoạt hoặc nhấp vào Kết quả bổ sung


Cảm ơn câu trả lời! Tôi sẽ thử thực hiện các bước này trong QGIS Sextante, nhưng tôi không tìm thấy các lệnh "Trích xuất điểm cuối của dòng" và "Tham gia các dòng liền kề" ở đó. Có thể thêm vào QGIS Sextante (trong các lệnh gvSIG 1.12 đang tồn tại) hoặc lệnh v.build.polylines?
HasT

Tôi vừa cài đặt plugin sextante QGIS. Tôi cũng không thấy các chức năng đầy đủ, nhiều người bị thiếu. Thật dễ dàng để kiểm tra các bước trong gvSIG trên một shapefile.
klewis

Tôi vừa xác minh quy trình làm việc ở trên trong gvSIG 2.4.0.2834 và nó hoạt động tốt. Tôi đã thay thế bước cuối cùng bằng hai công cụ địa lý hộp công cụ khác: thứ nhất, gvSIG "Spatial Join" , thứ hai là "Lớp vector lọc" sử dụng DIST > 0làm biểu thức. Hơn nữa, tất cả các công cụ địa lý có thể được kết nối với nhau trong mô hình SEXTANTE để tạo ra một công cụ mới, ví dụ: "Tìm mã giả" .
Antonio Falciano


1

Với PostGIS, bạn có thể sử dụng một phiên bản sửa đổi của truy vấn để tìm các nguy hiểm được thảo luận trong chủ đề này , vì các mã giả là các nút chặn 2 linestrings và các nguy hiểm là các nút chặn 1 linestring.

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.