1

問題: 半径 1 km 以内に少なくとも 2 つの薬局と 2 つの教育センターがあるテーブル内の建物ごとに、すべての POI (薬局、商業センター、医療センター、教育センター、警察署、消防署) を選択する必要があります。 ) は、それぞれの建物から 1 km 以内にあります。テーブル構造->

建物 (ID シリアル、名前 varchar )

poi_category(id serial, cname varchar) --cname はもちろんカテゴリ名です

poi(id serial, name varchar, c_id integer)-- c_id は poi_category(id) を参照する FK です

すべての座標列は地理ではなくジオメトリ型です (geom と呼びましょう)

これが私がそれを行うべきだと思った方法ですが、この問題の最適な解決策は言うまでもなく、それが正しいかどうかもわかりません

SELECT r.id_b, r.id_p
FROM (
     SELECT b.id AS id_b, p.id AS id_p, pc.id AS id_pc,pc.cname
     FROM building AS b, poi AS p, poi_category AS pc
     WHERE ST_DWithin(b.geom,p.geom, 1000) AND p.c_id=pc.id
     ) AS r,
     (
     SELECT * FROM r GROUP BY id_b
     ) AS r1

 HAVING  count (
                   SELECT *
                   FROM r, r1
                   WHERE r1.id_b=r.id_b AND r.id_pc='pharmacy'

                )>1
             AND
             count (
                   SELECT *
                   FROM r, r1
                   WHERE r1.id_b=r.id_b AND r.id_pc='ed. centre'

                )>1

これは私が必要とするものに行く方法ですか?パフォーマンスの観点から、どのソリューションが優れているでしょうか? 最もエレガントなソリューションはどうですか? ここにも投稿しました: http://gis.stackexchange.com/questions/11445/postgis-advanced-selection-query

4

1 に答える 1

3

これは私が詳しく説明した解決策です。これは私が見つけた最速のものですが、それでも遅いです。タスクの性質を考えると、もっと速くできるとは思えません...

WITH 
building AS (
  SELECT way, osm_id
  FROM osm_polygon
  WHERE tags @> hstore('building','yes')
  --ORDER BY 1 
  LIMIT 1000
),
pharmacy AS (
  SELECT way
  FROM osm_poi
  WHERE tags @> hstore('amenity','pharmacy') 
), 
school AS (
  SELECT way 
  FROM osm_poi
  WHERE tags @> hstore('amenity','school') 
)
SELECT ST_AsText(building.way) AS geom, building.osm_id AS label
FROM building
WHERE
  (SELECT count(*) > 1
   FROM pharmacy
   WHERE ST_DWithin(building.way,pharmacy.way,1000))
  AND
  (SELECT count(*) > 1
   FROM school
   WHERE ST_DWithin(building.way,school.way,1000))

あなたの。S.

于 2012-08-15T23:18:01.873 に答える