PostGISでArcGIS Intersectを複製する方法


8

このArcGISプロセスをPostGISで複製しようとしています:http : //blogs.esri.com/esri/arcgis/2012/11/13/spaghetti_and_meatballs/。これは、バッファされたポイントをそれらの交差に基づいてポリゴンに分割し、レイヤーの数を数えて、それらをポリゴンに分類して分類する方法を説明しています。私はそれを使用して、ベクトルを使用して大まかなポイント密度マップを作成しました。結果は、ArcGISのデータセットにとって驚くほど素晴らしいものでした。しかし、私はPostGISで実行可能な何かを考え出すのに苦労しています。そこでは、Webマップ用の動的ポイント密度レイヤーを作成するためにそれが必要です。

ArcGISでは、バッファポイントレイヤーで交差ツールを実行して、必要な形状を作成しました。

PostGISでは、次のクエリを実行しました。

CREATE TABLE buffer_table AS SELECT a.gid AS gid, ST_Buffer(a.geo,.003) AS geo FROM public.pointTable a;

CREATE TABLE intersections AS SELECT a.gid AS gid_a, b.gid AS gid_b, ST_Intersection(a.geo,b.geo) AS geo FROM public.pointTable a, public.pointTable b WHERE ST_Intersects(a.geo, b.geo) AND a.gid < b.gid;

DELETE FROM intersections WHERE id_a = id_b;

出力は、ArcGIS出力とほとんど同じですが、意味のある密度マップに必要な程度にポリゴンを分割しない点が異なります。ここに私が意味するもののスクリーンショットがあります:

ArcGIS PostGIS

ArcGISは左側にあり、PostGISは右側にあります。少しわかりづらいですが、ArcGIS画像は、3つのバッファーすべてが交差する場所に作成された「内部」ポリゴンを示しています。一方、PostGIS出力はその内部ポリゴンを作成せず、代わりにコンポーネントをそのまま保持します。これにより、外側のパーツが1つしかないのに比べて、3つのレイヤーが重なり合った内部エリアだけを分類することはできません。

誰かが私が必要とする範囲までポリゴンを分解するPostGIS関数を知っていますか?あるいは、PostGISでベクトルを使用して点密度マップを作成するより良い方法を誰かが知っていますか?

回答:


9

CTEをチェーン化することで、これをすべて1つのステップで実行できますが、いくつかのステップで実行したので、進行中にQGISで結果を確認できます。

最初に、ガウス分布を使用して、操作するランダムなポイントの束を生成します。これにより、中央でより多くのオーバーラップが得られます。

create table pts as with 
    rands as (
        select generate_series as id, random() as u1, random() as u2 
        from generate_series(1,100))
select
      id,
      st_setsrid(st_makepoint(
            50 * sqrt(-2 * ln(u1)) * cos(2*pi()*u2), 
            50 * sqrt(-2 * ln(u1)) * sin(2*pi()*u2)),4326) as geom
from rands;

次に、ポイントを円にバッファリングして、いくつかのオーバーラップを取得します。

create table circles as
    select id, st_buffer(geom, 10) as geom from pts;

次に、円から境界のみを抽出します。穴のあるポリゴンがある場合は、ST_DumpRings()を使用して、ここでさらに豪華にする必要があります。単純なポリゴンがあるので、ごまかします。境界を取得したら、それらを結合して(実際には、偶然の線画の小さな断片でも可能です)、ノードを強制的にノード化して重複排除します。(これは魔法です。)

create table boundaries as
    select st_union(st_exteriorring(geom)) as geom from circles;

次に、ノード付きの線図を使用してエリアを再構築します。これは分割された領域であり、領域ごとに1つのポリゴンしかありません。ポリゴン化した後、マルチポリゴン出力から個々のポリゴンをダンプします。

create sequence polyseq;

create table polys as
    select 
        nextval('polyseq') as id, 
        (st_dump(st_polygonize(geom))).geom as geom 
    from boundaries;

次に、ポリゴンカウント用の場所を追加し、小さなカットポリゴンの重心を元の円に結合し、各小片ごとに要約することで、それを埋めます。より大きなデータセットの場合、物事が信じられないほど遅くならないようにするために、少なくとも円テーブルのインデックスが必要になります。

create index circles_gix on circles using gist (geom);

alter table polys add column count integer default 0;

update polys set count = p.count 
from (
    select count(*) as count, 
           p.id as id 
    from polys p 
    join circles c 
    on st_contains(c.geom, st_pointonsurface(p.geom)) 
    group by p.id
) as p
where p.id = polys.id;

これで、重複するポリゴンはなくなりましたが、結果として生じる各ポリゴンには、それがどの程度重複しているのかを表すカウントがあります。


それは非常に印象的です。最終的には、自分の特定のデータセットで機能する、ごまかしの方法を少し使用しました(Webマッピングを含む私のプロジェクトにとって重要な、リソースの消費量も少なくなる可能性があります)。ヒートマップを作成する別の方法としてソリューションを投稿しますが、これは私が質問した質問に対する正しい答えです。
scavok 2014

2

最終的に私が使用した方法は、関心のある領域にフィッシュネットグリッドを作成し、データを適切な程度にスタイル設定および反映するのに十分な「解像度」で作成することでした。ここでフィッシュネット関数について読むことができます:PostGISで通常のポリゴングリッドを作成する方法?

CREATE TABLE fishnet AS
SELECT * FROM ST_CreateFishnet(800,850,.0005,.0005,-104.9190,38.7588);

これにより、高さと長さが0.0005ラジアンである800行、850列のフィッシュネットが作成されます(緯度/経度のWGS84投影を使用し、歪みが無視できるほど十分に小さい地理的範囲を使用します)。 )、次にグリッドの左下の座標。

UPDATE fishnet SET geom = ST_SetSRID(geom,4326);
CREATE INDEX fishnet_geom ON fishnet USING gist (geom);
ANALYZE fishnet;

これにより、クエリが実行される大量のポリゴンが作成されたため、インデックスを作成して統計を更新しました。これにより、一般的なクエリが50秒以上から4〜5秒に短縮されました。

SELECT ST_Union(a.geom), a.count
FROM (SELECT count(*) as count, fishnet.geom as geom
    FROM fishnet, incidents
    WHERE ST_DWithin(incidents.geo,fishnet.geom,.002) AND (incidents.incidenttype = 'Burglary')
    GROUP BY fishnet.geom) a
WHERE a.count >= 3
GROUP BY a.count;

ここでのサブクエリは、各フィッシュネットグリッドポリゴンの.002ラ​​ジアン(約220メートル)以内のインシデントの数をカウントし、フィッシュネットグリッドごとにグループ化します。これにより、重なり合う円の数がグリッドの解像度に効果的にカウントされます。

各ポリゴンのカウント値を結合して、カウントを3以上に制限するために使用した外部クエリ。ユニオンは厳密に必要ではなく、クエリの最もリソースを集中的に必要とする部分ですが、それは何万ものグリッドポリゴンを効果的に変換するため、Webマッピングにとって非常に重要です。ただし、さまざまなカウント値が存在するマルチポリゴン(通常、私のデータでは数十)。

カウント値を制限することはヒートマップにとって重要な機能であり、解釈できないほど多くのデータを表示しないようにします。また、クエリを大幅に高速化するユーティリティも追加されています。

最終結果: 地図

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.