Chuyển đổi MultiLinestring sang Linestring với PostGIS?


16

Tôi có một chuỗi multiline và muốn chuyển đổi nó thành một linestring để sử dụng một số chức năng chỉ hoạt động với linestrings. Tôi đã sử dụng ST_Dump()và có một bộ sưu tập hình học của tôi. Nếu tôi hợp nhất chúng lại với nhau, tôi vẫn có được đa tuyến. Tôi có nên lấy các Điểm và kết hợp chúng lại với nhau hoặc một cái gì đó, để kết thúc với một dòng đơn giản? ST_LineMerge()cũng không hoạt động trên đa tuyến của tôi, nó trả về như vậy.

ví dụ của tôi

MULTILINESTRING ((- 3,16420835153456 55,9269166007097, -3,164222 55,926918), (- 3,1642070167833 55,9269296196706, -3,16421351659546 55,9268662214904), (- 3,16421351659546 55,9268662214904, -3,16421636372824 55,9268384509897), (- 3,16421636372824 55,9268384509897, -3,16422182573761 55,9267851753802), (- 3,16422182573761 55,9267851753802, -3,16422870102352 55,926718114886 ), (- 3,16422870102352 55,926718114886, -3,16423309121073 55,926675293667), (- 3,16423309121073 55,926675293667, -3,16423565148822 55,9266503211093), (- 3,16423565148822 55,9266503211093, -3,16424103159897 55,9265978443265), (- 3,16424103159897 55,9265978443265, -3,16424680776317 55,9265415044985), (- 3,16424680776317 55,9265415044985, -3,16425267254583 55,9264843002995 ), (- 3.16425267254583 55.9264843002995, -3.16425541048045 55.9264575949012), (-(-3,16426111146586 55,9264019883556, -3,1642667032531 55,9263474469124), (- 3,1642667032531 55,9263474469124, -3,16426957768543 55,9263194101362), (- 3,16426957768543 55,9263194101362, -3,16427488261739 55,9262676666359), (- 3,16427488261739 55,9262676666359, -3,16428009893088 55,9262167875066), (- 3,16428009893088 55,9262167875066, -3,164282741107 55,9261910161221), (-3,1642875546472 55,9261440655823, -3,164282741107 55,9261910161221), (- 3,1642875546472 55,9261440655823, -3,16429466890915 55,9260746741522), (- 3,16429466890915 55,9260746741522, -3,16430092974527 55,9260136069079), (- 3,16430092974527 55,9260136069079, -3,16430822838418 55,9259424170929), (- 3,16430822838418 55,9259424170929, -3,16431547242401 55,925871759829), (-3.16431547242401 55.925871759829, -3.16431448732505 55.9258328901507), (- 3.16431770120536 55.9257327846001, -3.16431547242401 55.92587175982916439 55.925777, -3.16431770120536 55.9257327846001))


Hãy cho chúng tôi một ví dụ về các đa tuyến mà bạn muốn chuyển đổi để chúng tôi có thể kiểm tra chúng.
CaptDragon

Câu trả lời:


6

Bạn cũng có thể sử dụng ST_SnapToGrid để sắp xếp dữ liệu của mình, nhưng bạn sẽ cần phải xử lý các tham số để làm cho đúng.

SELECT ST_AsText(
    ST_LineMerge(
        ST_SnapToGrid(
            ST_GeomFromText('MULTILINESTRING((-3.16420835153456 55.9269166007097,-3.164222 55.926918),(-3.1642070167833 55.9269296196706,-3.16421351659546 55.9268662214904),(-3.16421351659546 55.9268662214904,-3.16421636372824 55.9268384509897),(-3.16421636372824 55.9268384509897,-3.16422182573761 55.9267851753802),(-3.16422182573761 55.9267851753802,-3.16422870102352 55.926718114886),(-3.16422870102352 55.926718114886,-3.16423309121073 55.926675293667),(-3.16423309121073 55.926675293667,-3.16423565148822 55.9266503211093),(-3.16423565148822 55.9266503211093,-3.16424103159897 55.9265978443265),(-3.16424103159897 55.9265978443265,-3.16424680776317 55.9265415044985),(-3.16424680776317 55.9265415044985,-3.16425267254583 55.9264843002995),(-3.16425267254583 55.9264843002995,-3.16425541048045 55.9264575949012),(-3.16425541048045 55.9264575949012,-3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556,-3.1642667032531 55.9263474469124),(-3.1642667032531 55.9263474469124,-3.16426957768543 55.9263194101362),(-3.16426957768543 55.9263194101362,-3.16427488261739 55.9262676666359),(-3.16427488261739 55.9262676666359,-3.16428009893088 55.9262167875066),(-3.16428009893088 55.9262167875066,-3.164282741107 55.9261910161221),(-3.1642875546472 55.9261440655823,-3.164282741107 55.9261910161221),(-3.1642875546472 55.9261440655823,-3.16429466890915 55.9260746741522),(-3.16429466890915 55.9260746741522,-3.16430092974527 55.9260136069079),(-3.16430092974527 55.9260136069079,-3.16430822838418 55.9259424170929),(-3.16430822838418 55.9259424170929,-3.16431547242401 55.925871759829),(-3.16431547242401 55.925871759829,-3.16431448732505 55.9258328901507),(-3.16431770120536 55.9257327846001,-3.16431547242401 55.925871759829),(-3.164339 55.925777,-3.16431770120536 55.9257327846001))'),
            0.001)
        )
    );

25

Bạn có chắc chắn rằng tất cả các MultiLines bạn muốn chuyển đổi có thể được chuyển đổi không?

một hình học đơn giản là một hình học không có điểm hình học dị thường, chẳng hạn như tự giao nhau hoặc tự tiếp tuyến và chủ yếu đề cập đến hình học 0 hoặc 1 chiều

Nếu không, ST_LineMergenên làm việc:

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45 -33,-46 -32))')));

