반응형

전체 글 32

[경사로 지도 제작기] 주소를 좌표로 바꾸는 지오코딩 — 카카오 API와 OSM 사이에서 균형 잡기

지도 서비스에서 사용자가 제일 먼저 하는 건 검색이다."반포자이", "문래동 32", "옥수역"을 치면, 그 글자를 지도 위의 한 점(좌표)으로 바꿔야 한다.이걸 지오코딩(geocoding)이라고 부른다. 간단해 보이지만, 실제로는 "어느 지오코더를 믿을 것인가"라는 선택의 문제였다.이 글은 카카오 API와 OSM(오픈스트리트맵) 사이에서 균형을 잡은 이야기다. 두 후보 — 카카오 vs OSM한국 주소를 좌표로 바꾸는 무료 지오코더는 크게 둘이다. 카카오 로컬 APIOSM Nominatim한국 주소 정확도아주 좋음들쭉날쭉가게·건물 이름키워드 검색 지원약함비용·키키 필요(무료 쿼터 있음)키 불필요·무료제약일일 쿼터초당 1회 등 엄격한 정책정리하면 카카오는 정확하지만 키·쿼터가 필요하고, OSM은 공짜지만..

카테고리 없음 2026.07.30

[경사로 지도 제작기] 전국 67만 교차점을 메모리에 우겨넣기 — 파이썬 객체 오버헤드와의 싸움

경로 계산 API를 무료 서버에 올리려는데 벽에 부딪혔다.전국 도로망 그래프를 파이썬으로 순진하게 담았더니, 메모리를 몇 기가바이트씩 먹었다.무료 티어 서버(오라클, 램 1GB 안팎)엔 애초에 안 올라간다. 규모는 이렇다.전국 교차점(노드) 약 67만 개, 길(엣지) 100만 개 이상, 게다가 길마다 좌표·고도 프로파일까지.이 글은 이걸 1.3GB에 우겨넣은 다이어트 이야기다. 문제의 정체 — 데이터가 아니라 '포장지'파이썬은 편한 대신, 작은 값 하나하나가 전부 객체다.정수 1 하나가 28바이트, 리스트·딕셔너리는 원소마다 포인터가 붙는다.그래서 데이터 자체보다 '포장지'(객체 오버헤드)가 더 커지는 일이 벌어진다. 길 67만 개를 [[x,y], [x,y], ...] 같은 파이썬 리스트로 담으면?좌..

[경사로 지도 제작기] '완만한 길'은 어떻게 계산할까 — 오르막에 제곱 벌점을 주는 경로 탐색

지도 앱의 "최단 경로"에는 치명적인 맹점이 있다.언덕을 모른다.최단은 진짜로 '거리만' 최단이라, 15% 급경사 골목이든 계단이든 짧기만 하면 그리로 보낸다. 경사로 지도(slopemap.kr)를 만들면서 정한 원칙이 하나 있었다.최단 경로와 '편한 경로'를 항상 나란히 보여주자.그러려면 "편하다"를 컴퓨터가 계산할 수 있는 숫자로 바꿔야 했다.이 글은 그 숫자 — 오르막 제곱 벌점 — 를 설계한 이야기다. 아이디어 — 경로 탐색은 결국 '비용' 싸움경로 탐색 알고리즘(다익스트라, A*)의 구조는 단순하다.길마다 비용이라는 숫자를 매기고, 비용의 합이 가장 작은 경로를 찾는다.비용을 '거리'로 두면 최단 경로가 나온다. 그렇다면 '편한 경로'는?비용 = 거리 + 오르막 벌점으로 두면 된다.알고리즘은 ..

[경사로 지도 제작기] 전국 도보 지도 무료로 서빙하기 (PMTiles + Cloudflare R2)

경사로 지도(slopemap.kr)를 만들면서 가장 골치 아팠던 건 지도 데이터 그 자체였다..!전국의 걷는 길을 전부 그리려면 데이터가 어마어마하게 크다.그런데 나는 서버비를 한 푼도 안 쓰고 이걸 전 국민한테 뿌리고 싶었다.이 글은 그 방법이다.tippecanoe로 벡터 타일을 굽고, PMTiles 단일 파일로 묶어서, Cloudflare R2에 얹은 이야기. 문제 — 지도는 왜 이렇게 무거운가 지도를 웹에 그리는 방식은 크게 둘이다.하나는 이미지 타일(구글 지도처럼 미리 그려둔 그림 조각).하나는 벡터 타일(좌표·속성 데이터를 브라우저가 그때그때 직접 그림).경사로 지도는 길마다 고도에 따라 색을 실시간으로 입혀야 해서 벡터 타일을 골랐다.문제는 전국 도로망을 벡터로 담으면 원본 GeoJSON이 ..

