ํ์ฌ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ์์ ๋๋ก ์ขํ๋ฅผ ์ถ์ถํ ํ์๊ฐ ์์ด v-world๋ก ์งํํ์๋ค
์ฐ์ html๊ณผ js๋ก ๋งต์ ์์ฑํ๊ณ ํด๋ฆญํ์์ ๋ v-world์ ์ขํ์ ์, ๊ฒฝ๋๋ฅผ ์ฝ์์ฐฝ์ ์ถ๋ ฅํ ์ ์๋๋ก ๊ตฌํํ๋ค
(๋ํ ๊ฒ์ ๊ธฐ๋ฅ๋ !)
์ผ๋จ v-world ์ฌ์ดํธ์์ ํ์๊ฐ์ ํ ์ธ์ฆํค ๋ฐ๊ธ ์ ์ฒญ์ ํด์ฃผ์ด์ผ ํ๋ค
๋์ ๊ฒฝ์ฐ ๋ฐ๋ก ์ธ์ฆํค๊ฐ ๋ฐ๊ธ๋์๋ค
์ฐ์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค
- 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); // ์ค๋ ๋ฒจ ์ค์
}
});
์ผ๋จ ํด๋ฆญํ์ ๋์ ์ขํ๋ค์ ์ถ์ถ๋๋๋ฐ ๋๋ก์ ์์ ์ผ์ ๊ฐ๊ฒฉ์ ๋๊ณ ์ขํ๋ฅผ ๋ฝ์๋ด๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด ๋ด์ผ ํ ๊ฒ ๊ฐ๋ค
's t u d y . . ๐ง > ์ด๊ฒ์ ๊ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ping test] ์๋ฒ๊ฐ ์ ๋๋ก ๋์๊ฐ๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ (0) | 2023.08.06 |
---|---|
[GIT] mac os! xcrun: error ํด๊ฒฐํ๊ธฐ (0) | 2023.08.04 |
๊ตฌ๊ธ๋งต์์ ์๋ ๊ฒฝ๋ ์ถ์ถํ๊ธฐ (0) | 2023.07.30 |
[streamlit] python์ผ๋ก ๊ฐ๋จํ๊ฒ ์น์ฑ ๋ง๋ค๊ธฐ (0) | 2023.07.30 |
[chatGPT] chatGPT API ์ฌ์ฉํ๊ธฐ ๐ซง (0) | 2023.04.14 |