3D 지도상의 건물 모델에 정보, 속성등을 넣어 육안으로 확인 할수 있도록 하였습니다.
JS SCRIPT
var cmworld;
//용적율 변수
var m_BuildingRates = {};
var m_PNUField = "A1";
var m_CodeField = "용도코드";
var m_LandAreaField = "LAND_AREA";
var m_BuildAreaField = "BUILD_AREA";
var wgslatlon;
var wgsutm;
var utmk;
function getBuildingRates()
{
m_BuildingRates['UQA111'] = 1.00;
m_BuildingRates['UQA112'] = 1.20;
m_BuildingRates['UQA121'] = 1.50;
m_BuildingRates['UQA122'] = 2.00;
m_BuildingRates['UQA123'] = 2.50;
m_BuildingRates['UQA130'] = 4.00;
m_BuildingRates['UQA210'] = 10.00;
m_BuildingRates['UQA220'] = 8.00;
m_BuildingRates['UQA230'] = 6.00;
m_BuildingRates['UQA240'] = 6.00;
m_BuildingRates['UQA310'] = 2.00;
m_BuildingRates['UQA320'] = 2.00;
m_BuildingRates['UQA330'] = 4.00;
m_BuildingRates['UQA410'] = 0.50;
m_BuildingRates['UQA420'] = 0.50;
m_BuildingRates['UQA430'] = 0.50;
}
function openShp()
{
var url2 = "파일경로";
shp(url2).then(function (data2) {
var geoDataLen2 = data2.features.length; // 실행한 shp 파일의 객체 수를 저장합니다
console.log(geoDataLen2);
if (geoDataLen2 == 0) return;
console.log('============== jijuk');
var pnus = {};
for (var i = 0; i < geoDataLen2; i++)
{
pnus[data2.features[i].properties.A1] = data2.features[i].geometry.coordinates[0]; //PNU에 포인트 할당
}
var url = "파일경로";
// shp 파일을 실행하여 데이터를 조회합니다
shp(url).then(function (data)
{
var geoDataLen = data.features.length; // 실행한 shp 파일의 객체 수를 저장합니다
if (geoDataLen == 0) return;
//var light = new THREE.DirectionalLight(0x015AB3);
var light = new THREE.DirectionalLight(0xffffff);
light.position.set(0.75, 0.75, 1.0).normalize();
cmworld.getWorldScene().add(light);
var jijuk_ptlist, code, areaLand, areaBuild;
var areaY; //용적율 면적
var ptlist, dHeight, h, model, dFloor, iFloor;
for (var i = 0; i < geoDataLen; i++)
{
//console.log(i);
try
{
ptlist = data.features[i].geometry.coordinates[0];
ptlist.length = ptlist.length - 1;
for (var j = 0; j < ptlist.length; j++)
{
ptlist[j].x = ptlist[j][0]; ptlist[j].y = ptlist[j][1];
}
jijuk_ptlist = pnus[data.features[i].properties.A1]; //PNU
if (!jijuk_ptlist)
{
continue;
}
for (var j = 0; j < jijuk_ptlist.length; j++)
{
jijuk_ptlist[j].x = jijuk_ptlist[j][0]; jijuk_ptlist[j].y = jijuk_ptlist[j][1];
}
ptlist = sortNorthFirst(ptlist);
jijuk_ptlist = sortNorthFirst(jijuk_ptlist);
code = data.features[i].properties.CODE.trim();
if (!m_BuildingRates[code])
{
continue;
}
h = cmworld.getGroundHeight(ptlist[0].x, ptlist[0].y); //지형 높이
areaLand = data.features[i].properties.LAND_AREA;
areaBuild = data.features[i].properties.BUILD_AREA;
areaY = areaLand * m_BuildingRates[code]; //토지면적 X 용적율 = 가능한 면적
//가능 층수
dFloor = areaY / areaBuild;
iFloor = parseInt(dFloor);
var bBoxBuild = true;
if (code.indexOf('UQA1') == 0) //주거지역은 사선처리
{
if (iFloor > 2) //3층 이하이면 박스로 그림
{
bBoxBuild = false;
// 층수, 토지면적, 건물면적, 용적율, 토지ptlist, 건물 ptlist
// iFloor, areaLand, areaBuild, m_BuildingRates[code], jijuk_ptlist, ptlist
model = makeBuildingMesh2(iFloor, areaLand, areaBuild, m_BuildingRates[code], jijuk_ptlist, ptlist);
if (model)
{
var obj = new CMWORLD.UserObject(name, model, new THREE.Vector3(ptlist[0].x, ptlist[0].y, h));
obj.rotate4GlobeEarth();
var userLayer = getUserLayer();
userLayer.add(obj);
}
}
}
if (bBoxBuild == true) //박스형 건물
{
dHeight = iFloor * 3; //ptlist를 dHeight만큼 그리고, 나머지 옥상 그림
remareaBuild = areaBuild * (dFloor - iFloor); //옥상 면적... ptlist 다시 계산해서 옥상 그리기
if (dHeight < 3) dHeight = 3;
var color = 0x505050;
//건물 그리자.
ptlist = sortSouthFirst(ptlist);
model = makeBuildingMesh(ptlist, dHeight, areaBuild, remareaBuild, color);
//console.log(data.features[i]);
if (model)
{
var obj = new CMWORLD.UserObject(name, model, new THREE.Vector3(ptlist[0].x, ptlist[0].y, h));
obj.rotate4GlobeEarth();
var userLayer = getUserLayer();
userLayer.add(obj);
}
}
} catch(e) {
//console.log("Error Message: " + i.toString() + " " + e.message);
}
}
});
});
}