10

ポリライン全体をデコードおよび再エンコードせずに、新しくエンコードされたポリラインを既存のポリラインとマージしようとしています。新しいエンコードされたポリラインは、既存のポリラインに追加したい (Linux) サーバーにアップロードされます。

問題は、それらを一緒にマッシュアップできないことです。以下は、操作するサンプル データです。PHPまたはシェルスクリプトで解決策を見つけて作成することを望んでいますが、問題は、エンコードされたポリラインアルゴリズムを解釈するのに十分な技術的理解がどこにもないことです。

41.386692,-73.475912
41.424822,-73.375027
41.428292,-73.311173
41.426183,-73.254577
41.470168,-73.218532
41.498865,-73.155278
(Yes, 6 points are easy, but it's going to be more like 7,000 coordinate pairs)
  • エンコードされた最初の 3 つの座標ペア:yir{Fnwm_MimFquRuTanK
  • 最後の 3:s`z{Fbpb~L{qGg`FkrDkjK
  • すべて 6:yir{Fnwm_MimFquRuTanKdLw`J{qGg`FkrDkjK

インタラクティブ ポリライン エンコーダー ユーティリティ
エンコードされたポリライン アルゴリズム形式 (インタラクティブ エンコーダー経由で取得できます)
ポリライン エンコーダー

編集:

両端のポリラインをエンコードした元のデータもあります。したがって、最初と最後の座標ペアを別々に保存することもできます。

参考資料:

エンコードされたポリラインがどのように機能するかについて、より詳細なブログ投稿を書くことになりました。ここで読むことができます:エンコードされたポリラインとは?

4

4 に答える 4

9

これは、エンコードのアルゴリズムを示しています: http://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html

デコーダは Mark McClure 教授 ( http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/decode.html ) から入手できます。

エンコードでは、ポイント間のオフセット (デルタ) が使用されます。最初の点のオフセットは (0,0) から計算されるため、最初の点の座標と等しくなります。2 番目のポイントは、ポイント 1 からのポイント 2 のオフセットとしてエンコードされます。

2 つの線を結合するには、まず最初の線の最後の点と、2 番目の線の最初の点を見つける必要があります。

次に、ライン 1 の最後のポイントからのライン 2 のオフセットを計算し、そのオフセットを 2 番目のラインの最初の座標に置き換えます。したがって、2 行目は (0,0) からのオフセットではなく、最初の行の終わりからのオフセットで始まります。

ここで、最初の行の最後のポイントを再エンコードして、さらに続く必要があることを示す必要があります。

各行のエンコードされた各ポイントは可変数の文字で構成されている可能性があるため、行全体をデコードせずに任意のポイント (最初のポイントであっても) を見つけるのは容易ではありません。

つまり、作業を行うには、デコードと再コーディングを行う必要があります。各行をポイントの配列にデコードしてから、全体を再エンコードするのがおそらく最も簡単です。PHP でのエンコードは迅速かつ簡単です。McClure のサイトをもう一度参照してください。

これは、エンコードされた各ポイントの長さが厳密に 5 文字であると誤って仮定した Google マップ バージョン 2 グループでの回答と矛盾しています。


UNCA は 2013/14 年にスタッフのウェブ プレゼンスを再編成し、McClure 教授の研究へのアクセスは現在archive.orgからのみ可能です。エンコードされたポリラインの説明は引き続き利用可能で関連性がありますが、Javascript に依存する例は機能しなくなる可能性があります。

于 2012-02-11T20:28:58.160 に答える
6

わかりましたので、私はそれを理解したと思います。アルゴリズムが実際にどのように機能するかを平易な英語で説明してくれたAndrew Leachに感謝します。

問題:新しいエンコードされたポリラインを既存のエンコードされたポリラインとマージする

解決策:既存のポリラインの最後の座標ペアを保持し、そのペアだけをエンコードして後で保存し、この新しいエンコーディングの先頭にある既存のポリラインの座標を使用してすべての新しい座標をエンコードします。最後の座標ペアの文字列を見つけ、それを新しいエンコードされたポリラインから削除し、新しいエンコードされたポリラインを既存のポリラインの背面に貼り付けます

知っておくべきこと:エンコーディングが行うことは、オフセット (x、y からの距離) を計算し、その値を ASCII に変換することです。問題は、最初の座標が 0,0 から計算されるため、2 つのエンコードされたポリラインを一緒に配置した場合、新しいポリラインを追加した場合、既存のポリラインからのオフセットではなく、0,0 からのオフセットで大きなジャンプが発生することです。ポリライン。必要なことは、エンコードされたポリラインのどの文字が 0,0 からのオフセットであるかを見つけて、それらを削除することです。次に、新しい行を古い行に追加すると、適切にオフセットされます。

以下のリンクをクリックして、すべての記事と良いコメントを確認してください。また、効率化できるところがあれば教えてください!

PasteBin: ソリューションの PHP 実装

于 2012-02-12T17:50:33.663 に答える
1

デコードはブラウザによって実行されます。ブラウザに個別の線分を送信して、デコードおよび連結することができます。ポリラインは、単一の「パス」プロパティを受け入れます。ポリゴンは、パスの配列で複数の「パス」プロパティを受け入れます。ポリラインとポリゴンの唯一の違いは、「塗りつぶし」カラーと「塗りつぶし」不透明度の有無です。ポリラインを「塗りつぶし」プロパティのないポリゴンとして宣言すると、個々のピースからマルチセグメント ラインが作成されます。

PS - 「stackoverflow」エディタは本当に最悪です。

于 2012-02-12T16:00:29.847 に答える
0

サーバー上で連結を行う必要がない場合があることをお勧めします。代わりにブラウザで実行してください。すべてのデコードはブラウザで行われます。デコードされた配列をjavascriptとつなぎ合わせるのは非常に簡単です。「スプライス」メソッドを使用することも、各コンポーネント配列を反復処理することもできます。

于 2012-02-12T17:30:21.297 に答える