日本地図の地形データをそのままPolygonで表示すると
ポイントデータが多すぎてパフォーマンスがでないことがあります。
見た目を損なわない程度に簡素化する方法として2つの手法が考えられました。
- 離島が多い地域はポリゴン情報が多数になる(長崎とか)ので、最大面積(本島)のみのデータでもよいと考え、本島のみのポリゴンにしてしまう
- ポリゴンそのものを簡素化する。ST_SimplifyPreserveTopology関数を利用して、見た目に問題がない程度にポリゴンを簡素化する
データ構造 (今回のサンプルです)
SRIDは4326です。
state_id | polygon |
---|---|
1 | 0106000020E61000000F0000000103 |
2 | 0106000020E61000006A0000000103 |
3 | 0106000020E6100000A30000000103 |
4 | 0106000020E6100000650000000103 |
SELECT
state_id
-- ここでポリゴンの簡素化を実施する (簡素化の値は目視で確認しながら調整)
, ST_SimplifyPreserveTopology(polygon,0.005) AS polygon
FROM
(
SELECT
state_id
, polygon
-- WINDOW関数を利用して、都道府県ごとのどのポリゴンが最大値かを判定
, CASE WHEN area = MAX(area) OVER(PARTITION BY state_id) THEN TRUE ELSE FALSE END AS is_max
FROM
(
-- 各ポリゴンごとの面積を取得する
SELECT
-- 都道府県ID単位で集計できるようにIdを選択
state_id
-- DUMPは idとポリゴンの配列になっているため、ポリゴンだけ取得し、ST_AREAで面積取得
, ST_AREA(Geography((ST_DUMP(polygon)).geom)) AS area
-- 最終的にこのデータを利用するためSELECTに含める
, (ST_DUMP(polygon)).geom AS polygon
FROM
state
) AS area_base
) AS max_area
WHERE
-- 最大領域だけのデータにフィルタする
is_max = TRUE