On October 23rd, 2014, we updated our
Privacy Policy
and
User Agreement.
By continuing to use LinkedIn’s SlideShare service, you agree to the revised terms, so please take a few minutes to review them.
27.
参考1:トポロジーの作り方(yellow_73さんのページを参考にしました)
http://d.hatena.ne.jp/yellow_73/20120323
【STEP1】
トポロジ化したいジオメトリを単純化する(MultiPolygon→Polygon)
①pgis_pref_dumpテーブル作成
CREATE TABLE pgis_pref_dump(
gid SERIAL PRIMARY KEY,
ken varchar(2),
geom GEOMETRY(POLYGON,4326),
area DOUBLE PRECISION
);
②単純なポリゴン化したものをpgis_pref_dumpテーブルに入れる
INSERT INTO pgis_pref_dump (ken,geom)
SELECT ken,(ST_Dump(geom)).geom FROM pgis_pref WHERE cache_flag='2'
③面積を入れる
UPDATE pgis_pref_dump
SET area = st_area(geom ::geography)
【STEP2】
トポロジ1(ポリゴン)を作成する
①pgis_pref_topo1を作成
SELECT topology.CreateTopology('pgis_pref_topo1',4326);
→スキーマにpgis_pref_topo1が追加される
②pgis_pref_dumpのポリゴンデータをpgis_pref_topo1にいれる
SELECT TopoGeo_AddPolygon('pgis_pref_topo1',geom,0)
FROM pgis_pref_dump
WHERE area >= 100000000;
【STEP3】
トポロジ2(簡略化したラインストリング)を作成する
①pgis_pref_topo2を作成
SELECT topology.CreateTopology('pgis_pref_topo2',4326);
→スキーマにpgis_pref_topo2が追加される
②pgis_pref_topo1の簡素化したラインストリングデータをpgis_pref_topo2にいれる
SELECT TopoGeo_AddLineString('pgis_pref_topo2', ST_SimplifyPreserveTopology(geom,
1)) FROM pgis_pref_topo1.edge_data;
【STEP4】
トポロジ2をポリゴン化する
SELECT topology.Polygonize('pgis_pref_topo2');
【STEP5】
トポジオメトリの作成
①topoTempテーブルを作成
CREATE TABLE topotemp (
gid SERIAL PRIMARY KEY,
face_id INT
);
②トポジオメトリカラムを作成
SELECT AddTopoGeometryColumn('pgis_pref_topo2', 'public', 'topotemp',
'topogeom', 'POLYGON');
③topoTempテーブルにトポジオメトリを追加
INSERT INTO topotemp(topogeom)
SELECT topology.CreateTopoGeom('pgis_pref_topo2',3,1,Q.faces)
FROM (
SELECT ARRAY[ARRAY[f.face_id,3 ] ] as faces FROM
pgis_pref_topo2.face AS f
WHERE NOT mbr IS NULL
) AS Q;
【STEP6】
トポジオメトリをジオメトリにしたテーブルを作成
CREATE TABLE topoPref AS
SELECT gid, topogeom::geometry FROM topoTemp;
→これでqgisなどで確認できる
28.
参考2:トポロジーへの属性値の割り当て方法
①岩手県と接しているトポジオメトリを取得。(ST_Intersects)
②接している部分の面積を求める。(ST_Area)
③面積が1以上のトポジオメトリが岩手県に該当する。
面積:
0.015550
面積:
1.483030
面積:
0.00523
面積:
0.01423
【対象のジオメトリと接する面積が1以上のトポジオメトリを取得する】
SELECT f2.gid, f2.topogeom
FROM
(SELECT geom FROM pgis_pref WHERE ken='03' AND cache_flag='2') AS
f1,
(SELECT gid, topogeom FROM topopref) AS f2
WHERE ST_Intersects(f1.geom, f2.topogeom)
AND ST_Area(ST_Intersection(f1.geom, f2.topogeom)) >= 1
37.
【SQL】特定のジオメトリから指定した距離内にあるジオメトリを取得
例: IDが24037のジオメトリから1km圏内のジオメトリを取得
SELECT sample.id, sample.geom
FROM
sample,
(select geom from sample where id='24037') as target
WHERE ST_DWithin(sample.geom, target.geom, 0.0089831666666667)
事業所
事業所最短ノード
ID:
24037
Fig. 1 道路ノード最適化
経路検索は、事業所に一番近いノードを使用して計算を行う。
事業所の最短ノード数が多いと計算時間が遅くなる。
→密集している地域は1つにまとめて、計算するノードを数を減らす。
38.
Fig. 2 ざっくりとした枝刈り
pgRoutingの最短経路を求める関数「pgr_dijkstra」は全ての
ノードを探索するため、計算時間が遅くなる。
→探索する範囲を狭めて計算時間を短縮する。
start ID:4371
end ID:9556
【SQL】2つの地点を囲むバウンディングボックス(矩形)を作成
SELECT ST_SetSRID(ST_Expand(ST_Extent(geom),0.1),4326) AS bbox
FROM node
WHERE id IN (4371,9556)
start地点、end地点を囲む矩形
の範囲を作成し、その範囲内で
ルート検索を行う。
42.
Fig. 4 500mメッシュ単位の高齢者人口を求めたい
高齢者の分布をメッシュで表したいが、メッシュ単位ではデータ
をもっていない。
→面積按分にて算出。
【SQL 】
SELECT mesh.id,
sum(mergearea.value * ST_Area(ST_Intersection(mesh.geom, mergearea.geom))
/ ST_Area(mergearea.geom))
FROM
(SELECT geom,
CASE when senior_population in ('-','X') then 0
when senior_population is null then 0
else cast(senior_population as integer)
END AS value
FROM pgis_smallarea_merge
)AS mergearea,
pgis_kokudo_mesh AS mesh
WHERE ST_Intersects(mesh.geom, mergearea.geom)
GROUP BY mesh.id
面積:1420k㎡
65歳以上の人口:18人
ここの部分の高齢者人口を求めたい
重なっている部分の面積:
154k㎡
≪面積按分の求め方≫
65歳以上の人口=
(154k㎡ × 18人) ÷ 1420k
㎡ ≒ 1.9人