Làm cách nào để chia đường OSM thành các đoạn riêng lẻ tại các giao lộ?


10

Tôi muốn tạo một mạng lưới đường để sử dụng với pgRouting bằng dữ liệu OpenStreetMap. Tôi đã tải một shapefile từ GeoFabrik vào bảng Postgres (đã bật PostGIS). Tuy nhiên, một vấn đề tôi gặp phải là các con đường không phải lúc nào cũng kết thúc tại các giao lộ, vì vậy tôi quyết định tách tất cả chúng ở mọi ngã tư hoặc ngã tư.

Để xác định tất cả các giao điểm nơi đường giao nhau hoặc giao nhau, tôi đã sử dụng cách sau SQL(tương tự như câu hỏi trước ):

CREATE TABLE split_points as
SELECT DISTINCT    
   ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom      
FROM
   roads as a,
   roads as b
WHERE
    ST_Touches(a.geom, b.geom)
OR
    ST_Crosses(a.geom, b.geom)    
    AND a.gid != b.gid
GROUP BY
   ST_Intersection(a.geom, b.geom);

Bây giờ tôi muốn phân chia các con đường bằng cách sử dụng các điểm này. Tôi đã sử dụng cách tiếp cận sau:

CREATE TABLE split_roads as
SELECT     
    ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
    generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM    
    split_points as blade,
    roads as g
WHERE
    ST_Intersects(g.geom, blade.geom);

Vấn đề với phương pháp phân chia này là chiều dài đường đầy đủ vẫn còn bên cạnh tất cả các phần bị tách. Để xóa những hình học đường không phân chia được bao gồm, tôi đã sử dụng ST_Equals()chức năng để xác định chúng và xóa chúng:

DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)

Tuy nhiên, phương pháp này không loại bỏ tất cả các hình học không nguyên gốc (mặc dù nó loại bỏ một số trong số chúng). Có cách tiếp cận nào tốt hơn để xóa (hoặc tổng thể) để tôi chỉ có các hình học được phân chia trong một bảng không?


Theo tài liệu, ST_Split không trả về hình dạng ban đầu, không ứng dụng. Cái '.geom' bổ sung đó nằm ở dấu ngoặc đơn cuối cùng trong dòng đầu tiên của câu lệnh CHỌN của bạn là gì? Có thể đơn giản như loại bỏ điều đó.
Scro

@Scro mà .geombạn đang đề cập đến? Không thể phát hiện ra nó!
djq

Tôi đoán về mặt kỹ thuật, đó sẽ là dòng thứ hai của câu lệnh SELECT. Ngoài ra, tôi đang đề cập đến việc tạo bảng "split_roads". Đó là dòng kết thúc bằng '))). Geom) là geom'.
Scro

hmm, tôi gặp lỗi khi tôi làm điều đó ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
djq

Đã làm toàn bộ cái nhìn dòng như sau: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, blade.geom)))) Như Geom,
Scro

Câu trả lời:


6

Không phải là một giải pháp thực sự cho vấn đề của bạn, nhưng hãy thử osm2po ... nó tạo ra mã SQL hoàn hảo để định tuyến trong pgrouting: http://osm2po.de/


Cám ơn vì sự gợi ý. Tôi đã thử osm2pgroutingnhưng nó đòi hỏi nhiều bộ nhớ hơn máy chủ của tôi và nó chấm dứt mà không hoàn thành.
djq

2
@djq osm2po có thể xử lý các tệp lớn hơn nhiều so với osm2pgrouting. Nó thậm chí có thể tải planet.osm
Underdark

ah, ban đầu tôi nghĩ osm2polà một lỗi đánh máy. Có đơn giản cài đặt nó trong ubfox không?
djq

Đó là một tệp JAR được biên dịch sẵn sàng (java). Chỉ cần chạy nó như được giải thích trên trang web.
Sinh viên GIS

11

Câu trả lời đơn giản: Đừng. Bạn không nên làm theo cách đó.

Từ Shapefiles đường OSM, không thể phân biệt giữa giao lộ và đường chui / đường chui. Bạn sẽ tạo các giao lộ không tồn tại trong thực tế nếu bạn phân chia tất cả các con đường dường như băng qua.

Bạn sẽ cần làm bẩn tay với tệp OSM gốc, nếu bạn không muốn sử dụng các công cụ hiện có như osm2pgrouting (nơi mạng đủ nhỏ) hoặc osm2po.


1
Chính xác . Đây cũng là một sai lầm khác mà một số người mắc phải khi họ xử lý dữ liệu navteq và teleatlas. Đường chui / cầu vượt là một nỗi đau nhưng là một thực tế.
Ragi Yaser Burhum

1
Đồng ý. Chào mừng bạn đến với GIS nơi dữ liệu luôn luôn xấu đi
Simplexio

3

Về vấn đề chung của bạn, sử dụng pgRouting: Tôi nghĩ @Uffer, @GisStudent và những người khác đang chỉ cho bạn cách sử dụng "OSC & v.v.", họ đã đúng. Đi theo manh mối của "thực tiễn tốt nhất" và "tiêu chuẩn" ...

Về câu hỏi của bạn: "chia đường thành các đoạn riêng lẻ tại các giao lộ" hoặc "cách xóa tất cả các hình học không cố định ban đầu". Tôi có thể giúp nếu bạn hiển thị ở đây kết quả của bạn ở đây, từng bước ...

Bước đầu tiên: phân tích cấu trúc liên kết

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.

2

Một "giải pháp không thực sự cho vấn đề của bạn", nhưng bộ chuyển đổi OSM của chúng tôi phân tách tại các giao lộ trong khi nó chuyển đổi từ OSM sang SHP. Cách đó hiệu quả hơn, vì nó có thể so sánh ID của các nút, thay vì thực hiện các phép tính hình học.


1

Một cách để giải quyết bằng thuật toán là thêm điểm bắt đầu và điểm kết thúc của mỗi con đường vào tập hợp các "giao lộ", để bạn có thể chắc chắn rằng mọi đoạn nằm giữa hai giao lộ.

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.