2016-12-21 4 views
2

私はPostGISの新機能で、データベースに緯度と経度(2次元ポイント)を格納する新しい場所の列を作成したいと考えています。後で私はこれらの2つのポイントの間の距離を見つけることができるようにしたいと思うでしょう。postGISを使用してポイントを追加して距離をマイル単位で計算する正しい方法

私が次のクエリを実行して、私が欲しいものを達成することができそうです:

CREATE EXTENSION postgis; 

CREATE TABLE places (
    id SERIAL PRIMARY KEY, 
    name VARCHAR(500) NOT NULL, 
    location geometry NOT NULL 
); 

INSERT INTO places (name, location) 
VALUES ('The Place of Luke', ST_SetSRID(ST_MakePoint(-71.1043443253471, 42.3150676015829),4326)), 
('The Place of Bob', ST_SetSRID(ST_MakePoint(-75.1043443253471, 43.3150676015829),4326)); 

SELECT ST_Distance(
     (SELECT location FROM places WHERE name = 'The Place of Luke'), 
     (SELECT location FROM places WHERE name = 'The Place of Bob') 
    ); 

私は、これは正しく4.12310562561766の緯度と経度で距離を返しているが、私はベストプラクティスについていくつかの質問を持っていると信じています。

  1. geometryは、私が達成しようとしている正しいタイプですか?

    CREATE TABLE places (
        id SERIAL PRIMARY KEY, 
        name VARCHAR(500) NOT NULL, 
        location point NOT NULL 
    ); 
    
    INSERT INTO places (name, location) 
    VALUES ('The Place of Luke', ST_MakePoint(-71.1043443253471, 42.3150676015829)), 
    ('The Place of Bob', ST_MakePoint(-75.1043443253471, 43.3150676015829)); 
    
    SELECT ST_Distance(
        (SELECT location FROM places WHERE name = 'The Place of Luke'), 
        (SELECT location FROM places WHERE name = 'The Place of Bob') 
    ); 
    

    が、私はERROR: column "location" is of type point but expression is of type geometryを取得保管:私はpointからgeometryを変えてみました。私はST_MakePointがおそらくタイプgeometryのものを作成しようとしていることを理解していますが、それはエラーを引き起こしていますが、どのようにタイプポイントを作成するのですか?

  2. documentationは私の場所テーブルに直接列を追加するのではなく、AddGeometryColumn()を使用しなければならないと主張しているようですが、私のアプリケーションが成長するにつれてこれが問題になるかどうかは分かりません。私がする必要があるのは、2つの場所(2次元平面上)の間の距離を土地別の移動距離で見つけることです。これは私の問題ですか?
  3. この結果を何マイル(場合によってはキロメートル)に変換することができますか?すべて別のクエリを実行する必要がありますか?経度と緯度を理解することで、この数値が返されても、マイルへの単純な線形変換ではないと考えられます。

答えて

2
  1. あなたはPostGISのを使用している場合は、[はい、pointを使用することはありませんが。ポイントはネイティブタイプです。PostGISはあなたが望むだけの拡張機能です。すべてが4326にある場合は、geographyタイプを見てそれを使用する必要があります。
  2. PostGIS 1.xを使用していない限り、AddGeometryColumn()を使用しないでください。 PostGIS 2.xは型修飾子をサポートしていますので、代わりにALTER TABLEを使用できます。
  3. は、マイルを取得使用するには、単にキロを返し、* 0.621371192

これは少し奇妙な、しかし、機能的です。

SELECT ST_Distance(
    (SELECT location FROM places WHERE name = 'The Place of Luke'), 
    (SELECT location FROM places WHERE name = 'The Place of Bob') 
); 

通常は、バッチで作業していますが、あまりにも意図しているとして、それが相関サブクエリで動作し、JOINでこれを参照してください。

SELECT 
    l1.location, 
    l2.location, 
    ST_Distance(l1.location, l2.location) 
FROM location AS l1 
JOIN location AS l2 
    ON l2.location = 'The Place of Luke' 
WHERE places = 'The Place of Bob'; 
+0

また、このような質問はgis.stackexchange.comでうまく答えられます。 –

1

私はgeographyデータ型にキャストして

ST_Distance(location1::geography, location2::geography)よう

  • クエリが、結果はmetersにある場所のデータ型として

    • 使用geography(Point,4326)を使用することをお勧めします、度の代わりに意味がありません。 (ほとんどのGPSデータが参照されているもの)4326はWGS84と同じシステムであることに注意してください

      はまた、より多くの詳細については、このQ/Aを参照してください:

      https://gis.stackexchange.com/questions/76967/what-is-the-unit-used-in-st-distance

      編集:

      再:AddGeometryColumnそれはその機能を使用する必要はありません、それは私の知る限り便利です。

      編集:

      追加のノートではなく、あなたがについて尋ねた何かが、PostGISの中に空間インデックスのタイプもあります:

      CREATE INDEX loc_idx ON places USING gist (location); 
      
  • 関連する問題