2011-06-24 17 views
1

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

ビル(IDのシリアル、名前のvarchar型)

poi_category(IDシリアル、CNAME VARCHAR)はもちろん

ポイ(IDのシリアル、名前のvarchar型、C_IDのカテゴリ名であること--cname整数) - C_IDは、すべての列を座標FK参照poi_category(ID)

あるタイプのジオメトリではない地理である(のは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

答えて

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.

関連する問題