s t u d y . . 🍧/이것저것

[v-world] μœ„λ„, 경도 및 v-world μ’Œν‘œ μΆ”μΆœ

H J 2023. 7. 30. 21:42

ν˜„μž¬ μ§„ν–‰ν•˜κ³  μžˆλŠ” ν”„λ‘œμ νŠΈμ—μ„œ λ„λ‘œ μ’Œν‘œλ₯Ό μΆ”μΆœν•  ν•„μš”κ°€ μžˆμ–΄ v-world둜 μ§„ν–‰ν•˜μ˜€λ‹€

 

μš°μ„  htmlκ³Ό js둜 맡을 μƒμ„±ν•˜κ³  ν΄λ¦­ν•˜μ˜€μ„ λ•Œ v-world의 μ’Œν‘œμ™€ μœ„, 경도λ₯Ό μ½˜μ†”μ°½μ— 좜λ ₯ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν–ˆλ‹€

(λ˜ν•œ 검색 κΈ°λŠ₯도 !)

 

일단 v-world μ‚¬μ΄νŠΈμ—μ„œ νšŒμ›κ°€μž… ν›„ 인증킀 λ°œκΈ‰ 신청을 ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€

 

곡간정보 μ˜€ν”ˆν”Œλž«νΌ μ˜€ν”ˆAPI

μ˜€ν”ˆ API λˆ„κ΅¬λ‚˜ μ‚¬μš©ν•  수 μžˆλŠ” 지도 μ˜€ν”ˆν”Œλž«νΌμ˜ μ˜€ν”ˆ API μ„œλΉ„μŠ€λŠ” κ΅­κ°€ κ³΅κ°„μ •λ³΄μ˜ 개방, 곡유, μ°Έμ—¬λ₯Ό 톡해 κ³΅κ°„μ •λ³΄μ˜ 자율적이고 창쑰적인 λ‹€μ–‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆλ„λ‘ 기술

www.vworld.kr

λ‚˜μ˜ 경우 λ°”λ‘œ 인증킀가 λ°œκΈ‰λ˜μ—ˆλ‹€

 

μš°μ„  κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€

 

  • html μ½”λ“œ
<script type="text/javascript" src="http://map.vworld.kr/js/vworldMapInit.js.do?version=2.0&apiKey=[인증킀]"></script>
 
<div class='title'>
    <p></p>
</div>
    <article class="at_1">
        <div class="search_div">
            <span>
                <select class='search_type'>
                    <option value="road">λ„λ‘œλͺ…</option>
                    <option value="parcel" selected>μ§€λ²ˆ</option>
                </select>
            </span>
                <span><input type="text" id="search" placeholder="μ°Ύκ³ μžν•˜λŠ” 것을 μž…λ ₯ν•˜μ„Έμš”."></span>
                <span><button class="search_btn">검색</button>
        </div>
        <div class="map_wrap">
            <div id='vMap'></div>
            <div class="custom_typecontrol radius_border">
                <span id="btnRoadmap" class="selected_btn active">지도</span>
                <span id="btnSkyview" class="selected_btn">λ‘œλ“œλ·°</span>
                <span id="btnCommercial" class="selected_btn">μƒκΆŒ</span>
            </div>
        </div>
</article>

<script src="map.js"></script>

 

  • JavaScript μ½”λ“œ
var vmap;                                                                           // κΈ°λ³Έ 지도λ₯Ό 받을 λ³€μˆ˜
var markerLayer;                                                                    // 마컀 λ ˆμ΄μ–΄λ₯Ό 받을 λ³€μˆ˜
var x,y;                                                                            // ν΄λ¦­ν•œ μœ„κ²½λ„λ₯Ό 받을 λ³€μˆ˜
var checkRoadView = false;
var key = "[인증킀]";                                   // λΈŒμ΄μ›”λ“œ 인증킀
var titleName;                                                                      // λ§ˆμ»€μ— ν‘œμ‹œλ  검색방법 타이틀


vw.ol3.CameraPosition.center = [14145868.603246644, 4516117.737187111];             // κΈ°λ³Έ 지도 μ‹œμž‘ 쀑심 μ’Œν‘œ μ§€μ •(μ„Έμ’…λŒ€)
vw.ol3.CameraPosition.zoom = 17;                                                    // μ‹œμž‘ Zoom 레벨

vw.ol3.MapOptions = {                                                               // κΈ°λ³Έμ§€λ„μ˜ μ˜΅μ…˜
    basemapType: vw.ol3.BasemapType.GRAPHIC
, controlDensity: vw.ol3.DensityType.EMPTY
, interactionDensity: vw.ol3.DensityType.BASIC
, controlsAutoArrange: true
, homePosition: vw.ol3.CameraPosition
, initPosition: vw.ol3.CameraPosition
}; 
    
vmap = new vw.ol3.Map("vMap",  vw.ol3.MapOptions);                                  // κΈ°λ³Έ 지도 생성  


