2017-08-13 28 views
-1

私は道路名のための形状ファイルを持っています - 実際にはポリラインジオメトリです。そして、私もアドレスポイントを持っている、私はポリライン形状ファイルを使用して各アドレスポイントの道路名を見つけることを試みている。これを解決する方法はありますか?空間結合を使用しましたが、残念ながらポリラインのジオメトリにすべての点が含まれていないため、動作しません。誰かがこれをどうやって解決するか提案することができますか?ポリラインのポイントを見つける - python

誰もこれに答えなかったので、質問を詳細に説明します。ポイントは(168.04665153、-44.3990252)にあるのであれば、私は(各行の文字列が最小と1以下のような行の最大座標を持つことになります)複数のポリラインの座標で

 min  max 
x 168.04510 168.0480 
y -44.39949 -44.3987 

をシェープファイルを持っている私が知る必要があります上の座標で作られた線。詳細が必要な場合はお知らせください。説明するのが楽しいです。

ありがとうございます。

答えて

0

私は問題が実際に各点に最も近い通りを見つけることだと思います。 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に答えました。

+0

あなたの答えをありがとう。私は今日これを試してみます。しかし、私のポイントは緯度、長いポイントです。これを行う前に座標系を投影する必要がありますか?可能であれば、このスクリプトにrtreeインデックスを追加してください。 –

+0

は、滑らかにデカルト座標を仮定しています。エラーを避けるためにデータを投影することをお勧めします。 チュートリアルや他のリンクの手順に従うと、空間インデックスを追加するのはかなり簡単です。あなたがそれを実装する特定の問題を持っているなら、私は助けてくれるでしょう。 –

+0

@ds_userはうまくいきましたか? –

関連する問題