Geopandas Çizgi Çokgen Kavşağı


12

Birden çok çizginin iki farklı coğrafi veri çerçevesi için bir çokgenin kesiştiği yeri bulmaya çalışıyorum:

from shapely.geometry import Polygon, LineString
import geopandas as gpd

polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
line1 = LineString([(0.5, 0.5), (0.7, 0.7)])
line2 = LineString([(0.9, 0.9), (0.2, 0.6)])


poly_gdf = gpd.GeoDataFrame(geometry=[polygon])
line_gdf = gpd.GeoDataFrame(geometry=[line1, line2])

Yukarıdaki geodataframes böyle görünüyor (biri çokgene diğeri iki çizgiye sahip). Bana her iki çizginin de poligonla kesiştiği anlaşılıyor:

Çokgen ve Çizgiler

Ancak, kesişen çıktı çok kafa karıştırıcı:

print(line_gdf.intersects(poly_gdf))

0 Gerçek

1 Yanlış

print(line1.intersects(polygon))
print(line2.intersects(polygon))

Doğru

Doğru

geopandas intersectYöntem neden standart olana farklı bir çıktı veriyor shapely?

Anaconda'da Python 3.5.3 ve Geopandas 0.2.1 kullanıyorum.


Dediğinizde print(line.intersects(polygon))Sen erişim bildiğim kadarıyla gördüğünüz gibi tanımlı değil değişken. Sen tanımladığınız line1ve line2kod önceki. Bunun neden True'ya döneceğini bilmiyorum.
Paul

2
Bunun cevabını da bilmek istiyorum. Bir coğrafi veri çerçevesine yalnızca tek bir geometri sütunu atayabileceğiniz anlaşılıyor. Sanırım line_gdf veri çerçeveniz iki geometri sütunu eklemeye çalışıyor. Check out geopandas.org/data_structures.html#geodataframe
Paul

@ Özür dilerim, print(line.intersects(polygon))bir yazım hatasıydı. line1Asıl ne demek istediğimi belirtmek için soruyu güncelledim .
bgordon

@Paul Belgelerden, iki geometri sütununun nasıl bir soruna neden olacağını görebiliyorum, ancak ilk başta neden iki geometri sütununun ekleneceğinden emin değilim.
bgordon

line_gdf.infoyalnızca tek bir geometri sütununuz olduğunu onaylar. Şoktayım. Bir şey bulursam takip edeceğim.
Paul

Yanıtlar:


8

Geodataframları Geopandas'daki geometri işlemleriyle karşılaştırırken, geometriler ilk önce indeksle eşleştirilir. Eşleşen bir dizin olmadığı durumda (örneğin yalnızca tek bir çokgeniniz olduğu için) sonuç elde edilir False.

Eğer her nesneyi karşılaştırmak GeoSeriesisteseydi, bunun yerine boole değerlerinin tam bir dikdörtgen veri çerçevesini geri almanız gerekir ve bu muhtemelen çok verimsiz olurdu.

Tüm geometrileri karşılaştırmak istiyorsanız, iki seçeneğiniz vardır. Birincisi (ve muhtemelen en kolayı) geopandas sjoinyöntemini kullanmaktır :

gpd.sjoin(line_gdf, poly_gdf, op='intersects')

Bu GeoDataFrame, sağ veri kesiştiği her bir geometri için tekrarlanan sol veri çerçevesindeki her bir nesnenin geometrileriyle, nesnenin dizini sağda olacak şekilde yeni bir değer döndürür , yani:

                        geometry  index_right
0  LINESTRING (0.5 0.5, 0.7 0.7)            0
1  LINESTRING (0.9 0.9, 0.2 0.6)            0

İkinci yöntem bize dikdörtgen veri çerçevesini döndürmek için pandalar applyyöntemidir GeoSeries:

line_gdf.geometry.apply(lambda g: poly_gdf.intersects(g))

Bu da geri döner (veri çerçeveleri büyüdükçe artan verimsizlik ile):

index_right     0
index_left
0            True
1            True

Genel olarak, kare matrise ihtiyacınız yoksa, tavsiyem sjoinyönteme bağlı kalmak olacaktır.

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.