상세 컨텐츠

본문 제목

[OpenLayers] 좌표로 점선면 feature 생성하기

개발이야기

by 꾸데따 2021. 9. 23. 15:33

본문

* openlayers 3.x 버전 이상(5.x) 기준

 

배열 형태의 좌표 목록을 이용해 geometry를 만들고 이 geometry를 이용해 타입별(점,선,면) feature를 만드는 간단한 소스입니다.

   //point
    var aTmpCoords = [x좌표값1, y좌표값1];
    
    var oPointFeature = new ol.Feature({
    	geometry : new ol.geom.Point(aTmpCoords)
    });
    
        
    //polyline
    var aTmpCoords =  [
      [x좌표값1, y좌표값1],
      [x좌표값2, y좌표값2],
      [x좌표값3, y좌표값3]
    ];
    var oMadeLine = new ol.Feature({
		geometry : new ol.geom.LineString(aTmpCoords)
    });
    
    //polygone
    var aTmpCoords =  [[
      [x좌표값1, y좌표값1],
      [x좌표값2, y좌표값2],
      [x좌표값3, y좌표값3],
      [x좌표값4, y좌표값4],
      [x좌표값5, y좌표값5]
    ]];
    
    var oMadePoly = new ol.Feature({
		geometry : new ol.geom.Polygon(aTmpCoords)
    });

 

 

아래는 기능을 확장해 좌표목록과 타입, featureid, 좌표변환 여부를 파라미터로 넘겨 feature를 만들어 리턴하는 함수를 생성하는 예제입니다.

 

상황에 맞게 수정해 사용하시면 도움이 될 듯해 사용중인 코드의 일부를 옮겨봅니다.

 

//feature 생성
oTmpFeature = fnMakeFeatureByPosList("POINT", aPosList, "시설물명.uniqID", false);
//생성된 feature vector레이어에 추가
g_oVectorLayer.result.getSource().addFeature(oTmpFeature);
                            

/**
* @method
* @param {string} p_sGeomType : "point, linestring, linearring, polygon,multilinestring, multipolygon" 중 하나
* @param {array} p_aPosList : [[x좌표1, y좌표1],[x좌표2, y좌표2],[x좌표3, y좌표3]]
* @param {string} p_sfeatureId
* @param {boolean} p_bTrans geometry 좌표변환 실행 영부 
* @returns {ol.Feature} 생성된 feature
* @description  타입과 좌표목록을 파라미터로 받아 feature 생성 후 리턴하는 함수
* @author   ggudedda
* @version   1.0
*/
var fnMakeFeatureByPosList = function(p_sGeomType,p_aPosList,p_sFeatureId, p_bTrans){
	
	var oOlFeature = null,
 	oTmpGeometry = null,
 	aArrPosList = [];
	
	if (typeof p_oPosList == 'string')
		aArrPosList = JSON.parse(p_oPosList);
 	if (typeof p_oPosList != 'object')
 		p_oPosList = JSON.parse(p_oPosList);
 	
 	switch(p_sGeomType.toLowerCase()){
		case "point" :
			oTmpGeometry = fnGetGeometryByPoint(p_oPosList);
			break;
		case "linestring" :
			oTmpGeometry = fnGetGeometryByLineString(p_oPosList);
			break;
		case "linearring" :
			oTmpGeometry = fnGetGeometryByLinearRing(p_oPosList);
			break;
		case "polygon" :
			oTmpGeometry = fnGetGeometryByPolygon(p_oPosList);
			break; 
		case "multilinestring" :
			oTmpGeometry = fnGetGeometryByMultiLineString(p_oPosList);
			break;
		case "multipolygon" :
			oTmpGeometry = fnGetGeometryByMultiPolygon(p_oPosList);
			break;
	}
 	var oClonedGeom = oTmpGeometry.clone();
 	
 	// DB좌표계를 화면좌표계로 변경
 	if(p_bTrans){
 		oClonedGeom.transform(CONFIG.getDataProjection(), CONFIG.getDispProjection());
        //ex. ===> oClonedGeom.transform("EPSG:900913", "EPSG:5181");
 	}
 	
 	debugger;
 	
	var oFeature = new ol.Feature({
		geometry : oClonedGeom
	});

	return oFeature;
}


