Tại sao ảnh chụp nhanh của Shapely (GEO snaps) không hoạt động như mong đợi?


14

Tôi đang cố gắng chụp hai dòng với nhau bằng Shapely / Geopandas nhưng kết quả của việc chụp rất kỳ quặc. Tôi đã thử:

import geopandas as gpd
from shapely.geometry import *
from shapely.ops import snap

lines1 = gpd.GeoDataFrame.from_file('lines1.shp')
lines1 = lines1.to_crs({'init': 'epsg:2227'})
lines2 = gpd.GeoDataFrame.from_file('lines2.shp')
lines2 = lines2.to_crs({'init': 'epsg:2227'})
res = lines1
lines2_union = lines2.geometry.unary_union
res.geometry = res.geometry.apply(lambda x: snap(x, lines2_union, 14))
res.to_file('result.shp', driver="ESRI Shapefile")

Và nhận được kết quả này:

dòng1 = dòng màu đỏ

dòng2 = dòng màu đen

Trước khi chụp

Sau khi chụp (với 14 là dung sai): các đường màu xanh là kết quả của việc chụp

Trong trường hợp này, các dòng được ngắt chính xác Sau khi chụp

Một ví dụ khác mà nó không hoạt động như mong đợi: (trước khi chụp) Trước khi chụp

Và đây là kết quả sau khi chụp. Chỉ một phần được chụp vào đường màu đen (phía nam). Mặc dù các dòng ban đầu khá gần gũi và trong 14 feets Sau khi chụp

Nếu tôi tăng dung sai tôi nhận được một đầu ra sai, đại loại như thế này (sau khi xác định 20 là dung sai của ảnh chụp, đường màu xanh lá cây là kết quả):

Sau 20 như một sự khoan dung

Bất kỳ ý tưởng về lý do tại sao snapping không hoạt động đúng? Bất kỳ đề xuất về cách giải quyết vấn đề này?



@gene bạn nên chuyển đổi nhận xét của bạn thành một câu trả lời tôi nghĩ.
nmtoken

Bạn có thể chia sẻ dữ liệu hoặc các phần của nó để tái tạo vấn đề này?
bugmenot123

2
Được cung cấp Hướng dẫn sử dụng Shapely 1.6: "Hàm snap () trong shapely.ops chụp các đỉnh trong một hình học với các đỉnh trong hình học thứ hai với dung sai cho trước." Theo tôi hiểu, nó không chụp các hình học gần nhau, nó không khớp với các đỉnh của chúng gần nhau. Vì vậy, nếu bất kỳ hình học nào gần với hình học khác, nó sẽ chộp lấy các đỉnh của chúng trong ngưỡng.
Kadir ahbaz

Câu trả lời:


6

Các shapely.ops.snapchức năng chụp tới các đỉnh của hình học duy nhất.

Xem hình minh họa dưới đây. Ở bên trái, đỉnh màu đỏ nằm trong dung sai chụp với đỉnh màu xanh, vì vậy nó sẽ chụp. Ở bên phải, đỉnh màu đỏ nằm ngoài dung sai chụp (mặc dù gần cạnh hơn!).

chụp trực quan dung sai

Shapely không cung cấp một thuật toán để chụp các đỉnh thành các cạnh. Không nên quá khó để viết một cái bằng cách sử dụng shapely.ops.nearest_points. Một cái gì đó như thế này (không được thử nghiệm, và không đặc biệt hiệu quả):

from shapely.ops import nearest_points

def snap(g1, g2, threshold):
    coordinates = []
    for x, y in g1.coords:  # for each vertex in the first line
        point = Point(x, y)
        p1, p2 = nearest_points(point, g2)  # find the nearest point on the second line
        if p1.distance(p2 <= threshold):
            # it's within the snapping tolerance, use the snapped vertex
            coordinates.append(p2.coords[0])
        else:
            # it's too far, use the original vertex
            coordinates.append((x, y))
    # convert coordinates back to a LineString and return
    return LineString(coordinates)

Rất tuyệt nhưng tôi nghĩ là if p1.distance(p2 <= threshold):nênif p1.distance(p2) <= threshold:
chrislarson
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.