// 지도 클릭 이벀트
vmap.on('click', function(event) {
    
    var feature = vmap.forEachFeatureAtPixel(event.pixel, function (feature,layer) {// ν΄λ¦­ν•œ μ’Œν‘œλ₯Ό 첫번째 인자둜 μ£Όμ–΄ ν•΄λ‹Ή μœ„μΉ˜μ— μžˆλŠ” featureλ₯Ό κ΅¬ν•˜κ³  λ‘λ²ˆμ¨° 인자(ν•¨μˆ˜)둜 λ„˜κ²¨μ€€λ‹€.
        if(layer != null && layer.className == 'vw.ol3.layer.Marker'){              // ν•΄λ‹Ή μ’Œν‘œμ— 마컀 λ ˆμ΄μ–΄κ°€ μžˆλ‹€λ©΄
            return feature;
        }else{
            return false;
        }
    });
    
    if (!feature) {
        var coord = vmap.getCoordinateFromPixel(event.pixel);                       // 마우슀 μ»€μ„œ μ•„λž˜μ˜ μ’Œν‘œκ°’ κ΅¬ν•˜κΈ°
        x = coord[0];
        y = coord[1];
        if(checkRoadView){                                                          // λ‘œλ“œλ·° μ‹€ν–‰
            var tansform = ol.proj.transform([x,y], 'EPSG:3857', 'EPSG:4326')       // λΈŒμ΄μ›”λ“œ μ’Œν‘œκ³„μ—μ„œ λ‹€μŒ 지도 μ’Œν‘œκ³„λ‘œ λ³€ν™˜ EPSG:3857=>EPSG:4326
            location.href="https://map.kakao.com/link/roadview/"+tansform[1]+","+tansform[0];   // λ‘œλ“œλ·° 뢈러였기
        }else{
            addMarker(x, y);                                                        // addMarkerν•¨μˆ˜μ— μœ„κ²½λ„ λ³€μˆ˜ λ„˜κΈ°κ³  μ‹€ν–‰
            var tansform = ol.proj.transform([x,y], 'EPSG:3857', 'EPSG:4326')
            console.log("v-world μ’Œν‘œ :\n", x, y, "\nμœ„λ„, 경도 :\n", tansform[0], tansform[1])

        }
    }
});


function addMarker(lon ,lat) {
    vmap.removeLayer(markerLayer);                                          // 기쑴의 λ§ˆμ»€κ°€ μžˆλ‹€λ©΄ 제거
    markerLayer = new vw.ol3.layer.Marker(vmap);                            // 마컀 객체 상성

    var typeName = $('.search_type option:selected').val();                 // μ„ νƒν•œ 검색 μ’…λ₯˜ κ°’

    if(typeName == "road"){titleName = "λ„λ‘œλͺ… μ£Όμ†Œ";}
    else if(typeName == "parcel"){titleName = "μ§€λ²ˆ μ£Όμ†Œ";}

    //  (비동기)μ’Œν‘œλ₯Ό μ£Όμ†Œλ‘œ λ³€ν™˜ν•˜λŠ” api, λ„λ‘œλͺ…μ£Όμ†Œ κ²€μƒ‰μ˜ 경우 건물의 geometry 기반으둜 λ„λ‘œλͺ… μ£Όμ†Œκ°’μ„ κ°€μ§€κ³  였기 λ•Œλ¬Έμ— 
    //  건물 μ™Έμ˜ 것을 ν΄λ¦­ν•˜λ©΄ 값이 없을 수 μžˆμŠ΅λ‹ˆλ‹€. 
    //  λΈŒμ΄μ›”λ“œ μ§€λ„μ„œλΉ„μŠ€μ—μ„œ ν–‰μ • μ£Όμ œλ„μ€‘ λ„λ‘œλͺ…μ£Όμ†Œκ±΄λ¬Ό μ£Όμ œλ„μ— ν•΄λ‹Ή μ’Œν‘œκ°’μ΄ λ“€μ–΄μ™€μ•Όλ§Œ λ„λ‘œλͺ… μ£Όμ†Œκ°’μ„ 리턴 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
    $.ajax({ 
        type: 'GET',
        url: 'http://api.vworld.kr/req/address?',
        dataType : "jsonp",                                                 // CORS 문제둜 인해 λΈŒμ΄μ›”λ“œμ—μ„  jsonpλ₯Ό μ‚¬μš©ν•œλ‹€κ³  함
        data: {
            service: "address",
            version: "2.0",
            request: "getaddress",
            format: "json",                                                 // κ²°κ³Ό 포멧으둜 xml λ˜λŠ” json νƒ€μž…μœΌλ‘œ λ°›μ•„λ³Ό 수 μžˆλ‹€.
            key: key,                                                       // λΈŒμ΄μ›”λ“œ 인증킀
            type: typeName,                                                 // 검색 νƒ€μž…μœΌλ‘œ 'λ„λ‘œλͺ…:road' λ˜λŠ” 'μ§€λ²ˆ:parcel' λ˜λŠ” 'λ‘˜λ‹€:both' 쀑 선택
            crs: "epsg:3857",                                               // λΈŒμ΄μ›”λ“œ κΈ°λ³Έ μ’Œν‘œκ³„
            point: lon+","+lat,                                             // μ’Œν‘œ
            zipcode: true,                                                  // 우편번호 μ—¬λΆ€
            simple: false                                                   // κ°„λž΅ κ²°κ³Ό μ—¬λΆ€
        },
        success: function(json_data){
            if(json_data.response.status == "NOT_FOUND"){
                text = "검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€.";
            }else{
                text = json_data.response.result[0].text;                   // λ°›μ•„μ˜¨ jsonλ°μ΄ν„°μ—μ„œ μ£Όμ†Œλ₯Ό μΆ”μΆœ
            }
            
            vw.ol3.markerOption = {                                         // 마컀 μ˜΅μ…˜ μ„€μ •
                x : lon,
                y : lat,
                epsg : "EPSG:3857",
                title : titleName,
                contents : text,
                iconUrl : 'http://map.vworld.kr/images/ol3/marker_blue.png'
            };
            markerLayer.addMarker(vw.ol3.markerOption);                     // 마컀 μ˜΅μ…˜μ„ λ§ˆμ»€μ— 적용
            vmap.addLayer(markerLayer);                                     // 마컀λ₯Ό vmap에 등둝
        },
        error: function(xtr,status,error){
            alert(xtr +" : "+status+" : "+error);
        }
    });
};



