Webメルカトル図法での距離測定の改善


10

私はESRIスタックを使用して、レイヤーをsql-spatial-enabled-SDE-ジオデータベース(Geometryタイプ、Web Mercator-3857)に保存しています。

私はWebマッピングアプリケーションを構築しています。そのため、デフォルトでは、タイルはWebメルカトル3857にもあります。

ストアドプロシージャを介して、STDistanceを使用して、ユーザーの場所(Webメルカトルの座標)からさまざまなレイヤーまでの距離をクエリします。

問題は、ウェブメルケーターの歪みのために、赤道から遠ざかるにつれて、距離計算がますますオフになっていることです。

レイヤーを(ジオメトリではなく)sql-spatial-geographyタイプで保存することを考えましたが、次のようになります。

  • 私の距離クエリははるかに長くかかると思います(球面上の距離計算)
  • 大量のデータを再インポートする必要があります
  • Arcgisサービスは、オンザフライで投影する必要があるほど高速ではありません

Googleマップに移動して距離計算を行うと、Nortern / Southernリージョンでも、返される距離がはるかに正確になるため、GoogleはWebメルカトル図法による歪みを補正する必要があると思います。

私の質問:「正しい」距離を得るためにWebメルカトル図法で行われる距離計算に適用できる単純な係数値はありますか?

回答:


12

cos(lat)メルカトル図法のスケールは緯度の正割(正割は1/cos)に比例するため、短い距離の場合は計算された距離にを掛けることができます。http://en.wikipedia.org/wiki/Mercator_projection#Mathematics_of_the_projectionも参照して ください


@ jeremiah-englandによる補遺:上記の修正は真のメルカトル図法に関しては正しいものですが、Webメルカトル(EPSG:3857)はメルカトルではありません。EPSGはこれを「擬似メルカトル」と呼んでいます。問題は、楕円モデルであるWGS84を使用し、球面メルカトル計算(Googleがより高速なために使用した計算)を使用して投影することです。1/cos(phi)Webメルカトルを使用して距離を拡大すると、赤道で約0.6%オフになります。詳細については、Webメルカトルに関するNoel Zinnのプレゼンテーションを参照してください。

上記のプレゼンテーションによれば、次の方法を使用して、ウェブメルカトル座標からのより正確な距離を計算できます。指定dx—水平座標差(WE方向)、およびdy—垂直座標差(SN方向):

e = 0.081819191
adjustedX = dx * cos(lat) / sqrt(1 - e^2 * sin(lat)^2)
adjustedY = dy * cos(lat) * (1 - e^2) / pow(1 - e^2 * sin(lat)^2, 3/2)
adjustedDistance = hypot(adjustedX, adjustedY)

この調整との比率は、赤道から極cos(lat)までの範囲でSN方向に大きくなります。WE方向比は、赤道で始まり、極で増加します。0.99331.003411.0034

この修正は、地表の平面形状を想定できる短い距離でのみ、依然として十分に機能することに注意してください。


1
また、距離が長い場合は、2つの端点の平均緯度を使用できます。cos((l1 + l2)/2)これにより、大円の距離ではなく、横線/一定のコース距離が得られます。
MerseyViking 2011

これは回転楕円体を変更するだけですが、ローカル投影のような同じ精度は提供しません。
ファルカシバル

1
@falcibar-平均緯度を選択すると回転楕円体がどのように変化するかわかりません
mkadunc '12

@MerseyViking:おかげで、計算に使用するのに最適な緯度は2つの比較されたポイントの平均になることを忘れていました。
mkadunc

1
答えは+1。@マージー:なぜ平均緯度補正が機能するのですか?結局のところ、メルカトル図法のゆがみは任意に大きくなる可能性があり、測地線からロクソドロームの逸脱も大きくなる可能性があります。単純な修正では信頼できないような、潜在的に巨大なエラーがいくつかあるようです。
whuber

6

GEOGRAPHYグローバルデータの正確な結果を探している場合は、データを再度形式で保存する2番目のオプションを検討します。

テーブルに2つの空間フィールドがあることを妨げるものは何もありません。1つはGEOMETRYタイプとしてMercatorに、もう1つはGEOGRAPHYタイプとしてWGS84 にあります(少なくともSQL Serverでは、ArcSDEについてはわかりません)。

