점묘도는 무엇이 얼마나 있는지와 그것이 지역 안 어디에 있는지를 함께 보여 줍니다. 100명당 점 하나를 전국에 흩뿌리면 경계선을 하나도 그리지 않아도 도시가 저절로 드러납니다.
이 글에서는 점묘도가 무엇인지, 점 단위를 어떻게 고르는지, 지도의 정직함을 좌우하는 배치 문제, 그리고 웹 지도에서 만드는 방법을 다룹니다.
점묘도란
점묘도(dot density map, dot distribution map)는 정해진 단위 수마다 점 하나를 해당 단위가 속한 지역 안에 찍어 수량을 보여 줍니다.
세 가지가 점묘도를 정의합니다.
- 점 단위. 점 하나가 몇 단위를 뜻하는지. 점 하나가 주민 100명, 포도밭 50헥타르, 배송 10건입니다.
- 점 크기. 각 점을 픽셀이나 밀리미터로 얼마나 크게 그리는지.
- 배치 규칙. 지역 안 어디에 점을 두는지.
독자는 점을 하나씩 세지 않습니다. 읽는 것은 질감입니다. 수량이 몰린 곳은 잉크가 꽉 차고, 희박한 곳은 드문드문 흩어집니다. 이것이 이 형식의 강점이며, 종이 시대 제도사들이 손으로 점을 찍던 때로부터 한 세기가 지나도 살아남은 이유입니다.
일대일 점 지도는 특수한 경우로, 점 하나가 실제 좌표를 가진 실제 관측값입니다. 풍력 터빈 하나하나, 약국 한 곳 한 곳, 기록된 발생 건 하나하나입니다. 이들은 진짜 점 지도이며, 집계형과 달리 위치를 신뢰할 수 있습니다.
점묘도, 단계구분도, 히트맵 비교
세 가지 형식에 세 가지 역할이 있습니다.
단계구분도는 각 지역을 하나의 색으로 채웁니다. 가장 빨리 읽히고 만들기도 가장 쉬우며, 모든 지역이 내부적으로 균일한 것처럼 보이게 합니다. 농촌 군을 칠한 단계구분도는 인구가 군 전체에 고르게 퍼져 있다고 말하지만, 실제로는 대부분이 한 읍에 삽니다.
점묘도는 절대 수치를 유지하면서 내부 분포를 보여 줍니다. 넓고 텅 빈 지역은 시각적으로도 비어 있어, 단계구분도를 괴롭히는 면적 편향이 해결됩니다. 대가는 정밀도입니다. 눈으로 지역별 정확한 값을 복원할 수는 없습니다.
히트맵은 점을 연속적인 면으로 부드럽게 만듭니다. 밀집 지점을 찾는 데 뛰어나고 수량은 감춥니다. 어떤 색이 얼마를 뜻하는지 지도의 무엇도 선언하지 않기 때문입니다.
실무 원칙은 이렇습니다. 비율은 단계구분도, 절대 수치는 점, 밀집 탐색은 히트맵. 면적 편향이 주된 문제이고 내부 세부가 중요하지 않다면 카토그램이 또 다른 해법입니다.
점묘도 사례
이 형식이 제값을 하는 곳입니다.
- 인구조사 구역별 인구. 가장 잘 알려진 용도로, 점 색으로 인구를 집단별로 나누면 경계선을 전혀 보이지 않고도 분리 양상이 드러납니다.
- 농업 생산량. 소 1,000마리당 점 하나, 작물 100헥타르당 점 하나. 국가 지도첩의 고전적 용법입니다.
- 우편번호별 고객이나 주문. 개인정보를 위해 집계하므로 어떤 점도 특정 가구를 가리키지 않습니다.
- 주택 유형별 재고. 아파트는 한 색, 단독주택은 다른 색으로 표시합니다.
- 소매 또는 경쟁사 분포. 밀집 자체가 통찰입니다.
- 질병 발생 건수. 1인당 위험이 아니라 집중도를 보여 주려는 경우입니다.
다중 범주 방식은 단계구분도가 정말로 할 수 없는 일입니다. 하나의 폴리곤을 두 색으로 칠할 수는 없지만, 두 색의 점은 한 지역을 공유하며 그 구성비를 보여 줄 수 있습니다.
배치 문제
대부분의 점묘도가 잘못되는 지점이 여기입니다.
점은 보통 지역 폴리곤 안에 무작위로 뿌려집니다. 지역에 대한 진술로는 괜찮지만, 그 안의 특정 지점에 대한 진술로는 오해를 부릅니다. 무작위 분포는 호수 위에도, 공업단지에도, 비행장에도, 아무도 살지 않는 산비탈에도 점을 찍기 때문입니다.
다시메트릭 배치가 해법입니다. 폴리곤 전체가 아니라 대상이 실제로 존재할 수 있는 부분으로 점을 한정하며, 마스크로는 주거 토지이용, 건물 외곽선, 토지 피복 레이어를 씁니다. 지역별 합계는 그대로이고 점은 그럴듯한 자리에 떨어집니다. 인구 작업에는 공개 지도 데이터의 건물 외곽선이 보통의 마스크이며, 국가 규모 지도라면 거친 토지 피복 마스크로도 충분합니다.
두 번째 규칙은 지도를 다시 볼 때의 신뢰를 지킵니다. 난수에 시드를 주십시오. 시드 없는 지도는 불러올 때마다 다르게 그려지고, 그것을 알아챈 독자는 믿지 않게 됩니다. 점은 한 번 생성해 저장하고 매번 같은 집합을 제공하십시오.
점 단위 고르기
점 단위가 지도의 가독성을 결정합니다. 실패는 두 가지입니다.
점 단위가 너무 작으면 점이 너무 많아져 밀집 지역이 통짜 덩어리로 포화합니다. 잉크가 꽉 차고 나면 데이터가 더 늘어도 달라지지 않으므로 지도는 정점을 과소평가합니다.
점 단위가 너무 크면 희박한 지역에 점이 없거나 하나만 남아, 희박한 지역들 사이의 실제 차이가 사라집니다.
기본 확대 수준에서 지도 전체에 대략 2,000개의 점이 놓이는 값을 출발점으로 삼고, 그린 뒤 조정하십시오. 목표는 가장 빽빽한 무리가 통짜가 아니라 질감으로 보이는 것, 그리고 의미 있는 데이터를 가진 가장 희박한 지역에도 점 몇 개는 남는 것입니다.
점 단위는 지도가 읽히는 확대 수준에 따라 달라지며, 이것이 웹 지도에 올릴 때의 까다로운 부분입니다. 전국 보기에 맞춘 점 단위는 도시 확대에서 포화합니다. 흔한 답은 두 가지입니다. 지도를 한 확대 수준으로 고정해 거기에 맞추거나, 확대 범위별로 점 집합을 따로 만들어 교체하는 것입니다. 어느 쪽이든 명시한 점 단위는 범례에 항상 보여야 합니다.
점묘도 만드는 방법
과정은 네 단계입니다.
- 안정적인 식별자를 가진 지역 폴리곤을 준비합니다.
- 그 식별자에 지역별 절대 수치를 연결합니다.
- 점을 생성합니다. 지역마다
count / dotValue개의 점을 폴리곤 안, 가능하면 마스크 안에 배치합니다. - 점을 렌더링합니다. 원 레이어로 표시합니다.
점 생성은 Turf가 처리합니다.
import randomPoint from '@turf/random';
import booleanPointInPolygon from '@turf/boolean-point-in-polygon';
import bbox from '@turf/bbox';
const DOT_VALUE = 100;
function dotsForRegion(feature, count) {
const target = Math.round(count / DOT_VALUE);
const box = bbox(feature);
const dots = [];
// Rejection sampling: draw inside the bounding box, keep what lands in the polygon
while (dots.length < target) {
const batch = randomPoint(target, { bbox: box }).features;
for (const point of batch) {
if (dots.length >= target) break;
if (booleanPointInPolygon(point, feature)) {
point.properties = { id: feature.properties.id, category: feature.properties.category };
dots.push(point);
}
}
}
return dots;
}
map.addLayer({
id: 'dots',
type: 'circle',
source: 'dot-density',
paint: {
'circle-radius': ['interpolate', ['linear'], ['zoom'], 4, 1.2, 10, 2.6],
'circle-color': ['match', ['get', 'category'], 'residential', '#12813D', 'commercial', '#B7A21F', '#406FBD'],
'circle-opacity': 0.75,
},
});
위 코드에 두 가지 참고 사항이 있습니다. 기각 표집은 길고 가는 폴리곤에서 느려집니다. 경계 상자의 대부분이 빗나가기 때문입니다. 수십만 개를 넘어서면 폴리곤을 삼각분할해 면적 비례로 표집하는 편이 빠릅니다. 그리고 반지름이 확대 수준에 따라 조금씩 커지므로 축척이 바뀌어도 질감이 안정적으로 유지됩니다.
다른 제약은 성능입니다. MapLibre 원 레이어는 수만 개의 점을 무리 없이 다룹니다. 그보다 많아지면 서버에서 점을 생성해 벡터 타일로 구워 넣고 타일 파이프라인이 컬링을 맡게 하십시오. deck.gl의 ScatterplotLayer도 선택지이며, GPU에서 수백만 개의 점을 처리합니다.
주의할 함정
없는 정밀도를 암시하는 것. 점을 무작위로 배치했다면 캡션에 그렇게 쓰십시오. 그러지 않으면 독자는 개별 점을 찾아보려 합니다.
점 단위를 빠뜨리는 것. 범례에는 점 하나가 무엇을 뜻하는지, 축척 막대와 같은 비중으로 명시해야 합니다. 그것이 없으면 지도는 패턴만 보여 주고 수량은 보여 주지 않습니다. 배치 방법은 범례 가이드에서 다룹니다.
높은 확대에서의 과밀. 전국 확대에서 겹쳐 있던 점이 도로 확대에서 떨어지며, 애초에 실제 주소가 아니었다는 사실이 드러납니다. 최대 확대를 제한하거나 레이어를 전환하십시오.
범주가 너무 많은 것. 점 색은 서너 가지가 한계이며, 그보다 많으면 섞여서 탁해집니다. 그 이상은 작은 지도를 여러 개로 나누십시오.
비율을 그리는 것. 점은 개수를 셉니다. 백분율을 그린 점묘도에는 정직한 해석이 없습니다.
MapAtlas가 하는 일
점묘도는 바탕 지오메트리만큼만 좋습니다. Dynamic Maps API는 국가, 지역, 우편번호 경계를 안정적인 식별자의 벡터 타일로 제공하므로 지역별 점 생성이 정리 작업이 아니라 단순 조인이 됩니다. EU에서 호스팅되고 버전이 기록된 경계 덕분에, 다음 분기에 다시 생성한 지도도 이미 게시한 지도와 일치합니다.
다시메트릭 배치에는 GeoEnrich 뒤에 있는 POI 및 장소 데이터가 도움이 됩니다. 건물과 토지이용 맥락으로 점을 수면과 비행장 밖에 두고, 같은 식별자로 연결된 지역별 집계가 개수를 결정합니다. 비율 데이터라면 단계구분도 가이드를, 주제도 전반을 보려면 지도의 종류 가이드를 먼저 보십시오.
자주 묻는 질문
점묘도란 무엇입니까?
점묘도는 지역 안에 점을 찍어 수량을 보여 주는 주제도이며, 점 하나가 정해진 단위 수를 나타냅니다. 점 하나가 100명일 수도, 농가 10곳일 수도, 고객 1명일 수도 있습니다. 독자는 점이 얼마나 빽빽한지로 값을 판단하므로, 지도는 양이 얼마인지와 지역 안 어디에 있는지를 함께 보여 줍니다.
점묘도와 단계구분도의 차이는 무엇입니까?
단계구분도는 각 지역을 하나의 값에 대응하는 하나의 색으로 채우므로 지역 전체가 균일해 보입니다. 점묘도는 지역 안에 점을 흩뿌려 내부의 편차를 보여 주고, 넓고 텅 빈 지역이 중요해 보이는 문제를 피합니다. 비율을 다루고 빠르게 읽혀야 한다면 단계구분도가 낫습니다. 절대 수치를 다루고 밀집을 보여 주거나 여러 범주를 한 지도에서 비교하려면 점묘도가 낫습니다.
점묘도와 히트맵의 차이는 무엇입니까?
점묘도는 명시한 점 단위로 개별 점을 그리므로 독자가 셀 수 있고 원래 수치도 복원됩니다. 히트맵은 점 데이터를 연속적인 색면으로 부드럽게 만들며 고정된 단위가 없어 한눈에 읽기는 쉽지만 수치는 감춥니다. 수량이 중요하면 점을, 밀집 지점만 찾으면 된다면 히트맵을 쓰십시오.
점 단위(dot value)는 어떻게 정합니까?
가장 빽빽한 곳이 빽빽하되 셀 수 있을 정도이고, 가장 희박한 곳도 보이는 값을 고르십시오. 실제로 읽히는 확대 수준에서 시행착오로 맞추는 것이 보통입니다. 전체 합계를 약 2,000개 점으로 나눈 값에서 시작해 그려 본 뒤 조정하십시오. 점 단위가 너무 작으면 도시가 새까맣게 메워지고, 너무 크면 농촌이 비어 보입니다.
점묘도의 점은 실제 위치에 있습니까?
점 하나가 실제 좌표를 가진 관측값 하나인 일대일 점 지도에서만 그렇습니다. 일반적인 경우 점은 지역 안에 무작위로 뿌려지므로 개별 점은 특정 주소를 뜻하지 않습니다. 배치는 다시메트릭 기법으로 더 정직해질 수 있습니다. 호수나 공항이 아니라 주거지처럼 대상이 실제로 존재할 수 있는 곳으로 점을 한정하는 방식입니다.
점묘도는 언제 쓰는 것이 좋습니까?
데이터가 비율이 아니라 절대 수치일 때, 지역 면적 차이가 클 때, 지역 내부의 밀집이 이야기의 일부일 때, 색을 달리한 점으로 여러 범주를 한 번에 보여 주고 싶을 때 사용하십시오. 지역별 정확한 값을 읽어야 할 때, 대시보드에서 1초만 훑을 때, 지역이 너무 작아 몇 개의 점으로는 패턴이 드러나지 않을 때는 피하십시오.

