ポイントと複数の線分の間の測地線距離を計算しています。各線分には固有の識別番号があります。私は距離関数から距離を戻したいので、それらは本質的に一緒に結びついています。また、距離をソートする際のように機能を維持し、ラベルまたは位置のいずれかを使用してインデックスを作成し、距離データとラベルの両方を取得したいと考えています。インデックスを持つパンダシリーズのようなものですが、データがパンダのDataFrameに返されるため、シリーズを使用できません。その結果、シリーズが展開され、混乱します。私はしかし、ラベルとの距離は、本質的に相互に関連付けられています。この辞書のようなものである必要は何ラベル付きデータ型Python
In [1]: '''Note that all this happens inside an apply function of a Pandas Series'''
labels = [25622, 25621, 25620, 25619, 25618]
dist = vect_dist_funct(pt, labels) #vect_dist_funct does the computations, and returns distances in meters
dist
Out[1]: array([296780.2217658355, 296572.4476883276, 296364.21166884096,
296156.4366241771, 295948.6610171968], dtype=object)
:ここでは一例である
{25622 : 296780.2217658355,
25621 : 296572.4476883276,
25620 : 296364.21166884096,
25619 : 296156.4366241771,
25618 : 295948.6610171968}
しかし、今、私はの機能を失っています値。私は簡単にそれらを並べ替えることはできません、またはそれらを比較するか、何か。私はNumpy Structured Arraysを見ましたが、それは実行可能なように見えますが、私が距離を並べ替えることができず、最も近いセグメントのインデックスを得ることができない場合、それは私にあまり役に立たないでしょう。私が使用できる他のデータ型はありますか?
ロングストーリーや背景
私が参加した空間をやろうとしています。私はRTree(example)で検索することによって、ポイントが最も近い可能性のあるセグメントのインデックスを取得します。それらはラベルのインデックスです。次に、線の幾何学的な表を見て、選択したラベルの線のジオメトリを見つけ、各線分の点の距離を計算します。
次の手順には、空間結合の健全性チェックが必要です。最も近いものが最良の結合候補ではない場合があり、結合を他のパラメータで評価する必要があります。したがって、私の計画は最も近いセグメントから外側に向かって作業することです。距離をソートし、最も近いセグメントのインデックスを取得し、次にそのインデックスを持つセグメントテーブルを調べ、検査のためにラインの他のプロパティを抽出する。一致が確認できれば、前記セグメントは受け入れられ、そうでなければ拒否され、アルゴリズムは次に近いセグメントに移動する。
これをすべて行うデータ型は、計算されたセグメントの距離の間のリンクを壊すことなく、私が探しているデータ型です。
joined = points['geometry'].apply(pointer, centroid=line['centroid'], tree_idx=tree_idx))
その後pointer
の内側に、この問題が発生した:その後、
def pointer(point, centroid, tree_idx):
intersect = list(tree_idx.intersection(point.bounds))
if len(intersect) > 0:
points = pd.Series([point.coords[0]]*len(intersect)).values
polygons = centroid.loc[intersect].values
dist = vect_dist_funct(points, polygons)
return pd.Series(dist, index=intercept, name='Dist').sort_values()
else:
return pd.Series(np.nan, index=[0], name='Dist')
そして、joined
を
パンダ使用して
問題は、これは関数が実際に呼び出されている方法です次のようになります。
これは、すべての点(行がポイント)とすべてのライン(列がライン)の間の距離が計算されないためです。それはあまりにもコストがかかりすぎるであろう(4Mポイント、州当たり180kライン、データセット全体で50州)。また、このDataFrameマージ操作で生成されたjoined
は、2つのNumpy配列を返す場合と比較して、実行時間が7倍に増加します。 2つのNumpy配列を返す問題は、距離と行IDを常に整列させることは容易ではないということです。ポイント、ラインの
例には、これは列と行に切り捨てデータセットであることを
注tree_idx。私は唯一の関連性の列ではなく、残りのデータを含めています:
ポイント:
geometry
id
88400001394219 0.00 POINT (-105.2363291 39.6988139)
0.25 POINT (-105.2372017334178 39.69899060448157)
0.50 POINT (-105.2380177896182 39.69933953105642)
0.75 POINT (-105.2387202141595 39.69988447162143)
1.00 POINT (-105.2393222 39.7005405)
88400002400701 0.00 POINT (-104.7102833 39.8318348)
0.25 POINT (-104.7102827 39.831966625)
0.50 POINT (-104.7102821 39.83209845)
0.75 POINT (-104.7102815 39.832230275)
1.00 POINT (-104.7102809 39.8323621)
だから、これは基本的にライン上の補間点です。行IDはインデックスの第1レベルであり、第2レベルはポイントが補間されたパーセントです。これは、最初のデータセット、つまり2番目のデータセットからいくつかの属性を取り込むデータセットを形成します。
ライン:
geometry centroid
id
71345 POLYGON ((-103.2077992965318 40.58026765162965... (-103.20073265160862, 40.576450381964975)
71346 POLYGON ((-103.2069505830457 40.58155121711739... (-103.19987394433825, 40.57774903464972)
71347 POLYGON ((-103.2061017677045 40.58283487609803... (-103.19901204453959, 40.57905245493993)
71348 POLYGON ((-103.2052000154291 40.58419853220472... (-103.19815200508097, 40.58035300329024)
71349 POLYGON ((-103.2043512639656 40.58548197865339... (-103.19729445792181, 40.58164972491414)
71350 POLYGON ((-103.2035025651746 40.5867652936463,... (-103.1964362470977, 40.5829473948391)
71351 POLYGON ((-103.2026535431035 40.58804903349249... (-103.19557847342394, 40.58424434094705)
71352 POLYGON ((-103.201804801526 40.58933229190573,... (-103.19472966696722, 40.58552767098465)
71353 POLYGON ((-103.2009557884142 40.59061590473365... (-103.19388484652855, 40.58680427447224)
71354 POLYGON ((-103.2001001699726 40.59190793446012... (-103.19303392095904, 40.5880882237994)
これが第二のデータセットの一部である(この答えの冒頭で言及したラベルは、このデータセットの指標です)。目標は、このデータセットの属性をポイントデータセットにインテリジェントに転送することです。最初のステップは、各点に最も近い線を見つけることです。次に、ポイントデータセットの属性をラインデータセットと比較し、私が言及したように結合を確認または拒否します。
tree_idx:tree_idxは、次のコードを使用して作成され
:だから
import rtree
lines_bounds = lines['geometry'].apply(lambda x: x.bounds)
tree_idx = rtree.index.Index()
for i in lines_bounds.index:
tree_idx.insert(i, lines_bounds.loc[i])
あなたが持っているが辞書では達成できない機能について詳しく説明できますか? –
私は空間結合をしようとしています。そして、そうすることで、最も近いものが必ずしも正しい結合パートナーとは限りません。結合を確認する前に調べる必要がある他のパラメータがあります。だから私の計画は、私が行くように、最も外側からチェックし、確認したり拒否したりすることです。辞書は構造化されておらず、ソートされて保存することはできません。また、辞書は位置によってインデックス可能ではなく、手前のすべてのセグメントのキーを知ることはできません。 – Kartik
あなたのケースでパンダシリーズ/ DataFrameを使用できない理由を説明できますか?パンダは正確に説明したものです(値とラベルの間のリンクを維持していますが、まだ値を使用して並べ替えることができます) – joris