[경사로 지도 제작기] SRTM으로 경사 지도를 만들었더니 마곡이 언덕이 됐다?!

지도 위의 길 자체를 고도에 따라 색칠하는 사이드 프로젝트(경사로 지도)를 만들고 있다. 낮은 곳은 초록, 높은 곳은 갈색. 길이 초록에서 갈색으로 물들면 "아, 저쪽이 오르막이구나"가 지도만 보고 바로 읽힌다.그런데 첫 버전을 띄우자마자 이상한 걸 발견했다. 서울 마곡지구가 언덕으로 나온 것이다. ..!! 마곡은 아는 사람은 안다. 바닥이 평평한 매립지 위에 지은 계획도시다. 고층 오피스와 아파트가 빽빽하지만 땅 자체는 평지다.그런데 내 지도는 이 동네를 산기슭처럼 칠하고 있었다. 여의도, 강남 테헤란로 같은 고층 밀집지도 마찬가지였다. 범인은 고도 데이터였다. 이 글은 그 삽질과 해결기다. 1. 왜 고도 데이터가 필요했나경사로 지도는 도로망(OpenStreetMap, osmnx로 수집)을 약 12m..

[JAVA] class 와 static, private, 인스턴스 관련 등등. 코드로 이해하기!

package com.test.oop;//여기서 class AA 안에 있는 것은 다른 class 에 영향을 줄 수 없음. 캡슐 안에 들어있어. 캡슐화.class AA { int a = 1; int b = 2; void aa(){ //return 할 데이터가 없을 때 void 쓰고 바로 method 작성. System.out.println("a = " + a + " / b = " +b); }}class BB { private int a = 3; //이름이 같아도 다른 class 이기 때문에 괜찮음. int b = 4; static final int q = 100; //final 을 붙이면 기존 멤버변수가 상수가 됨. void bb(){ ..

Computer Science 2024.08.30

[JAVA] 무작위의 integer array 순서대로 정렬하기! Bubble Sorting

0,4,2,5,1,6,8,9,7, 3 ==> 이런 식으로 무작위의 array 가 있다고 해보자. 이걸 0,1,2,3,4,5,6,7,8,9 이렇게 순차적으로 정렬하고 싶을 때,JAVA 로 정렬하는 코드를 짜보자! 사실 Arrays.sort 라는 method 를 사용하면 한 번에 끝남.하지만 for 문으로 해보기! package com.test.data;import java.util.Arrays;public class BubbleSort { public static void main(String[] args){ System.out.println("정렬 전"); int[] nums = {1,7,2,4,3,5,0,9,8,6}; System.out.println(Arra..

Computer Science 2024.08.29

[백준 10952번] A+B - 5 - JAVA code 풀이

문제 링크 : https://www.acmicpc.net/problem/10952 문제두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.입력입력은 여러 개의 테스트 케이스로 이루어져 있다.각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 입력의 마지막에는 0 두 개가 들어온다.출력 각 테스트 케이스마다 A+B를 출력한다.     [JAVA 풀이]package com.test.exam01;import java.util.Scanner;public class bakjoon { public static void main(String[] args){ Scanner input = new Scanner (System.in); ..

Computer Science 2024.08.29

[JAVA] 반복문 사용해서 1부터 100까지의 합 구하기 5가지 방법

JAVA 로 반복문 사용해서 1부터 100까지의 합 구하기! 1. for(){} 문package com.test.exam01;public class ForExam01 { public static void main(String[] args){ //////////////////////////////////// int sum = 0; for (int i = 1; i   2. while{} 문 1) while (조건 써주기) int j = 0; int newsum = 0; while (j  2) while (true) 이후, while 문 안에 if 와 break로 반복문 끝내기break 만 사용 int ..

Computer Science 2024.08.29

[JAVA] 인스턴스 변수와 클래스 변수 -> 코드 상으로 확인해보자!

인스턴스 변수와 클래스 변수를 확인해봅시다!아래 코드와 결과로 확인! package com.test.exam01;public class Sample { /* 클래스의 내부에 선언된 변수 --> 인스턴스 변수 인스턴스 변수의 scope은 이 변수가 선언된 클래스 전체에 미친다. 단, main method 내에서 영향을 미치기 위해서는 인스턴스 선언이 필요하다. 인스턴스 변수의 lifetime은 이 객체가 존재할 때까지... */ int x, y; /* 클래스의 내부에 선언된 static 변수 --> static 이 붙으면 클래스 변수! 클래스 변수의 scope 은 이 변수가 선언된 클래스 전체에 미친다. */ static i..

Computer Science 2024.08.28
반응형