깊은바다거북
개발 공부 기록
깊은바다거북
전체 방문자
오늘
어제
  • 분류 전체보기 (219)
    • JAVA (9)
    • JavaScript (15)
    • 스파르타코딩클럽 (11)
      • [내일배움단] 웹개발 종합반 개발일지 (5)
      • [내일배움캠프] 프로젝트와 트러블 슈팅 (6)
    • SQL | NoSQL (4)
    • CS 등등 (0)
    • TIL | WIL (173)
    • 기타 에러 해결 (3)
    • 내 살 길 궁리 (4)

인기 글

최근 글

최근 댓글

태그

  • POST / GET 요청
  • Trie
  • tree
  • Leetcode
  • TypeScript
  • Til
  • 자료 구조
  • 자바스크립트 기초 문법
  • 자잘한 에러 해결
  • 재귀 함수
  • 코딩테스트 연습문제
  • Binary Tree(이진 트리)
  • 팀 프로젝트
  • DFS(깊이우선탐색)
  • BFS(너비우선탐색)
  • Inorder Traversal(중위 순회)
  • 최대 힙(Max Heap)
  • 최소 힙(Min Heap)
  • leetcode-cli
  • 01. 미니 프로젝트
  • TIT (Today I Troubleshot)
  • 점화식(Recurrence Relation)
  • Preorder Traversal(전위 순회)
  • 혼자 공부하는 자바스크립트
  • 프로그래머스
  • 시간 복잡도
  • Linked List
  • Backtracking(백트래킹)
  • BST(이진 탐색 트리)
  • 트러블 슈팅 Troubleshooting
hELLO · Designed By 정상우.
깊은바다거북

개발 공부 기록

3/15 수 (Kakao Map으로 위치 서비스 만드는 중) TIL
TIL | WIL

3/15 수 (Kakao Map으로 위치 서비스 만드는 중) TIL

2023. 4. 6. 20:44

(최종 프로젝트 진행중)

오늘 한 일

  • 카카오 우편 서비스 API가 좌표 ↔ 주소 로 바로바로 전환해주는지. 특히 좌표를 주소로.
  • 어제 만든 페이지를 손보고 새 페이지 작업에 들어갔다.
  • 품앗이 신청 페이지(진행중)
  • 품앗이 목록 조회 페이지
  • 품앗이 상세 조회 페이지

kakao developers - REST API 키 발급받는 페이지:

Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
https://developers.kakao.com/


※ 이하는 스스로 공부하며 적어둔 노트이며 불확실한 내용이 있을 수 있습니다. 학습용으로 적합하지 않음을 유념해주세요. ※

TypeORM findOne()을 하면 딸린 join도 하나밖에 안 가져온다

request 하나를 조회하기 위해 findOne()을 쓴 거였는데, request - user - cats[] 이렇게 연결된 관계에서 user에게 cat이 여러마리 있는데 자꾸 한 마리만 가져오는 것이다. 둘러봤더니 옆의 getRequests() 메소드는 여러 고양이 사진을 잘 가져오고 있었다. 차이는 find와 findOne 이라는 것 뿐. 그래서 바꿔봤더니 고양이 여러마리를 잘 join해옴을 확인할 수 있었다.

⇒ Many-to-One 관계의 테이블을 join하여 가져오고 싶을 땐, “One”쪽의 테이블로 ‘하나’를 조회하려고 할 때도 findOne이 아닌 find로 해줘야 ‘Many’쪽의 여러 데이터를 전부 가져오는 게 가능하다.

[카카오맵] Kakao developers 에서 key 받고 카카오 지도를 띄우기까지

