Shapely'nin yakalanması (GEO yakalamaları) neden beklendiği gibi çalışmıyor?


14

Ben Shapely / Geopandas kullanarak birbirlerine iki satır snap çalışıyorum ama yapışma sonucu çok garip. Denedim :

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

Ve bu sonucu aldım:

lines1 = kırmızı çizgiler

lines2 = siyah çizgiler

Yapışmadan önce

Yapışma işleminden sonra (tolerans olarak 14 ile): mavi çizgiler yapışma işleminin sonucudur

Bu durumda, çizgiler doğru şekilde takılır Yapışmadan sonra

Beklendiği gibi çalışmadığı başka bir örnek: (yapışmadan önce) Yapışmadan önce

Ve işte yakalamanın sonucu. Siyah hatta (güney tarafı) sadece bir parça takılır. Orijinal çizgiler oldukça yakın ve 14 ayak içinde olmasına rağmen Yapışmadan sonra

Toleransı arttırırsam yanlış bir çıktı elde ederim, böyle bir şey (20 yapışma toleransı olarak tanımladıktan sonra, yeşil çizgi sonuçtur):

Tolerans olarak 20'den sonra

Yapışma neden düzgün çalışmıyor? Bu sorunun nasıl çözüleceğine dair herhangi bir öneriniz var mı?



@gene Yorumunuzu bence bir cevaba dönüştürmelisiniz.
nmtoken

Bu sorunu yeniden oluşturmak için verileri veya bir kısmını paylaşabilir misiniz?
bugmenot123

2
Sağlanan Shapely 1.6 Kullanıcı Kılavuzu: "shapely.ops içindeki snap () işlevi, belirli bir toleransla bir geometrideki köşeleri ikinci bir geometrideki köşelere yapıştırır." Anladığım kadarıyla, birbirine yakın olan geometrileri, köşelerini birbirine yakın tutturuyor. Dolayısıyla, herhangi bir geometri diğer geometriye yakınsa, köşelerini eşiklerine tutturur.
Kadir Şahbaz

Yanıtlar:


6

shapely.ops.snapİşlevi yalnızca geometrilerin köşe yapışır.

Aşağıdaki çizime bakın. Solda, kırmızı tepe mavi tepe noktasına yapışma toleransı dahilindedir, bu yüzden yerine oturur. Sağda kırmızı tepe (kenara daha yakın olmasına rağmen!) Kopma toleransının dışındadır.

yakalama toleransı görselleştirme

Shapely, köşeleri kenarlara yapıştırmak için bir algoritma sağlamaz. Kullanarak yazmak çok zor olmamalı shapely.ops.nearest_points. Böyle bir şey (test edilmedi ve özellikle verimli değil):

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)

Çok güzel ama bence if p1.distance(p2 <= threshold):olmalıif p1.distance(p2) <= threshold:
chrislarson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.