먼저 원본과 출처를 남기기
주소 검색 결과가 지도에 뜬다고 바로 매장 핀으로 확정할 수는 없습니다. 같은 건물에 여러 점포가 있고, 층·호수나 건물명도 이용자에게 필요한 단서입니다. 원본 주소를 남기고 검색용 주소를 별도 필드로 만드는 것부터 시작합니다.
이 글은 공개 주소 자료를 처리할 때 사용할 검토 절차와 독립 예제를 설명합니다. 바쿠오에서 모든 주소를 출입구 수준으로 보정했다거나 특정 오차 이내라는 의미는 아닙니다. 원본 파일명, 제공기관, 자료 기준일, 변환 방법을 내부 기록에 함께 남겨야 결과를 다시 확인할 수 있습니다.
정리는 작게 하고 결과를 비교하기
우선 유니코드 표기와 연속 공백만 정리하고, 원본과 달라진 행을 살펴봅니다. 괄호나 “2층”을 일괄 삭제하는 규칙은 건물과 점포를 구별하는 정보를 지울 수 있습니다. 검색 실패가 발생한 행에 한해 후보 주소를 따로 만들고 변경 이유를 기록하는 편이 추적하기 쉽습니다.
아래 prepareAddress는 공백을 정리할 뿐 도로명주소의 진위를 확인하지 않습니다. 지역명 변경이나 지번·도로명 변환을 정규표현식만으로 해결하려 하지 않고, 공식 주소 검색 결과와 비교합니다.
주소 검색과 좌표 변환 구분하기
지오코딩은 주소를 검색해 좌표 후보를 얻는 과정입니다. 좌표 변환은 이미 있는 좌표를 다른 기준계로 바꾸는 과정입니다. 숫자 크기가 비슷하다는 이유로 EPSG:5179나 EPSG:5186을 추측해 변환하면 그럴듯한 잘못된 점이 생길 수 있습니다.
Kakao 주소 검색 문서에서 요청 조건과 응답의 도로명·지번 정보를 확인할 수 있습니다. 실제 API 연동에는 자신의 인증과 이용 조건 검토가 필요합니다. PROJ의 cs2cs 문서도 입력 CRS와 축 순서를 확인하도록 안내합니다. 소스 CRS가 없는 행은 추정 변환 대신 검토 대상으로 남깁니다.
좌표 순서를 코드로 고정하기
다음 전체 예제는 브라우저 콘솔이나 Node.js에서 실행합니다. API 호출이나 좌표계 변환을 하지 않습니다. 이미 GeoJSON Point라고 확인한 데이터의 경도·위도 순서를 명시적인 필드로 옮기는 어댑터입니다. 입력 좌표는 형식 확인용 숫자이며 실제 점포 위치가 아닙니다.
function prepareAddress(raw) {
if (typeof raw !== 'string' || raw.trim() === '') {
throw new TypeError('Address must be a non-empty string');
}
return {
rawAddress: raw,
queryAddress: raw.normalize('NFC').replace(/\s+/gu, ' ').trim()
};
}
function geoJsonPointToLatLng(point) {
if (!point || point.type !== 'Point' || !Array.isArray(point.coordinates)) {
throw new TypeError('Expected a GeoJSON Point');
}
const [lng, lat] = point.coordinates;
if (!Number.isFinite(lat) || !Number.isFinite(lng)) {
throw new TypeError('Coordinates must be numbers');
}
if (Math.abs(lat) > 90 || Math.abs(lng) > 180) {
throw new RangeError('Coordinates outside latitude/longitude range');
}
return { lat, lng };
}
console.log(prepareAddress(' Example\tBuilding 2F ').queryAddress);
// Example Building 2F
console.log(geoJsonPointToLatLng({ type: 'Point', coordinates: [127, 37] }));
// { lat: 37, lng: 127 }첫 결과의 공백은 하나로 정리되고 “2F”는 남습니다. 두 번째 결과는 lat: 37, lng: 127입니다. 이는 GeoJSON 좌표 순서를 이 함수의 필드 순서로 옮긴 결과이며 EPSG 변환 결과가 아닙니다. 빈 주소나 문자열 좌표는 오류로 드러납니다.
핀을 게시하기 전 확인할 목록
- 검색 후보의 건물·도로명·행정구역을 원본 주소와 비교합니다.
- 점이 지역 범위 안에 있다는 검사와, 실제 건물이 맞다는 검사를 따로 합니다.
- 지하상가·복합건물은 지도 핀만으로 출입구와 층수를 알 수 없으므로 상세 주소를 함께 표시합니다.
- 찾지 못한 주소는 좌표 없음으로 남기고, 도시 중심점 같은 임의 좌표를 매장 위치로 대체하지 않습니다.
완료 기준은 핀의 개수가 아니라 원본 주소와 결과 좌표의 관계를 설명할 수 있는지입니다. 주소가 수정되거나 매장이 이동하면 이전 결과를 재검토할 수 있도록 출처와 확인일도 보존합니다.