私は問題が実際に各点に最も近い通りを見つけることだと思います。 GeoPandas.read_file()
を使用してシェイプファイルをインポートし、次の関数を使用して通りの名前を見つけることができます。説明のために、私はちょうどダミーのGeoDataFrameを作成するつもりですが、データのサンプルを提供することができれば、人々があなたの質問に答える方が簡単です。 この関数は次のように機能します。まず、Point
の周りにバッファを作成し、この円内のすべての行を取得します(pt.buffer()
)。次に、ポイントとこれらの線のそれぞれとの間の距離を計算し、最も近いものを選択します。
l1 = LineString([(0,0), (2,3)])
l2 = LineString([(2,3), (3,0)])
pt = Point([1.5,1])
df = pd.DataFrame(['street1', 'street2'], columns=['street_name'])
gdf = gpd.GeoDataFrame(df ,geometry = [l1,l2])
gdf
# street_name geometry
#0 street1 LINESTRING (0 0, 2 3)
#1 street2 LINESTRING (2 3, 3 0)
def get_street_name(gdf, pt):
dist = []
for line in gdf.intersection(pt.buffer(3)):
ind = gdf[gdf.geometry == line].index[0]
dist.append([line.distance(pt), ind])
dist.sort()
true_line_index = dist[0][1]
street_name = gdf.iloc[true_line_index].loc['street_name']
return street_name
get_street_name(gdf,pt)
# out: 'street1'
このソリューションは、高速ではない、あなたは(hereを参照)、それはより速くspatial index
を使用して行うことができます。私は同様の質問hereに答えました。
あなたの答えをありがとう。私は今日これを試してみます。しかし、私のポイントは緯度、長いポイントです。これを行う前に座標系を投影する必要がありますか?可能であれば、このスクリプトにrtreeインデックスを追加してください。 –
は、滑らかにデカルト座標を仮定しています。エラーを避けるためにデータを投影することをお勧めします。 チュートリアルや他のリンクの手順に従うと、空間インデックスを追加するのはかなり簡単です。あなたがそれを実装する特定の問題を持っているなら、私は助けてくれるでしょう。 –
@ds_userはうまくいきましたか? –