하라는 대로 다 하고 (기본 튜터리얼은 아래에 적어두었다) 생긴 문제를 짧게 정리한다:

  • developers 앱을 하나 만들고 받은 4개 키들 중 REST API 키를 사용해야 하는 줄 알았는데 Javascript 키를 넣어야 했다.
  • 내 웹 주소를 등록하는 과정을 거쳐야 했다. (http://localhost:3000)
  • (가장 중요) 웹 주소를 등록하고 나서 키를 재발급 받아야 했다.

⇒ 이 모든 것을 해주고 나니 제대로 지도가 띄워졌다..!!

아래는 짧고 쉬운 공식 튜터리얼

(일단 여기 가이드가 공식이고 좋다: https://apis.map.kakao.com/web/guide/)

Kakao 지도 API
Kakao 지도 API를 이용해보세요. 다양한 샘플과 상세한 매뉴얼로 개발자분들의 시간을 아껴드리겠습니다!
https://apis.map.kakao.com/web/guide/

  • 주소를 검색하여 지도에 표시하는 예제 코드:
    <h1>주소 검색 후 지도에 표시</h1>
    <input type="text" id="sample5_address" placeholder="주소">
    <input type="button" onclick="sample5_execDaumPostcode()" value="주소 검색"><br>
    <div id="map" style="width:300px;height:300px;margin-top:10px;display:none"></div>
    
    <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
    <script src="//dapi.kakao.com/v2/maps/sdk.js?appkey=내_카카오맵_키&libraries=services"></script>
    <script>
        var mapContainer = document.getElementById('map'), // 지도를 표시할 div
            mapOption = {
                center: new daum.maps.LatLng(37.537187, 127.005476), // 지도의 중심좌표
                level: 5 // 지도의 확대 레벨
            };
    
        //지도를 미리 생성
        var map = new daum.maps.Map(mapContainer, mapOption);
        //주소-좌표 변환 객체를 생성
        var geocoder = new daum.maps.services.Geocoder();
        //마커를 미리 생성
        var marker = new daum.maps.Marker({
            position: new daum.maps.LatLng(37.537187, 127.005476),
            map: map
        });
    
    
        function sample5_execDaumPostcode() {
            new daum.Postcode({
                oncomplete: function(data) {
                    var addr = data.address; // 최종 주소 변수
    
                    // 주소 정보를 해당 필드에 넣는다.
                    document.getElementById("sample5_address").value = addr;
                    // 주소로 상세 정보를 검색
                    geocoder.addressSearch(data.address, function(results, status) {
                        // 정상적으로 검색이 완료됐으면
                        if (status === daum.maps.services.Status.OK) {
    
                            var result = results[0]; //첫번째 결과의 값을 활용
    
                            // 해당 주소에 대한 좌표를 받아서
                            var coords = new daum.maps.LatLng(result.y, result.x);
                            // 지도를 보여준다.
                            mapContainer.style.display = "block";
                            map.relayout();
                            // 지도 중심을 변경한다.
                            map.setCenter(coords);
                            // 마커를 결과값으로 받은 위치로 옮긴다.
                            marker.setPosition(coords)
                        }
                    });
                }
            }).open();
        }
    </script>

    (참고: https://postcode.map.daum.net/guide 의 다섯 개 유용한 예제 중 하나)

⇒ <script src="//dapi.kakao.com/v2/maps/sdk.js?appkey=내_카카오맵_키&libraries=services"></script>

이게 바로 카카오 지도를 받아오는 js 스크립트인데 services 라이브러리가 바로 주소-좌표 변환용 라이브러리라고 한다.

그 밖의 라이브러리:

  • clusterer: 마커를 클러스터링 할 수 있는 클러스터러 라이브러리 입니다.
  • services: 장소 검색 과 주소-좌표 변환 을 할 수 있는 services 라이브러리 입니다.
  • drawing: 지도 위에 마커와 그래픽스 객체를 쉽게 그릴 수 있게 그리기 모드를 지원하는 drawing 라이브러리 입니다.

[카카오맵] 주소(도로명, 동네명 등)로 위도와 경도 좌표 얻기

카카오맵 Docs

Kakao 지도 API
Kakao 지도 API를 이용해보세요. 다양한 샘플과 상세한 매뉴얼로 개발자분들의 시간을 아껴드리겠습니다!
https://apis.map.kakao.com/web/documentation/#Map_getCenter

이곳에 따르면 geocoder.addressSearch(좌표, 콜백) 하면 이렇게 된다는 결과값 중

Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
https://developers.kakao.com/docs/latest/ko/local/dev-guide#address-coord-sample
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
  "meta": {
    "total_count": 4,
    "pageable_count": 4,
    "is_end": true
  },
  "documents": [
    {
      "address_name": "전북 익산시 부송동 100",
      "y": "35.97664845766847",
      "x": "126.99597295767953",
      "address_type": "REGION_ADDR",
      "address": {
        "address_name": "전북 익산시 부송동 100",
        "region_1depth_name": "전북",
        "region_2depth_name": "익산시",
        "region_3depth_name": "부송동",
        "region_3depth_h_name": "삼성동",
        "h_code": "4514069000",
        "b_code": "4514013400",
        "mountain_yn": "N",
        "main_address_no": "100",
        "sub_address_no": "",
        "x": "126.99597295767953",
        "y": "35.97664845766847"
      },
      "road_address": {
        "address_name": "전북 익산시 망산길 11-17",
        "region_1depth_name": "전북",
        "region_2depth_name": "익산시",
        "region_3depth_name": "부송동",
        "road_name": "망산길",
        "underground_yn": "N",
        "main_building_no": "11",
        "sub_building_no": "17",
        "building_name": "",
        "zone_no": "54547",
        "y": "35.976749396987046",
        "x": "126.99599512792346"
      }
    },
    ...
  ]
}

실험 결과,

var geocoder = new daum.maps.services.Geocoder();
...
function sample5_execDaumPostcode() {
    new daum.Postcode({
        oncomplete: function(data) {
            var addr = data.address; // 최종 주소 변수
						var extraAddress = data.bname? data.bname : ''; // 동 변수

            // 주소 정보를 해당 필드에 넣는다.
            document.getElementById("sample5_address").value = addr;
            document.getElementById("sample5_extraAddress").value = extraAddress;
		
            // 주소로 상세 정보를 검색
            geocoder.addressSearch(data.address, function(results, status) {
                // 정상적으로 검색이 완료됐으면
                if (status === daum.maps.services.Status.OK) {

                    var result = results[0]; //첫번째 결과의 값을 활용

                    // 해당 주소에 대한 좌표를 받아서
                    var coords = new daum.maps.LatLng(result.y, result.x);

										console.log(coords.documents) // undefined
										console.log(coords.meta); // undefined
										console.log('data.address.x: ', addr.x) // undefined
										console.log('data.x: ', data.x) // undefined
										console.log('results: ', results) // 어떤 결과
										console.log('result: ', results[0]) 
											// => {address: {…}, address_name: '서울 마포구 백범로16안길 21', address_type: 'ROAD_ADDR', road_address: {…}, x: '126.943246321233', …}

⇒ 이로 보건데 results가 바로 위의 docs에서 명시된 ‘documents’: [ {값1}, {값2}, … ]이고, results[0] = 값1 = { address_name, y, x, address_type, address, road_address }로 이루어진 결과값 하나하나인 것을 알았다.

⇒ 즉 경도와 위도를 따로따로 얻으려면 results[0][x], results[0][x] 이렇게 하면 되겠다!

[카카오맵] 어떤 좌표가 특정 영역에 포함되어 있는지 여부 알아내기

“카카오 map api 좌표 중심 반경 5km 찾기”로 검색하여 찾은 레퍼런스.

지오로케이션위치로부터 1km 3km 5km 전체 위치 표시하기
마커를 배열로 관리하고 라디오 버튼이 눌렸을 때 지도의 중심 좌표와 마커들 간의 거리를 비교해서 범위 안에 있는 마커를 표시해주세요. 아래 링크와 코드 함께 참고해주세요. <body> <div id="map" style="width:100%;height:350px;"></div> <button onclick="showMarker(1000)">1km</button> <button onclick="showMarker(3000)">3km</button> <button onclick="showMarker(5000)">5km</button> <button onclick="showMarker(100000)">모두보기</button> <script> var mapContainer = document.getElementById('map'), // 지도를 표시할 div mapOption = { c...
https://devtalk.kakao.com/t/1km-3km-5km/106933/2
// 자바스크립트 코드 정리:
var markers = [ marker1, marker2, .... ];
var circle = new kakao.maps.Circle(options);
var center = circle.getPosition();
var radius = circle.getRadius();
var line = new kakao.maps.Polyline();

markers.forEach(function(marker) {
    // 마커의 위치와 원의 중심을 경로로 하는 폴리라인 설정
    var path = [ marker.getPosition(), center ];
    line.setPath(path);
    
    // 마커와 원의 중심 사이의 거리
    var dist = line.getLength();

    // 이 거리가 원의 반지름보다 작거나 같다면
    if (dist <= radius) {
        // 해당 marker는 원 안에 있는 것
    }
});
// HTML 코드: 
<body>
    <div id="map" style="width:100%;height:350px;"></div>

    <button onclick="showMarker(1000)">1km</button>
    <button onclick="showMarker(3000)">3km</button>
    <button onclick="showMarker(5000)">5km</button>
    <button onclick="showMarker(100000)">모두보기</button>

    <script>
        var mapContainer = document.getElementById('map'), // 지도를 표시할 div
        mapOption = {
            center: new kakao.maps.LatLng(33.450701, 126.570667), // 지도의 중심좌표
            level: 7 // 지도의 확대 레벨
        };

        // 지도를 생성합니다
        var map = new kakao.maps.Map(mapContainer, mapOption);

        var current = new kakao.maps.Marker({
            map: map,
            position: new kakao.maps.LatLng(33.450701, 126.570667)
        });

        // 주소-좌표 변환 객체를 생성합니다
        var geocoder = new kakao.maps.services.Geocoder();
        var add = ['제주특별자치도 제주시 첨단로 242', '제주특별자치도 제주시 명림로 575-107', '제주특별자치도 제주시 516로 2870', '제주특별자치도 제주시 한북로 313'];
        var markers = [];
        for(let i=0; i <add.length; i++){
        geocoder.addressSearch(add[i], function(result, status) {
            // 정상적으로 검색이 완료됐으면
            if (status === kakao.maps.services.Status.OK) {
                var coords = new kakao.maps.LatLng(result[0].y, result[0].x);
                // 결과값으로 받은 위치를 마커로 표시합니다
                var marker = new kakao.maps.Marker({
                    map: map,
                    position: coords
                });

                markers.push(marker);
            }
        });
    }

    var circle = new kakao.maps.Circle({});

    function showMarker(radius) {
        var center = map.getCenter();
        var line = new kakao.maps.Polyline();

        if(radius < 100000) {
            circle.setMap(map);
            circle.setPosition(center);
            circle.setRadius(radius);
        } else {
            // 전체보기
            circle.setMap(null);
        }

        markers.forEach(marker => {
            var path = [marker.getPosition(), center];
            line.setPath(path);

            // 마커와 원의 중심 사이의 거리
            var dist = line.getLength();

            // 이 거리가 원의 반지름보다 작거나 같다면
            if (dist <= radius) {
                // 해당 marker는 원 안에 있는 것
                marker.setMap(map);
            } else {
                marker.setMap(null);
            }
        });
    }
    </script>

Uploaded by N2T

    'TIL | WIL' 카테고리의 다른 글
    • 3/17 금 (<img> 경로 설정 문제) TIL, TIT
    • 3/16 목 (Geolocation API와 Kakao Map으로 위치 인증 간단히 구현하기) TIL
    • 3/14 화 (ejs는 일일이 눈으로 검사해서 에러를 찾아야 함이 불편) TIL, TIT
    • 3/13 월 (VS Code의 Rest Client 옵션을 초기화해주다) TIL, TIT
    깊은바다거북
    깊은바다거북

    티스토리툴바