* 풀 소스 코드 맨 아래에 있습니다.
# 도움 받은 Shp 파일
http://www.gisdeveloper.co.kr/?p=2332
# vworld 참고 부분
# shp 파일을 올리기 위한 과정
- vworld 3d에 shp파일을 올리기 위해서 shp 파일을 QGIS 프로그램을 사용하여 geojson으로 변환합니다.
- QGIS 에서 shp 파일을 geojosn 파일로 변환
- geojson 파일을 미리 생성합니다.
- SIG_202101 파일을 sig.json 파일 생성
1. HTML 코드
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>WebGL_2.0_MapController</title>
<script type="text/javascript"
src="https://map.vworld.kr/js/webglMapInit.js.do?version=2.0&apiKey=767B7ADF-10BA-3D86-AB7E-02816B5B92E9"></script>
</head>
<div id="vmap" style="width:100%;height:50vh;left:0px;top:0px"></div>
<div id="features"></div>
<script type="text/javascript">
2. vworld 3d 맵 생성 부분
// 맵 생성
var mapOptions = new vw.MapOptions(
vw.BasemapType.GRAPHIC,
"",
vw.DensityType.FULL,
vw.DensityType.BASIC,
false,
new vw.CameraPosition(
new vw.CoordZ(126.9753042,37.5599416, 5000),
new vw.Direction(-90, 0, 0)
),
new vw.CameraPosition(
new vw.CoordZ(126.9753042,37.5599416, 5000),
new vw.Direction(0, -60, 0)
)
);
map = new vw.Map("vmap", mapOptions);
// 맵 생성 후, 콜백
vw.ws3dInitCallBack = function () {
// geojson 표현 스타일
let opt = [
{material: new vw.Color(0, 0, 154).ws3dColor.withAlpha(0.3)}, // 첫번째 shp 적용 스타일
{material: new vw.Color(102, 178, 255).ws3dColor.withAlpha(0.2)},
{material: new vw.Color(153, 0, 0).ws3dColor.withAlpha(0.2)},
{material: new vw.Color(255, 255, 51).ws3dColor.withAlpha(0.2)},
{material: new vw.Color(102, 0, 204).ws3dColor.withAlpha(0.2)},
];
// 불러올 geojson
[
"./file/sig.json",
].forEach((v, i) => {
geojson(v, opt[i] !== void 0 ? opt[i] : void 0);
});
}
3. geojson 생성 부분
/**
* @param url - 파일 경로
* @param opt - geojson 표현 방법
*/
function geojson(url, opt) {
// parser 설명.
var parser = new vw.GMLParser();
// 아이디 지정. --> parser에 지정이 되면, Feature객체에게도 상속 "sample-0,1,..." 형태로 아이디가 부여됩니다.
parser.setId(url);
//var featureInfos = parser.readTemp(vw.GMLParserType.GEOJSON, url, "EPSG:900913");
// data 읽기. parser.read( 데이터타입, 데이터경로, 데이터좌표계)
// 전달되는 좌표계를 의미하며, 이 좌표를 웹지엘에서는 EPSG:4326으로 변환하여 사용합니다.
// 데이터타입. vw.GMLParserType { GEOJSON, GML1, GML2, GML2 }
var featureInfos = parser.read(vw.GMLParserType.GEOJSON, url, "EPSG:4326");
console.log("featureInfos :", featureInfos);
var option = {
isTerrain: true, // 지형 따라 출력시 true, 지면에서 위로 출력시 false
width: 10, // 선의 경우 크기지정.
material: new vw.Color(Math.floor(Math.random() * 255), Math.floor(Math.random() * 255), Math.floor(Math.random() * 255)).ws3dColor.withAlpha(0.1), // RGBA A값만 255이하로 주면 투명 또는 withAlpha(1.0~0.1)로 설정.
// material: new vw.Color(0, 0, 128).ws3dColor.withAlpha(1), // RGBA A값만 255이하로 주면 투명 또는 withAlpha(1.0~0.1)로 설정.
outline: true, // 아웃라인지정시 true, 아웃라인 미지정 false 지형 결합 시 라인이 생성되지않음
outlineWidth: 5, // 아웃라인 너비.
outlineColor: vw.Color.YELLOW.ws3dColor, // 아웃라인 색상.
height: 1.0 // 높이 지정값 meter.
};
var options = {...option, ...opt};
// 출력 색상등 지정.
featureInfos.setOption(options);
const promise = new Promise((resolve, reject) => {
featureInfos.makeCoords();
resolve('promise');
});
promise.then((value) => {
// console.log(value);
var result = "";
featureInfos.objCollection.collectionProp.forEach(function (i) { // objCollection.collectionProp 객체의 속성 값을 가지고 있음
// console.log(i);
result += i.properties.SIG_KOR_NM + " "
$("#features").html(result);
})
});
var selFeature = null;
// 이벤트
var featureEventHandler = function (windowPosition, ecefPosition, cartographic, featureInfo) {
//ws3d.viewer.map.clearAllHighlightedFeatures();
//featureInfo 가 존재 -> 3D 객체 클릭
//onsole.log("featureInfo :" , windowPosition, ecefPosition, cartographic, featureInfo);
if (featureInfo) {
var feature = featureInfos.getById(featureInfo.groupId);
// console.log("after feature :", featureInfos.objCollection);
console.log("feature :", feature);
// 그래픽객체 미출력
// feature.hide();
// FeatureInfo 객체 삭제1.
//featureInfos.removeById(feature.id);
// FeatureInfo 객체 삭제2.
// featureInfos.removeByObj(feature);
// feature 정보를 가지고 있는 properties
console.log("feature properties:" , feature.getProperties());
// console.log("after feature :", featureInfos.objCollection);
// 이전 선택 객체 보여주기
if(selFeature) {
selFeature.show();
}
// 객체 변경 후, 숨기기
selFeature = feature;
selFeature.hide();
}
};
// 이벤트 설정.
featureInfos.addEventListener(featureEventHandler);
// 출력.
featureInfos.show();
}
4. 결과화면
- geojson 표현된 부분 클릭 시, hide() 및 정보를 console를 통해 확인 가능합니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>WebGL_2.0_MapController</title>
<script type="text/javascript"
src="https://map.vworld.kr/js/webglMapInit.js.do?version=2.0&apiKey=767B7ADF-10BA-3D86-AB7E-02816B5B92E9"></script>
</head>
<div id="vmap" style="width:100%;height:50vh;left:0px;top:0px"></div>
<div id="features"></div>
<script type="text/javascript">
// 맵 생성
var mapOptions = new vw.MapOptions(
vw.BasemapType.GRAPHIC,
"",
vw.DensityType.FULL,
vw.DensityType.BASIC,
false,
new vw.CameraPosition(
new vw.CoordZ(126.9753042,37.5599416, 5000),
new vw.Direction(-90, 0, 0)
),
new vw.CameraPosition(
new vw.CoordZ(126.9753042,37.5599416, 5000),
new vw.Direction(0, -60, 0)
)
);
map = new vw.Map("vmap", mapOptions);
// 맵 생성 후, 콜백
vw.ws3dInitCallBack = function () {
// geojson 표현 스타일
let opt = [
{material: new vw.Color(0, 0, 154).ws3dColor.withAlpha(0.3)}, // 첫번째 shp 적용 스타일
{material: new vw.Color(102, 178, 255).ws3dColor.withAlpha(0.2)},
{material: new vw.Color(153, 0, 0).ws3dColor.withAlpha(0.2)},
{material: new vw.Color(255, 255, 51).ws3dColor.withAlpha(0.2)},
{material: new vw.Color(102, 0, 204).ws3dColor.withAlpha(0.2)},
];
// 불러올 geojson
[
"./file/sig.json",
].forEach((v, i) => {
geojson(v, opt[i] !== void 0 ? opt[i] : void 0);
});
}
/**
* @param url - 파일 경로
* @param opt - geojson 표현 방법
*/
function geojson(url, opt) {
// parser 설명.
var parser = new vw.GMLParser();
// 아이디 지정. --> parser에 지정이 되면, Feature객체에게도 상속 "sample-0,1,..." 형태로 아이디가 부여됩니다.
parser.setId(url);
//var featureInfos = parser.readTemp(vw.GMLParserType.GEOJSON, url, "EPSG:900913");
// data 읽기. parser.read( 데이터타입, 데이터경로, 데이터좌표계)
// 전달되는 좌표계를 의미하며, 이 좌표를 웹지엘에서는 EPSG:4326으로 변환하여 사용합니다.
// 데이터타입. vw.GMLParserType { GEOJSON, GML1, GML2, GML2 }
var featureInfos = parser.read(vw.GMLParserType.GEOJSON, url, "EPSG:4326");
console.log("featureInfos :", featureInfos);
var option = {
isTerrain: true, // 지형 따라 출력시 true, 지면에서 위로 출력시 false
width: 10, // 선의 경우 크기지정.
material: new vw.Color(Math.floor(Math.random() * 255), Math.floor(Math.random() * 255), Math.floor(Math.random() * 255)).ws3dColor.withAlpha(0.1), // RGBA A값만 255이하로 주면 투명 또는 withAlpha(1.0~0.1)로 설정.
// material: new vw.Color(0, 0, 128).ws3dColor.withAlpha(1), // RGBA A값만 255이하로 주면 투명 또는 withAlpha(1.0~0.1)로 설정.
outline: true, // 아웃라인지정시 true, 아웃라인 미지정 false 지형 결합 시 라인이 생성되지않음
outlineWidth: 5, // 아웃라인 너비.
outlineColor: vw.Color.YELLOW.ws3dColor, // 아웃라인 색상.
height: 1.0 // 높이 지정값 meter.
};
var options = {...option, ...opt};
// 출력 색상등 지정.
featureInfos.setOption(options);
const promise = new Promise((resolve, reject) => {
featureInfos.makeCoords();
resolve('promise');
});
promise.then((value) => {
// console.log(value);
var result = "";
featureInfos.objCollection.collectionProp.forEach(function (i) { // objCollection.collectionProp 객체의 속성 값을 가지고 있음
// console.log(i);
result += i.properties.SIG_KOR_NM + " "
$("#features").html(result);
})
});
var selFeature = null;
// 이벤트
var featureEventHandler = function (windowPosition, ecefPosition, cartographic, featureInfo) {
//ws3d.viewer.map.clearAllHighlightedFeatures();
//featureInfo 가 존재 -> 3D 객체 클릭
//onsole.log("featureInfo :" , windowPosition, ecefPosition, cartographic, featureInfo);
if (featureInfo) {
var feature = featureInfos.getById(featureInfo.groupId);
// console.log("after feature :", featureInfos.objCollection);
console.log("feature :", feature);
// 그래픽객체 미출력
// feature.hide();
// FeatureInfo 객체 삭제1.
//featureInfos.removeById(feature.id);
// FeatureInfo 객체 삭제2.
// featureInfos.removeByObj(feature);
// feature 정보를 가지고 있는 properties
console.log("feature properties:" , feature.getProperties());
// console.log("after feature :", featureInfos.objCollection);
// 이전 선택 객체 보여주기
if(selFeature) {
selFeature.show();
}
// 객체 변경 후, 숨기기
selFeature = feature;
selFeature.hide();
}
};
// 이벤트 설정.
featureInfos.addEventListener(featureEventHandler);
// 출력.
featureInfos.show();
}
</script>
<body>
</body>
</html>