境界ボックス内のすべてのポイントを選択します


11

この質問は以前に聞いたことがありますが、私が試みている答えは機能していません。

境界ボックス内にあるすべてのOSMウェイを照会したいと考えています。OSMデータは、デフォルトの球状メルカトールでインポートされました。LAT / LONを使用してクエリを実行しているため、変換

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

これを実行すると、次のエラーが表示されます。

エラー:WHEREの引数は、タイプジオメトリではなくブール型でなければなりませんLINE 3:WHERE ST_Transform(ST_MakeEnvelope(37.808264、37.804339、-12 ...


1
読んでクエリの作成に使用した古い質問へのリンクを提供します。
user30184

あなたのST_MakeEnvelope(順序を座標)彼らはこの形式であるようには見えませんが、XMIN、YMIN、XMAX、YMAX
artwork21

@ artwork21 ST_MakeEnvelopeでlat / longを使用しています。それは間違っていますか?これを別の形式に変換する必要がありますか?私はST_Transformは何をやっていたのは、と思った
theartofbeing

1
申し訳ありませんが、スキーマ文書を含むすばらしいマニュアルをもう一度読む必要がありましたwiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways。Planet_osm_waysにはジオメトリが含まれておらず、エンドユーザーにとってはあまり役に立ちません。システム用です。そのテーブルから境界ボックスクエリを作成する機会はありません。planet_osm_roadsのようなテーブルでは可能です。スキーマからわかるように、planet_osm_roads.wayという名前が付けられているため、まだplanet_osm_roads.geomは存在しません。
user30184

1
いいえ。planet_osm_waysからバウンディングボックスクエリを実行できないと言いました。なぜなら、そのテーブルにはジオメトリがないからです。参照:id、ノード、タグ、保留中-ジオメトリを含むものはありません。テーブル_line、_point、_polygon、および_roadsは問題ありません。そして、すべてのジオメトリテーブルのジオメトリ列の名前が「geom」などではなく「way」と命名されていることを強調しました。
user30184

回答:


14

エラーメッセージはその一部のみを暗示していますが、ステートメントには3つの問題があります...

  1. ST_MakeEnvelopeは、次の順序でパラメーターを要求しますxmin, ymin, xmax, ymax, srid

    を間違って渡しましたymax, ymin, xmax, xmin, srid

  2. WHEREはブール値に評価する必要があります。

    ジオメトリとエンベロープに共通要素があるかどうかを判断するには、次のようにWHEREを構築する必要がありWHERE geom && envelope_geomます。それ以外の場合は、ST_Containsを使用できます

    ジオメトリがエンベロープ内に含まれているかどうかを確認するには: `WHERE ST_Contains(envelope_geom、geom)

    の比較方法を指定しませんでしたWHERE

  3. テーブル「planet_osm_ways」にはジオメトリ列は含まれませんが、「planet_osm_roads」には「way」という名前のジオメトリ列が含まれます。

    関連するplanet_osm_nodes.latおよびplanet_osm_nodes.lonからテーブル「planet_osm_ways」にジオメトリ列を作成できます。

「planet_osm_roads」を使用して、ジオメトリ列を持つテーブルに対してバウンディングボックスを使用する方法を示します。

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

またはこれに変更します:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.