LoginSignup
1
1

More than 5 years have passed since last update.

[PostGIS] 都道府県のポリゴンから最大面積を持つポリゴンのみ抽出し、簡素化して表示パフォーマンスを向上させる

Last updated at Posted at 2016-10-03

日本地図の地形データをそのままPolygonで表示すると
ポイントデータが多すぎてパフォーマンスがでないことがあります。

見た目を損なわない程度に簡素化する方法として2つの手法が考えられました。

  1. 離島が多い地域はポリゴン情報が多数になる(長崎とか)ので、最大面積(本島)のみのデータでもよいと考え、本島のみのポリゴンにしてしまう
  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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1