เหตุใดการจัดระยะสั้นของ GEAP จึงไม่ทำงานอย่างที่คาดไว้


14

ฉันพยายามถ่ายสองบรรทัดโดยใช้ Shapely / Geopandas แต่ผลลัพธ์ของการจัดเรียงนั้นแปลกมาก ฉันเหนื่อย :

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")

และได้รับผลลัพธ์นี้:

lines1 = เส้นสีแดง

lines2 = เส้นสีดำ

ก่อนที่จะหักมุม

หลังการจัดชิด (ด้วยความอดทน 14 ข้อ): เส้นสีน้ำเงินเป็นผลมาจากการจัดระยะ

ในกรณีนี้เส้นจะถูกจัดชิดอย่างถูกต้อง หลังจากหักมุม

อีกตัวอย่างหนึ่งที่ไม่สามารถทำงานได้ตามที่คาดไว้: (ก่อนการจัดระยะ) ก่อนที่จะหักมุม

และนี่คือผลลัพธ์หลังจากหักมุม มีเพียงส่วนเดียวเท่านั้นที่ถูกจัดชิดกับเส้นสีดำ (ด้านใต้) ถึงแม้ว่าเส้นเดิมจะค่อนข้างใกล้เคียงและภายใน 14 ฟุต หลังจากหักมุม

หากฉันเพิ่มความคลาดเคลื่อนที่ฉันได้รับเอาต์พุตผิด ๆ บางอย่างเช่นนี้ (หลังจากกำหนด 20 ว่าเป็นความอดทนของการจัดชิดเส้นสีเขียวคือผลลัพธ์):

หลังจาก 20 เป็นความอดทน

ความคิดเห็นใด ๆ เกี่ยวกับสาเหตุที่การจัดเรียงทำงานไม่ถูกต้อง ข้อเสนอแนะเกี่ยวกับวิธีการแก้ปัญหานี้?



@ ยีนคุณควรแปลงความคิดเห็นของคุณเป็นคำตอบที่ฉันคิดว่า
nmtoken

คุณสามารถแบ่งปันข้อมูลหรือบางส่วนเพื่อทำซ้ำปัญหานี้ได้หรือไม่?
bugmenot123

2
คู่มือผู้ใช้ Shapely ที่มีให้ 1.6: "ฟังก์ชั่น snap () ใน shapely.ops จะจัดตำแหน่งจุดยอดในรูปทรงเรขาคณิตหนึ่งไปยังจุดยอดในรูปทรงเรขาคณิตที่สองด้วยความอดทนที่กำหนด" อย่างที่ฉันเข้าใจมันไม่ได้ยึดรูปทรงเรขาคณิตที่อยู่ใกล้กัน แต่จะนำจุดยอดของพวกมันเข้าหากัน ดังนั้นหากรูปทรงเรขาคณิตใด ๆ ที่อยู่ใกล้กับรูปทรงเรขาคณิตอื่น ๆ ก็จะยึดจุดยอดของพวกเขาภายในเกณฑ์
Kadir Şahbaz

คำตอบ:


6

shapely.ops.snapฟังก์ชั่นการยึดจุดของรูปทรงเรขาคณิตเท่านั้น

ดูภาพประกอบด้านล่าง ทางด้านซ้ายจุดสุดยอดสีแดงอยู่ในระยะการทนต่อการหักมุมของจุดยอดสีน้ำเงินดังนั้นมันจะหักมุม ด้านขวาจุดยอดสีแดงนั้นอยู่นอกเกณฑ์การหักมุม (แม้จะอยู่ใกล้กับขอบ!)

การสร้างภาพข้อมูลความอดทน

หุ่นดีไม่ได้ให้อัลกอริทึมสำหรับการจัดตำแหน่งจุดยอดไปยังขอบ มันไม่ควรจะยากเกินไปที่จะเขียนโดยใช้shapely.ops.nearest_pointsแม้ว่า บางสิ่งเช่นนี้ (ไม่ผ่านการทดสอบและไม่มีประสิทธิภาพโดยเฉพาะ):

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)

เจ๋งมาก แต่ฉันคิดว่าน่าif p1.distance(p2 <= threshold):จะเป็นif p1.distance(p2) <= threshold:
chrislarson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.