// 지도 검색
$('.search_btn').on('click',function(){

    vmap.removeLayer(markerLayer);                              // 기쑴의 마컀 제거
    markerLayer = new vw.ol3.layer.Marker(vmap);                // 마컀 객체 상성

    var contents_data;
    var typeName = $('.search_type option:selected').val();     // μ„ νƒν•œ 검색 μ’…λ₯˜ κ°’
    
    $.ajax({
        type: "get",
        url: "http://api.vworld.kr/req/search",
        data : {
            page: 1,
            type: 'address',                                    // μ£Όμ†Œ 검색방법
            category: typeName,                                 // λ„λ‘œλͺ… : road, μ§€λ²ˆ : parcel
            request: 'search',
            apiKey: key,                                        // λΈŒμ΄μ›”λ“œ 지도 인증기
            domain: '본인의 map을 λ³΄μ—¬μ£ΌλŠ” 도메인 ex) http://111.111.111.111/map.html',
            crs : 'EPSG:3857',                                  // λΈŒμ΄μ›”λ“œ μ’Œν‘œκ³„
            query : $('#search').val()                          // μ‚¬μš©μžκ°€ μž…λ ₯ν•œ text
        },
        dataType: 'jsonp',
        async: false,
        success: function(data) {
            if(data.response.status =="NOT_FOUND"){
                alert("검색결과가 μ—†μŠ΅λ‹ˆλ‹€.");
            }else{
                for(var o in data.response.result.items){ 
                    if(o==0){
                        move(data.response.result.items[o].point.x*1,data.response.result.items[o].point.y*1);
                        if(typeName == "road"){
                            titleName = "λ„λ‘œλͺ… μ£Όμ†Œ";
                            contents_data = data.response.result.items[o].address.road;
                        }
                        else if(typeName == "parcel"){
                            titleName = "μ§€λ²ˆ μ£Όμ†Œ";
                            contents_data = data.response.result.items[o].address.parcel;
                        }
                    }

                    vw.ol3.markerOption = {                                         // 마컀 μ˜΅μ…˜ μ„€μ •
                        x : data.response.result.items[o].point.x,
                        y : data.response.result.items[o].point.y,
                        epsg : "EPSG:3857",
                        title : titleName,
                        contents : contents_data,
                        iconUrl : 'http://map.vworld.kr/images/ol3/marker_blue.png'
                    };

                    markerLayer.addMarker(vw.ol3.markerOption);                  // 마컀 μ˜΅μ…˜μ„ λ§ˆμ»€μ— 적용
                }
            }
        },
        complete:function(){
            vmap.addLayer(markerLayer)                                   // 마컀λ₯Ό vmap에 등둝
        },
        error: function(xhr, status, error) {
            console.log(xhr, status, error);
        }
    });
    var move = function(x,y){
        vmap.getView().setCenter([ x, y ]); // 지도 이동
        vmap.getView().setZoom(17);         // 쀌레벨 μ„€μ •
    }
});

 


일단 ν΄λ¦­ν–ˆμ„ λ•Œμ˜ μ’Œν‘œλ“€μ„ μΆ”μΆœλ˜λŠ”λ° λ„λ‘œμ˜ 상에 일정 간격을 두고 μ’Œν‘œλ₯Ό λ½‘μ•„λ‚΄λŠ” 방법을 κ³ λ―Όν•΄ 봐야 ν•  것 κ°™λ‹€

였늘 μ—΄μ‹¬νžˆ ν–ˆμœΌλ‹ˆκΉŒ μ§‘κ°€μ„œ μ•„λ”°λ§˜λ§ˆ λ³΄λ©΄μ„œ λŠ¦μ€ 저녁먹고 μžμ•Όμ§€