両方のフィールドに元のデータを入力する簡単なジオプロセシングスクリプトを作成できるはずです。編集および頻繁な更新が行われている場合、これはオプションではない可能性があります。

2つのフィールドを取得したら、メルカトルを使用して高速表示を続け、ユーザーが入力したポイントを距離の緯度/経度に変換できます。

これには2つの大きな利点があります。

  • また、ユーザーのクエリに基づいて、フィーチャのより正確な領域と長さを取得できます
  • 測定を処理する各クエリにカスタムコードを追加するのを忘れることを心配する必要はありません

クエリの速度はより複雑になりますが、ユーザーには気付かない場合があります。ソリューションを決定する前に、1つのフィーチャクラスでテストすることをお勧めします。また、ユーザーが入力したポイントをメルカトルから変換する必要があります(これは簡単なことであり、ブラウザーで実行できます)。

地理タイプを使用しても、エラーマージンはまだあります。

地理メソッドの許容誤差は、1.0e-7 *エクステントまで大きくなる可能性があります

MSDNから


残念ながら、SDEは1つの空間列のみを許可します:help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… -ビューを作成してSDEに登録しようとしていませんが、可能なアプローチである。
Allan Adair、2011

@アラン-知っておくと良い。SDEを使用するもう1つのメリットは、次のとおりです。4326ジオメトリのみのテーブルと、元のテーブルへの結合+空間ビューは、同じ目的を達成するはずです
geographika

3

ESRIからの別の提案は、「ジオメトリサービス」を使用することです。これには、ジオメトリをArcGIS Serverに送信して結果を返すことが含まれます。Webサービスを使用してボトルネックの問題を予期しない場合、これは非常に効果的なアプローチになる可能性があります。Silverlightアプリケーションでも同じアプローチを使用しました。

ここではESRIから元のブログのエントリは次のとおりです。 http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-projection.aspx

ブログには、簡略化されたJavaScriptの例があり、完全なサンプルアプリケーションもここにあります。http//serverapps.esri.com/javascript_examples/compare_measurements.htm


0

Google Earthと同じように、ジオメトリをローカルWGS84ゾーン投影、または南米のSIRGASのような拡張WGS84投影に変換できます。

あなたはで見ることができるhttp://www.spatialreference.orgほぼすべての「zonified」投影の座標について、あなたは彼らがゾーンに依存して変換する、など、テーブルを作ることができます。

テーブルゾーンを想像します

|   minx     |    miny    |    maxx    |   maxy     |  srid  |
+------------+------------+------------+------------+--------+
|234567.34314|234567.34334|234567.34334|234567.34334|  1234  |

Spherical Mercator(Web Mercator)に保存されているすべてのminx、miny、maxx、maxyの値。そのため、例としてpostgisを使用します。

SELECT ST_Distance(
         ST_Transform( -- transform/reproject
            ST_SetSRID(geom_line, 3857) -- geom_line with forced srid assignation to web mercator
            , ( -- here we get the first SRID from the spatial position of geom_line
                 SELECT  srid
                 FROM    zones
                 WHERE   ST_Contains(
                           ST_MakeBox2d(ST_Point(minx,miny),ST_Point(maxx,maxy))
                           , geom_line
                         )
                 LIMIT 1
            ))

これがお役に立てば幸いです。


確かではありませんが、ブロムスターの質問での「STDistance」の使用に基づいて、彼はPostGISを使用していないようです。BlomsterがSQL Serverを使用している場合、ST_Transform機能はありません。
Allan Adair

私はそれを解決するためのプロセスと最善の方法を提供します。彼は残りの部分を処理でき、ソフトウェアの再投影を使用できますが、SQL Serverが投影を処理しないのは残念です。
ファルカシバル2011

多分CLRが有効で、.netライブラリnettopologysuiteが役に立ちますか?
ファルカシバル

0

OpenLayersには、楕円体上の2つのEPSG:4326(WGS84)ポイント間の距離を計算するユーティリティメソッドがあります。OpenLayersはオープンソースであるため、実装方法は次のとおりです。https//github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750

OpenLayersおよびMeasureコントロールを使用している場合は、オプションのリテラルで測地線を有効にして、この計算を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.