- 웹에서 위치 정보 기반 데이터를 표현 하기 위해서는 Backend에서 위치 기반의 데이터(ex. GeoJSON, WKT 등) 조회하여 브라우저에서 라이브러리(OpenLayers, Leaflet) 이용하여 랜더링 한다.
- 몇천건의 백터 데이터의 정보들을 웹브라우저에서 랜더링 하는것은 별 문제는 없지만 만건이상의 데이터들을 웹브라우저에서 랜더링하기에는 클라이언트는 대기하는 시간으로 짜증을 유발 할 수도 있다ㅠ
- 전략적으로 모든 데이터들을 다 표현하기 보다는 한 눈에 데이터에 대한 분포 현황 정도만 표현 할 수 있도로록 지도에 가시화 할 수 있도록 만들 필요성이 생겼다.
select
count(jim.id) as "cnt",
jim.geom
from
jeju_index_map jim,
farm_map_2020 fm
where
st_intersects(jim.geom, fm.geom) = true
group by
jim.id
쿼리 수행 시간 : 17.586 초
select
fm."LAND_CODE",
count(fm.id)
from
farm_map_2020 fm,
(select geom from jeju_index_map where id = 8313) as tile
where st_intersects(tile.geom, fm.geom)
group by fm."LAND_CODE"
order by count(fm.id) desc
limit 1;
쿼리 수행 시간 : 0.012초
LAND_CODE | count |
---|---|
밭 | 58 |
과수 | 29 |
비경지 | 15 |
시설 | 13 |
CREATE OR REPLACE FUNCTION public.get_farm_distribution_map(tileId INT)
returns varchar
LANGUAGE sql
STABLE STRICT
AS $function$
select
fm."LAND_CODE"
from
farm_map_2020 fm,
(select geom from jeju_index_map where id = tileId) as tile
where st_intersects(tile.geom, fm.geom)
group by fm."LAND_CODE"
order by count(fm.id) desc
limit 1
$function$
;
select
jim.geom,
get_farm_distribution_map(jim.id)
from
jeju_index_map jim,
farm_map_2020 fm
where
st_intersects(jim.geom, fm.geom) = true
group by
jim.id
쿼리 수행 시간 : 1.399초
with t as (
select
jim.geom as "geom",
get_farm_distribution_map(jim.id) as "land"
from
jeju_index_map jim,
farm_map_2020 fm
where
st_intersects(jim.geom, fm.geom) = true
group by
jim.id
)
select st_union(t.geom), t.land from t
group by t.land
쿼리 수행 시간 : 26.067초 (확실히. ST_Union으로 객체를 합치기 때문에 시간이 더 오래 걸리는것 같다.)
with t as (
select
jim.geom as "geom",
get_farm_distribution_map(jim.id) as "land"
from
jeju_index_map jim,
farm_map_2020 fm
where
st_intersects(jim.geom, fm.geom) = true
group by
jim.id
)
select
ST_Simplify(st_union(t.geom), 1),
t.land
from t
group by t.land
쿼리 수행 시간 : 27.646초