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?
.geom
bạn đang đề cập đến? Không thể phát hiện ra nó!
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.