7

で円を作る方法を教えてくださいradius=4km。この機能を試してみましたST_Bufferが、より大きな円が作成されます。(ポリゴンを新しい kml ファイルに挿入すると、作成された円が表示されます。)

これが私が試みていることです。

INSERT INTO camera(geom_circle) VALUES(geometry(ST_Buffer(georgaphy(ST_GeomFromText('POINT(21.304116745663165 38.68607570952619)')), 4000)))

SRID円の中心は緯度経度ですが、kmlファイルからインポートしたのでわかりません。SRIDジオメトリなどを変換するために が必要ですか?

4

1 に答える 1

25

KML ファイルは常に緯度/経度で、SRID=4326 を使用します。を使用する場合、この SRID が暗示されますgeography。地理学は、緯度/経度データに 4 km メートル法の測定値を混在させる良い方法です...これを試してみて、すばらしい!

次のステートメントを試してキャストを修正し、パラメーター化されたポイント コンストラクターを使用します。

SELECT ST_Buffer(ST_MakePoint(21.304116745663165, 38.68607570952619)::geography, 4000);

これをジオメトリにキャストする必要がある場合は::geometry、最後にキャストを追加します。


精度の更新

前の回答では、(通常は) ポイントが収まる UTM ゾーンにジオメトリを内部的に再投影します ( ST_Bufferを参照)。ポイントが 2 つの UTM 境界の端にある場合、これにより小さな歪みが生じることがあります。ほとんどの人はこれらのエラーのサイズを気にしませんが、多くの場合数メートルです。ただし、ミリメートル未満の精度が必要な場合は、動的方位角等距離投影法を作成することを検討してください。これにはPostGIS 2.3が必要であり、別の回答ST_Transformから適応されています:

CREATE OR REPLACE FUNCTION geodesic_buffer(geom geometry, dist double precision,
                                           num_seg_quarter_circle integer)
  RETURNS geometry AS $$
  SELECT ST_Transform(
    ST_Buffer(ST_Point(0, 0), $2, $3),
      ('+proj=aeqd +x_0=0 +y_0=0 +lat_0='
       || ST_Y(ST_Centroid($1))::text || ' +lon_0=' || ST_X(ST_Centroid($1))::text),
      ST_SRID($1))
  $$ LANGUAGE sql IMMUTABLE STRICT COST 100;
CREATE OR REPLACE FUNCTION geodesic_buffer(geom geometry, dist double precision)
  RETURNS geometry AS 'SELECT geodesic_buffer($1, $2, 8)'
  LANGUAGE sql IMMUTABLE STRICT COST 100;
-- Optional warppers for geography type
CREATE OR REPLACE FUNCTION geodesic_buffer(geog geography, dist double precision)
  RETURNS geography AS 'SELECT geodesic_buffer($1::geometry, $2)::geography'
LANGUAGE sql IMMUTABLE STRICT COST 100;
CREATE OR REPLACE FUNCTION geodesic_buffer(geog geography, dist double precision,
                                           num_seg_quarter_circle integer)
  RETURNS geography AS 'SELECT geodesic_buffer($1::geometry, $2, $3)::geography'
  LANGUAGE sql IMMUTABLE STRICT COST 100;

関数の 1 つを実行する簡単な例は次のとおりです。

SELECT geodesic_buffer(ST_MakePoint(21.304116745663165, 38.68607570952619)::geography, 4000);

また、バッファリングされた各ポイントまでの距離を比較するために、各測地線(回転楕円体上の最短経路、つまり WGS84) の長さを次に示します。最初にこの関数:

SELECT count(*), min(buff_dist), avg(buff_dist), max(buff_dist)
FROM (
  SELECT ST_Distance((ST_DumpPoints(geodesic_buffer(poi, dist)::geometry)).geom, poi) AS buff_dist
  FROM (SELECT ST_MakePoint(21.304116745663165, 38.68607570952619)::geography AS poi, 4000 AS dist) AS f
) AS f;

 count |      min       |       avg       |      max
-------+----------------+-----------------+----------------
    33 | 3999.999999953 | 3999.9999999743 | 4000.000000001

これを ST_Buffer (回答の最初の部分) と比較すると、約 1.56 m ずれていることがわかります。

SELECT count(*), min(buff_dist), avg(buff_dist), max(buff_dist)
FROM (
  SELECT ST_Distance((ST_DumpPoints(ST_Buffer(poi, dist)::geometry)).geom, poi) AS buff_dist
  FROM (SELECT ST_MakePoint(21.304116745663165, 38.68607570952619)::geography AS poi, 4000 AS dist) AS f
) AS f;

 count |      min       |       avg        |      max
-------+----------------+------------------+----------------
    33 | 4001.560675049 | 4001.56585986067 | 4001.571105793
于 2012-12-14T04:56:12.720 に答える