CẬP NHẬT

Vì vậy, đây là Multilinestring bạn cung cấp. Có vẻ hợp lệ từ đây:

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

Nhưng khi phóng to để kiểm tra, bạn có thể thấy rõ điều này không thể được chuyển đổi thành một dòng hợp lệ.

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

CÓ HIỆU LỰC:

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

KHÔNG HỢP LỆ:

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

Nhưng hãy HỢP LỆ tập hợp con của các điểm của bạn và nó hoạt động tốt:

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText('MULTILINESTRING((-3.16422182573761 55.9267851753802,-3.16422870102352 55.926718114886),(-3.16422870102352 55.926718114886,-3.16423309121073 55.926675293667),(-3.16423309121073 55.926675293667,-3.16423565148822 55.9266503211093),(-3.16423565148822 55.9266503211093,-3.16424103159897 55.9265978443265),(-3.16424103159897 55.9265978443265,-3.16424680776317 55.9265415044985),(-3.16424680776317 55.9265415044985,-3.16425267254583 55.9264843002995),(-3.16425267254583 55.9264843002995,-3.16425541048045 55.9264575949012),(-3.16425541048045 55.9264575949012,-3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556,-3.1642667032531 55.9263474469124),(-3.1642667032531 55.9263474469124,-3.16426957768543 55.9263194101362),(-3.16426957768543 55.9263194101362,-3.16427488261739 55.9262676666359),(-3.16427488261739 55.9262676666359,-3.16428009893088 55.9262167875066))')));

Điều này không thực sự chính xác. LineStrings với các giao điểm tự vẫn là OGC hợp lệ. Lý do MultiLineString ban đầu không thể được chuyển đổi thành một LineString duy nhất là vì nó chứa 3 bộ đỉnh khác nhau được kết nối.
dr_jts

@dr_jts Đúng vậy, không phải LineString không hợp lệ mà đầu vào không hợp lệ. bạn không thể chuyển đổi các đường giao nhau. Vì vậy, một đầu vào hợp lệ của linestrings là một không có giao điểm.
CaptDragon

0

Cân nhắc sử dụng ST_SubDivide để chia hình học lớn thành hình nhỏ hơn sau khi phát hành 2.2.0.

Tôi đã xác nhận và thử nghiệm điều này trên MultiLineString để phá vỡ chúng trong LineString.

https://postgis.net/docs/ST_Subdivide.html

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.