//포인트
var fnGetGeometryByPoint = function(p_oParam){
	var oPointGeometry = {}
	
	if (p_oParam[0] instanceof Array)
		oPointGeometry = new ol.geom.Point([p_oParam[0][0], p_oParam[0][1]]);
	else
		oPointGeometry = new ol.geom.Point([p_oParam[0].x, p_oParam[0].y]);

	return oPointGeometry;
}

//라인
var fnGetGeometryByLineString = function(p_oParam){
	
	var aPoints = [],
	oLineStringGeometry = {}
	
	for(var i=0; i <p_oParam.length; i++){
		if (p_oParam[i] instanceof Array)
			aPoints.push([p_oParam[i][0], p_oParam[i][1]]); // aPoints.push(new
															// ol.geom.Point([p_oParam[i][0],p_oParam[i][1]]));
		else
			aPoints.push([p_oParam[i].x, p_oParam[i].y]); // aPoints.push(new
															// ol.geom.Point([p_oParam[i].x,p_oParam[i].y]));
	}
	oLineStringGeometry = new ol.geom.LineString(aPoints);
	return oLineStringGeometry;
	
}

//LinearRing
var fnGetGeometryByLinearRing = function(p_oParam) {
	var aPoints = [];
	var oLinearRingGeometry = {};

	for (var i = 0; i < p_oParam.length; i++) {
		if (p_oParam[i] instanceof Array)
			aPoints.push(new ol.geom.Point(p_oParam[i][0], p_oParam[i][1]));
		else
			aPoints.push(new ol.geom.Point(p_oParam[i].x, p_oParam[i].y));
	}
	oLinearRingGeometry = new ol.geom.LinearRing(aPoints);

	return oLinearRingGeometry;
}

//폴리곤
var fnGetGeometryByPolygon = function(p_oParam) {
	var oLinears = [];
	var oPolygonGeometry = {};

	for (var i = 0; i < p_oParam.length; i++) {
		if (p_oParam[i] instanceof Array)
			oLinears.push([p_oParam[i][0], p_oParam[i][1]]);
		else
			oLinears.push([p_oParam[i].x, p_oParam[i].y]);
	}
	oPolygonGeometry = new ol.geom.Polygon([oLinears]);

	return oPolygonGeometry;
}

//멀티라인
var fnGetGeometryByMultiLineString = function(p_oParam) {
	var oMultiLineGeometry = {};
	var aMultiLineGeometry = [];
	for (var i = 0; i < p_oParam.length; i++) {

		var oParamArr = p_oParam[i];
		var aPoints = [], oLinears = null;
		var oLineGeometry = {};

		for (var j = 0; j < oParamArr.length; j++) {
			if (oParamArr[j] instanceof Array)
				aPoints.push(new ol.geom.Point(oParamArr[j][0], oParamArr[j][1]));
			else
				aPoints.push(new ol.geom.Point(oParamArr[j].x, oParamArr[j].y));
		}
		oLinestring = new ol.geom.LineString(aPoints);
		oLineGeometry = oLinestring;
		aMultiLineGeometry.push(oLineGeometry);
	}
	oMultiLineGeometry = new ol.geom.MultiLineString(aMultiLineGeometry);

	return oMultiLineGeometry;
}

//멀티폴리곤
var fnGetGeometryByMultiPolygon = function(p_oParam) {
	var oMultiPolygonGeometry = {};
	var aMultiPolygonGeometry = [];
	for (var i = 0; i < p_oParam.length; i++) {

		var oParamArr = p_oParam[i];
		var aPoints = [], oLinears = null;
		var oPolygonGeometry = {};

		for (var j = 0; j < oParamArr.length; j++) {
			if (oParamArr[j] instanceof Array)
				aPoints.push(new ol.geom.Point(oParamArr[j][0], oParamArr[j][1]));
			else
				aPoints.push(new ol.geom.Point(oParamArr[j].x, oParamArr[j].y));
		}
		oLinears = new ol.geom.LinearRing(aPoints);
		oPolygonGeometry = new ol.geom.Polygon(oLinears);
		aMultiPolygonGeometry.push(oPolygonGeometry);
	}
	oMultiPolygonGeometry = new ol.geom.MultiPolygon(aMultiPolygonGeometry);

	return oMultiPolygonGeometry;
}

관련글 더보기