코딩 강좌 35

다각형 외부의 점에서 가장 가까운 점 다각형 내 위치 찾기

turf.js와 leaflet을 이용해 지도상의 특정 위치에서 가장 가까운 다각형 위의 점을 찾는 코드입니다. 마지막에 첨부된 내용을 파일로 저장해 브라우저로 열어보시면 아래와 같은 실행결과를 확인할 수 있습니다.코드의 전체적인 흐름은 아래와 같습니다.// 지도 초기화:// 호주 중심부 근처(-26°, 128°)에 지도를 생성하고 줌 레벨을 5로 설정합니다.var map = L.map("map").setView([-26, 128], 5);// 타일 레이어 추가:// Carto의 밝은 스타일 지도 타일을 배경으로 추가합니다.L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png'...)// 다각형 생성:// 호주 내부에 직사각형 모..

#3-2 OrTools로 bin packing 문제 해결(CP-SAT)

이전 글에 이어서 제약조건을 설정하고 최적화를 실행하는 부분을 설명하겠습니다. # 제약조건 for i in range(n): model.Add(xb1[i] == x[i] + b[i]*W) model.Add(xb2[i] == xb1[i] + w[i]) model.AddNoOverlap2D(xival,yival) model.AddMaxEquality(z,[b[i] for i in range(n)]) # 목적함수 model.Minimize(z) # 모델 최적화 solver = cp_model.CpSolver() # 로그 남기기 solver.parameters.log_search_progress = True # search worker 개수 지정 - 멀티스레드 #solver.parameters.num_searc..

#3-1 OrTools로 bin packing 문제 해결(CP-SAT)

2D bin packing(상자 채우기) 문제는 2차원 평면에 사각형의 객체를 적절히 채우는 문제입니다. 이 문제를 푸는 방법은 상당히 여러가지가 있는 것 같습니다. 여기말고 '티바이트' 라는 분의 블로그에 상당히 자세한 알고리즘 풀이가 있으니, 궁금하신 분들은 참고하시면 좋을 것 같습니다. 이 글에서는 OrTools의 CP-SAT 솔버를 통해 문제를 해결하는 방법을 보여드립니다. 아래 소스의 대부분은 "Yet Another Math Programming Consultant"라는 분의 블로그의 글을 참고했습니다. 우선 결과부터 보여드리면 아래와 같습니다. 너비 68, 높이 60 영역에 50개에 서로 크기가 같거나 다른 상자를 채운 모습입니다. 소스는 크게 4부분으로 나누어 집니다. 데이터 정의 제약 조건..

#2 OrTools로 n-Queens 솔루션 결과 출력

이전 글에서 orTools로 n-Queens 솔루션을 찾는 방법을 설명했습니다. 이번 글에서는 지난 번 글에 이어지는 글로 솔루션의 결과를 출력하는 방법을 소개합니다. ### 모델 해결 solver = cp_model.CpSolver() ### 모델 다이어그램 출력 printer = DiagramPrinter(queens) ### 모델 다이어그램 출력 status = solver.SearchForAllSolutions(model, printer) print() print('찾은 솔루션 개수 : %i' % printer.SolutionCount()) print("걸린 시간: ", solver.WallTime(), "ms") 지난 번 소스 맨 마지막 부분을 보면 solver를 통해 솔루션을 찾기에서 Diag..

#1 OrTools로 n-Queens 해답 찾기

N-Queens 문제는 가로, 세로 칸의 수가 동일한 체스판 모든 행에 서로 공격할 수 없는 퀸을 배치하는 문제입니다. 이 문제에 대한 자세한 정보는 위키백과에서 확인 할 수 있습니다. 아래는 OrTools 최적화 도구를 이용해 N-Queens 문제를 푸는 python 소스입니다. import sys # CP-SAT 솔버 from ortools.sat.python import cp_model def main(board_size): model = cp_model.CpModel() # 변수 생성 # 배열의 인덱스는 열(column), 값은 행(Row) queens = [model.NewIntVar(0, board_size - 1, 'x%i' % i) for i in range(board_size)] # 제약..

