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);         // ์คŒ๋ ˆ๋ฒจ ์„ค์ •
    }
});

 


์ผ๋‹จ ํด๋ฆญํ–ˆ์„ ๋•Œ์˜ ์ขŒํ‘œ๋“ค์„ ์ถ”์ถœ๋˜๋Š”๋ฐ ๋„๋กœ์˜ ์ƒ์— ์ผ์ • ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ์ขŒํ‘œ๋ฅผ ๋ฝ‘์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด ๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค

์˜ค๋Š˜ ์—ด์‹ฌํžˆ ํ–ˆ์œผ๋‹ˆ๊นŒ ์ง‘๊ฐ€์„œ ์•„๋”ฐ๋ง˜๋งˆ ๋ณด๋ฉด์„œ ๋Šฆ์€ ์ €๋…๋จน๊ณ  ์ž์•ผ์ง€