DEV Community

2x lazymac
2x lazymac

Posted on

How to Build a Korean Address Geocoder in 5 Minutes

Korean addresses are notoriously hard to geocode. The address system changed in 2014 from a land lot system (지번 주소) to a road name system (도로명 주소), but both are still in active use. Here's how to handle both formats and get precise coordinates in minutes.

The Two Address Systems

Old system (지번 주소): Land lot based. "서울시 강남구 역삼동 123-45"
New system (도로명 주소): Road name + building number. "서울시 강남구 테헤란로 521"

Most Korean users know both addresses for their home. Delivery apps, real estate listings, and government forms use both. Your geocoder needs to handle both.

Building a Korean Address Geocoder

import requests

API_KEY = "your-api-key"
BASE_URL = "https://api.lazy-mac.com/k-address"

def geocode_korean(address: str) -> dict:
    """Geocode any Korean address format."""
    resp = requests.get(f"{BASE_URL}/geocode",
        params={"address": address, "format": "auto"},
        headers={"Authorization": f"Bearer {API_KEY}"}
    )
    result = resp.json()
    return {
        "lat": result["coordinates"]["lat"],
        "lng": result["coordinates"]["lng"],
        "normalized": result["normalized_address"],
        "address_type": result["address_type"],  # "road" or "jibun"
        "confidence": result["confidence_score"]
    }

# Works with either format
loc1 = geocode_korean("서울시 강남구 역삼동 123-45")
loc2 = geocode_korean("서울 강남구 테헤란로 521")
loc3 = geocode_korean("Seoul Gangnam-gu Teheran-ro 521")  # English OK too
Enter fullscreen mode Exit fullscreen mode

Address Normalization

Before geocoding, normalize the input:

def normalize_address(raw: str) -> str:
    resp = requests.post(f"{BASE_URL}/normalize",
        json={"address": raw},
        headers={"Authorization": f"Bearer {API_KEY}"}
    )
    return resp.json()["normalized"]

# Input: "강남 역삼 123" (incomplete)
# Output: "서울특별시 강남구 역삼동 123" (normalized)
Enter fullscreen mode Exit fullscreen mode

Batch Processing

For bulk address data:

addresses = ["주소1", "주소2", "주소3"]  # up to 100 per batch

resp = requests.post(f"{BASE_URL}/batch-geocode",
    json={"addresses": addresses},
    headers={"Authorization": f"Bearer {API_KEY}"}
)

results = resp.json()["results"]
for r in results:
    print(f"{r['input']}{r['lat']}, {r['lng']} (confidence: {r['confidence']})")
Enter fullscreen mode Exit fullscreen mode

Coverage and Accuracy

  • 99.2% coverage for registered addresses in Korea
  • Average accuracy: within 10 meters for urban areas
  • Sub-10ms response time (edge-cached for major cities)
  • Handles typos and abbreviated forms

Korean Address API | Documentation

Top comments (0)