#0 OrTools란 무엇인가?

Google Optimization Tools로 구글에서 만들어 무료(open-source)로 배포하고 있는 최적화 도구입니다. 최적화 도구란 여러가지 선택 가능한 문제를 수학적 모델로 정의하고 가장 나은 선택을 제시해 주는 프로그램이라고 할 수 있다. 예를 자주 드는 N-Queen 문제가 있다. 크기가 N x N 인 체스판 위에 퀸 N 개가 서로를 공격 할 수 없게 놓는 경우의 수를 구하는 문제 체스에서 퀸은 대각선과 가로, 세로로 공격할 수 있다. 그러면 N x N 크기의 체스판에서 공격할 수 없게 놓을 수 있는 퀸 배치 경우의 수는 몇개인가? N-Queens 문제는 최적화라기보다 가능한 모든 경우의 수를 구하는 문제이지만, 최대값, 최소값을 구하는 문제도 Or-Tools를 통해 구할 수 있다. Or..

MapLibre - #7 나만의 맞춤 지도 앱스토어 주소

MapLibre 강좌를 통해 설명드렸던 기능들을 모아 구글 앱 스토어에 올렸습니다. (*2월21일 현재 구글 앱스토어에 등록 심사중입니다) 브이월드에서 받은 API키를 입력하면 아래 영상처럼 오픈 스트리트맵 배경지도 위에 연속지적도를 겹처서 볼 수 있습니다. 한번 입력한 API키는 앱 환경설정(shared preferences)에 저장되어 매번 입력할 필요 없게 했습니다. 만약 유효기간이 지나면 브이월드 API 키 수정 메뉴로 갱신 가능합니다. 연속지적도 뿐 아니라 다양한 정보를 불러서 응용할 수 있습니다. * WMS명, WFS명, 스타일명은 소문자만 가능합니다. 구분한글명칭WMS명WFS명스타일명비고 경계 광역시도 lt_c_adsido lt_c_adsido_info lt_c_adsido 2D lt_c_a..

MapLibre - #6 내 위치 공시지가 확인 코딩 2편

이번 글에서는 브이월드 WFS 서비스로 가져온 지적정보를 화면에 표시하는 방법을 설명드리겠습니다. 아래 실행 화면처럼 정보창을 표시하기위해 MapLibre에서 제공하는 MarkerView 플러그인을 사용하겠습니다. MarkerView 플러그인을 사용하시려면 build.gradle 파일에 아래 내용을 추가하시고 Sync Project with gradle files(안드로이드 스튜디오 기준) 해 주시면됩니다. implementation 'org.maplibre.gl:android-plugin-markerview-v9:1.0.0' Repository 이름이 Mapbox SDK v9와 거의 동일한 명명 규칙을 갖고 있으니, 참고하십시오. 주요 소스는 아래와 같습니다. AddMarkerSymbol이라는 메서드를..

MapLibre - #5 내 위치 공시지가 확인 코딩 1편

이번 글은 내가 지도에서 터치한 곳의 공시지가를 확인하는 코드입니다. 이번 글도 이전 MapLibre 강좌와 이어집니다. 공시지가를 확인 하는 방법은 여러가지가 있겠지만, 국토교통부 브이월드 서비스에서 제공하는 OpenAPI를 활용하는 방법으로 코드를 작성했습니다. 가져오는 내용은 선택위치의 지번주소와 공시지가, 공시지가 기준월을 브이월드 WFS 서비스를 통해 가져옵니다. 주요 코드부분은 맵이 준비가 되면(onMapReady), 맵 클릭 이벤트 핸들러를 등록해 줍니다. 맵 클릭 이벤트에서 해당 포인트의 경위도 좌표를 획득하고 브이월드 WFS 요청 URL을 생성합니다. 브이월드 WFS URL 요청문 설명 페이지를 참고하셔서 해당 구문을 작성하시면 됩니다. 이 예제에서는 filter 구문을 활용해 WFS U..