PostGISでサークルを作成しますか?


22

SRID:900913のジオメトリでPostGIS 1.5.2を使用しています。ポイントのリストを中心として、半径600キロメートルの円を作成する必要があります。私はこのクエリを使用しています:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

ただし、作成された円の半径は600キロメートルではありません(半径はこの長さに近いですが、正確ではありません)。

PostGISで円を作成する他の方法はありますか?

注:表示される情報はスペインからのものです。正しい投影法は4326ですが、クライアントはGoogleラスタを使用するため、再投影を避けてパフォーマンスを向上させるために900913にデータを保存しています。


1
600 kmではないことを確認するために半径をどのように測定しましたか?
暗闇

1
@underdark 2つの都市間の距離と、この都市の1つを中心として使用して生成された円は、他の都市には拡張されません。gmap-pedometer.com
angelcervera


@underdark SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));差の100kmを超えるリターンを使用すると、gmap-pedometer.comを尊重しますが、この長さが正しいと仮定すれば、円の半径は完全です。ただし、最初の距離を半径として使用し、st_distanceによって返される距離は使用しません。最初の距離を2番目の距離に変換することは可能ですか?
angelcervera

回答:


15

これを試して:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

これは、地理に反転し、組み込みのSRID選択を使用して、(皮肉なことに)良好な平面バッファーが実行される幾何形状に反転し、その後反転します。メルカトルでのアプローチの問題は、メルカトルが距離を保持しないことです。より適切なローカル投影を使用すると、より良い結果が得られ、それが上記の方法で発生します。


4

quad_seg値を増やして、より正確な円を取得できます。実際の円を得るには、曲線ジオメトリタイプで作業する必要がありますが、どのソフトウェアがそれを示すことができるかわかりません。

srid 90013の精度も、全世界をカバーする投影であるため非常に悪いです。

ローカル投影により、より正確な結果が得られます。


@ nicklas-aven 4326ではなく900913プロジェクションを使用しているため、600kmの距離で100kmの差が生じる可能性はありますか?
angelcervera

1
はい、可能です。その不正確さgis.stackexchange.com/questions/3264/…を信じられなかったときにPaulsが彼女にコメントしていることを確認してください。問題は、4326が投影されないことです。
ニックラスアベン

3

サークルが作成される場所によって異なります。それらは赤道に近いのですか、それとも極に近いのですか?

この地図を見てください。アンタルティカやグリーンランドは本当に大きいと思いますか?それはあなたが使っている投影法ですよね?

プロジェクションに関するこのUSGSドキュメントをすばやく読むことをお勧めします。特に、どのプロジェクションが何に適しているかを簡単に理解できる下の表をご覧ください。

そして、すべての後、私は最終的にあなたの質問に答えるべきだと思います:)

ニックラスが言ったことは良いアドバイスでした。あなたの地域でより良く機能する特定の予測はありますか?

それ以外の場合は、新しいPostGIS Geographyタイプを確認することをお勧めします。それでも、最も適切な答えはデータがどこにあるかによって異なります。

更新:データがスペインにあることがわかったので、UTM Zone 31Nのようなローカル投影に保存し、それを使用して操作を実行してから、それらをGoogle Webメルカトルに投影することを検討しましたか?


1
すばらしい地域をカバーする地図に地理タイプを使用するための+1 ここでの問題は、postgisにgeographyタイプのネイティブバッファー関数がないことです。しかし、「ベストsrid」への組み込みキャストがあり、バッファを構築してから4326に戻ります。したがって、データを把握して手動でsridを選択すると、より適切な制御が可能になります。
ニックラスアベン

ニックラス、あなたはキャスティングについては正しいですし、ローカル投影(つまり、あなたのデータを知っている)について100%同意します。それでも、答えが「世界規模の」データ、IMHOを持ちたいだけである場合、Geographyタイプ内のキャストロジックは、SRが他のどの操作よりもその特定の距離操作に適切であるかを判断するのにはるかに優れた仕事をします複雑なカスタムロジック。地理タイプについてのもう1つの良い点は、現在、多くの操作がデカルト数学にキャストされていますが、球数学を使用するように操作が更新され続けることです。
Ragi Yaser Burhum

2

新しいSQL / MMパート3ジオメトリタイプCIRCULARSTRINGおよび/またはCURVEPOLYGON を使用できます。

ただし、このタイプのサポートは、内部機能と外部プログラムの両方で制限されていることに注意してください。ST_CurveToLineを使用して視覚化することができます。

さらに、それは(PostGIS 2.0 svnの時点で)少し​​おかしくなりますが、これはπのSELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)大まかな近似にすぎません。(3.14033115695475と3.14159265358979をから比較してください)。pi()


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