OpenMap.Layer.Factory = { createContentsPoi : function(contents) { contents.baseMapsSpec = OpenMap.Config.baseMapsSpecs[OpenMap.Config.currentBaseMapsSpec]; var layer = new OpenMap.Layer.DynamicServerCC(contents); layer.getXYZ = OpenMap.Config.baseMapsSpecs[OpenMap.Config.currentBaseMapsSpec].getXYZ; // set opacity if (contents.opacity != null) { layer.setOpacity(contents.opacity); } else { layer.setOpacity(0.7); } return layer; }, createContentsChoropleth : function(contents) { contents.baseMapsSpec = OpenMap.Config.baseMapsSpecs[OpenMap.Config.currentBaseMapsSpec]; var layer = new OpenMap.Layer.DynamicServerCC(contents); layer.getXYZ = OpenMap.Config.baseMapsSpecs[OpenMap.Config.currentBaseMapsSpec].getXYZ; layer.setOpacity(0.5); return layer; }, createVector : function(name) { var layer = new OpenLayers.Layer.Vector(name); return layer; }, createFlowPopLayer : function(prop) { var layer = new OpenMap.Layer.FlowPopLayer({layerProperty:prop}); // layer.setMap(map); return layer; }, createBaseLayer : function (name) { // var url = OpenMap.Config.defaultBaseLayerUrl; // var layer = new OpenLayers.Layer.OpenmateXYZ(name, url, { singleTile : false, layername : name, isBaseLayer : true }); // return layer; var layers = []; var basemapSpecName = OpenMap.Config.currentBaseMapsSpec; var options = OpenMap.Config.baseMapsSpecs[basemapSpecName]; var layer = new OpenLayers.Layer.XYZ(name, options.spec.imgUrl, options.spec/*, { singleTile : false, layers : 'basic', isBaseLayer : true }*/); if (!!options.getXYZ) { layer.getXYZ = options.getXYZ; } if (!!options.getURL) { layer.getURL = options.getURL; } // Print if(options.omprint) { layer.omprint = options.omprint; } layers.push(layer); if(options.spec.additionalLayers != null && options.spec.additionalLayers.length > 0) { options.spec.additionalLayers.forEach(function(item, index) { layer = new OpenLayers.Layer.XYZ(item.name, item.url, options.spec/*, { singleTile : false, layers : 'basic', isBaseLayer : true }*/); layer.getXYZ = item.getXYZ != null ? item.getXYZ : options.getXYZ; layer.getURL = item.getURL != null ? item.getUrl : options.getURL; // Print if(options.omprint) { layer.omprint = item.omprint != null ? item.omprint : options.omprint; } layers.push(layer); }); } return layers; }, createKML : function (prop) { var kLayer = new OpenMap.Layer.DynamicVectorClient({//OpenLayers.Layer.Vector(name, { layerProperty : prop, strategies: [new OpenLayers.Strategy.Fixed()], protocol: new OpenLayers.Protocol.HTTP({ url: prop.PROPERTY_JSON.url, format: new OpenLayers.Format.KML({ extractStyles: true, extractAttributes: true, maxDepth: 2 }) }) }); //kLayer.layerProperty = prop; return kLayer; }, createSingelImage : function(name, url) { var layer = new OpenLayers.Layer.OpenmateXYZ(name, url, { singleTile : true, layername : name, isBaseLayer : false }); return layer; }, /* createSingleImage : function (name, url, extent, size, option) { var layer = new OpenLayers.Layer.Image(name, url, extent, size, option); return layer; },*/ create : function(layerId, isServerSide, singleTile) { // if(layerId == "_FLOWPOP_") // { // return this.createFlowPopLayer(); // } // legendInfo //getLayerProperty //http://localhost:8080//OpenMapServer/lc/?q=get&layer=LL_APT_SIMPLE //동기로 가져오셈. layerProperty = this.getLayerProperty(layerId); if(layerProperty == null) return null; //System layer 처리. if(layerProperty.LAYER_TYPE == "FP") { //유동인구 return this.createFlowPopLayer(layerProperty); } else if(layerProperty.LAYER_TYPE == "KM") { //KML return this.createKML(layerProperty); } //사용자가 지정하지 않았다면 디폴트 "Server Tile 여부"를 적용. //TODO : layerProperty.USER_DESC.isServerSide 를 서버쪽에 구현. if(isServerSide == undefined) isServerSide = (layerProperty.CS_CD == 'S'); //Deinsity 계열은 무조건 Server Tile if(layerProperty.LAYER_TYPE == "DN" || layerProperty.LAYER_TYPE == "HT" ) isServerSide = true; // console.log(layerProperty); //Server Layer if(isServerSide == true) { var options = { layerProperty:layerProperty, singleTile:singleTile }; options.baseMapsSpec = OpenMap.Config.baseMapsSpecs[OpenMap.Config.currentBaseMapsSpec]; var dLayer = new OpenMap.Layer.DynamicServer(options); dLayer.getXYZ = OpenMap.Config.baseMapsSpecs[OpenMap.Config.currentBaseMapsSpec].getXYZ; if(layerProperty.LAYER_TYPE == 'HT' || layerProperty.LAYER_TYPE == 'DN' || layerProperty.LAYER_TYPE == 'CH') dLayer.setOpacity(0.5); return dLayer; // var dLayer = new OpenMap.maps.DynamicLayer(map, '/OpenMapServer/layer', layerInfo.LAYER_ID, 0); // drawLayer.name = layerInfo.LAYER_NM; // drawLayer.layerId = layerInfo.LAYER_ID; // drawLayer.layerType = layerInfo.LAYER_TYPE; // return drawLayer; } /* PT 단순분포도 BB 버블 CL 클러스터 DN 밀도 HT Heat CH Choropleth */ var layer = null; switch(layerProperty.LAYER_TYPE) { case "PT" : { layer = new OpenMap.Layer.DynamicMarkerClient({layerProperty:layerProperty , singleTile:singleTile , projection:"EPSG:4326"}); // layer.hitTest = function(screenXY, inputLonlat) { // //클릭 판단 // if(this.getVisibility() == false){ // return false; // } // inputLonlat.lon = Math.floor(inputLonlat.lon * 10) / 10; // inputLonlat.lat = Math.floor(inputLonlat.lat * 10) / 10; // var result = new Array(); // var halfRes = (this.map.getResolution() * 5)/2; // var pos = 0; // for(var i=0;i 0){ // alert(result); // return result; // } // return null; // }; break; // distLayer.loadMarkers(layerInfo.LAYER_ID); // distLayer.layerId = layerInfo.LAYER_ID; // distLayer.name = layerInfo.LAYER_NM; // distLayer.layerType = layerInfo.LAYER_TYPE; // return distLayer; } case "CL" : { layer = new OpenMap.Layer.DynamicClusterClient({layerProperty:layerProperty, singleTile:singleTile}); break; } case "CH" : { layer = new OpenMap.Layer.DynamicVectorClient({layerProperty:layerProperty, singleTile:singleTile}); break; // var dLayer = new OpenMap.maps.DynamicLayer(map,'/OpenMapServer/layer', layerInfo.LAYER_ID, 0); // var drawLayer = dLayer.drawLayer(); // drawLayer.layerId = layerInfo.LAYER_ID; // drawLayer.name = layerInfo.LAYER_NM; // drawLayer.layerType = layerInfo.LAYER_TYPE; // return drawLayer; } } layer.loadData(); //todo : 비동기로 구현. if(layerProperty.LAYER_TYPE == 'HT' || layerProperty.LAYER_TYPE == 'DN' || layerProperty.LAYER_TYPE == 'CH') layer.setOpacity(0.5); return layer; }, _NEW_LAYER_VALUE_KEYS : [ 'LAYER_ID', 'LAYER_TYPE', 'DATA_SRC_ID', 'LAYER_NM', 'JOIN_AREA_TYPE', 'JOIN_AGGR_TYPE', 'JOIN_COST_COL', 'X_COL_NM', 'Y_COL_NM', 'ID_COL_NM', 'CATEGORY_COL_NM', 'COST_COL_NM', 'NAME_COL_NM', 'POLYGON_COL_NM', 'VISIBLE_MIN_MPP', 'VISIBLE_MAX_MPP', 'TILE_CACHE_MIN_MPP', 'TILE_CACHE_MAX_MPP', ], _NEW_LAYER_ARRAY_KEYS : [ 'MATRIX_JSON', 'COST_JSON', 'CATEGORY_JSON', 'COLOR_RAMP_JSON', 'ETC_COLS_JSON' ], _NEW_LAYER_OBJECT_KEYS : [ 'PROPERTY_JSON', 'USER_DESC' ], _layerToQueryString : function(layer) { var q = {}; for (var key in layer) { if (layer.hasOwnProperty(key)) { var val = layer[key]; if (typeof(val) != 'function') { if (typeof(val) != 'object') { q[key] = val; } else { q[key] = JSON.stringify(val); } } } } return $.param(q); }, newLayerProperty : function(type, dataId, isServerSide) { var layer = {}; var dict = OpenMap.Layer.Factory._NEW_LAYER_VALUE_KEYS; for(var key in dict) { layer[dict[key]] = ''; } dict = OpenMap.Layer.Factory._NEW_LAYER_ARRAY_KEYS; for(var key in dict) { layer[dict[key]] = []; } dict = OpenMap.Layer.Factory._NEW_LAYER_OBJECT_KEYS; for(var key in dict) { layer[dict[key]] = {}; } layer.LAYER_TYPE = type; layer.DATA_SRC_ID = dataId; layer.USER_DESC.isServerSide = isServerSide || false; var lpj = layer.PROPERTY_JSON; if(type == 'DN' || type == 'HT') { lpj.minValue = -9999999999; lpj.maxValue = 9999999999; if(type == 'DN') { lpj.searchRadius = 1000; } else { lpj.circleSize = 5; } } else if(type == 'CL') { lpj.clusterSize = 64; lpj.useCount = true; } layer.VISIBLE_MIN_MPP = 0; layer.VISIBLE_MAX_MPP = 1000000; layer.TILE_CACHE_MIN_MPP = 0; layer.TILE_CACHE_MAX_MPP = 1000000; return layer; }, getLayerProperty: function(layerId) { var layerProperty = null; $.ajax({ url: OpenMap.Config.layerPropertyUrl+layerId, cache: false, type: "GET", timeout:3000, dataType: "json", async:false, success: function(data) { layerProperty = data; }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("Status: " + textStatus + '\n' + "Error: " + errorThrown); } }); return layerProperty; }, alterLayerProperty: function(layer) { var success = false; var layerId = layer.LAYER_ID; var q = OpenMap.Layer.Factory._layerToQueryString(layer); var url = OpenMap.Config.alterLayerPropertyUrl + layerId + '&' + q; $.ajax({ url: url, cache: false, type: "GET", timeout:3000, dataType: "text", async:false, success: function(data) { layerProperty = data; }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("Status: " + textStatus + '\n' + "Error: " + errorThrown); } }); return success; }, createLayerProperty: function(layer) { var layerId = null; var q = OpenMap.Layer.Factory._layerToQueryString(layer); var url = OpenMap.Config.createLayerPropertyUrl + '&' + q; $.ajax({ url: url, cache: false, type: "GET", timeout:3000, dataType: "text", async:false, success: function(data) { layerId = data; }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("Status: " + textStatus + '\n' + "Error: " + errorThrown); } }); return layerId; } }; OpenLayers.Layer.XYZ.prototype.omprint = function(zoom, minX, minY, maxX, maxY) { return { 'type': 'basemap', 'opacity': this.opacity, 'url': this.url[0], 'formatX': 'C%08x', 'formatY': 'R%08x', 'formatZ': 'L%d' }; }; OpenLayers.Layer.Vector.prototype.omprint = function(zoom, minX, minY, maxX, maxY) { var features = []; var bounds = new OpenLayers.Bounds(minX,minY,maxX,maxY); var ret = []; // 레이어 숨김 속성.. if(this.visibility == false) { return []; } // 모든 마커에 대해 for(var i=0; i< this.features.length; i++) { var m = this.features[i]; //console.log(m.layer.name); // 숨겨진 마커는 스킵. /*if(this.disableFeatureIds[m.featureId] == true) continue;*/ if(!m.getVisibility()) continue; // 반경안에 들어오지 않으면 스킵. //if(bounds.containsLonLat(m.lonlat) == false) // continue; var feature = { opacity:this.opacity }; if(this.style != null) { feature['color'] = this.style.strokeColor.replace(/#/ig, '0x'); feature['thick'] = this.style.strokeWidth; } if(m.style != null) { if(m.style.strokeColor != null) { feature['color'] = m.style.strokeColor.replace(/#/ig, '0x'); feature['thick'] = m.style.strokeWidth; } } if(typeof feature.color == 'undefined') { feature['color'] = '0xee9900'; feature['thick'] = 1; feature['fill'] = '0xee9900'; feature['opacity'] = 0.4; } switch(m.geometry.CLASS_NAME) { case "OpenLayers.Geometry.Polygon" : feature['type'] = 'polygon'; if(this.style != null && this.style.fill != undefined) { feature['fillopacity'] = (this.style.fillOpacity < 0.3) ? 0.3 : this.style.fillOpacity; feature['fill'] = this.style.fillColor.replace(/#/ig, '0x'); } if(m.style != null && typeof m.style.fillColor != undefined && m.style.fillOpacity > 0.0) { feature['fillopacity'] = (m.style.fillOpacity < 0.3) ? 0.3 : m.style.fillOpacity; feature['fill'] = m.style.fillColor.replace(/#/ig, '0x'); } feature.points = []; for(var j = 0 ; j < m.geometry.components[0].components.length; j++) { var c = m.geometry.components[0].components[j]; feature.points.push(c.x,c.y); } break; case "OpenLayers.Geometry.LineString": feature['type'] = 'polyline'; feature.points = []; for(var j = 0 ; j < m.geometry.components.length; j++) { var c = m.geometry.components[j]; feature.points.push(c.x,c.y); } break; case "OpenLayers.Geometry.Circle": feature['type'] = 'circle'; if(this.style != null && this.style.fill == true) { feature['opacity'] = this.style.fillOpacity; feature['fill'] = this.style.fillColor.replace(/#/ig, '0x'); } if(m.style != null && typeof m.style.fillColor != undefined) { feature['opacity'] = m.style.fillOpacity; feature['fill'] = m.style.fillColor.replace(/#/ig, '0x'); } feature['radius'] = m.geometry.radius; feature.points = []; feature.points.push(m.geometry.x, m.geometry.y); /* for(var j = 0 ; j < m.geometry.components[0].components.length; j++) { var c = m.geometry.components[0].components[j]; feature.points.push(c.x,c.y); } */ break; case "OpenLayers.Geometry.Point" : if(m.data.angle != null && typeof m.data.angle != undefined) { delete feature.thick; delete feature.fill; feature['type'] = 'direction'; feature['opacity'] = 1; feature['forEachSegment'] = false; feature['arrowPosition'] = m.data.position; feature['arrowFill'] = false; feature['color'] = '0xFF0000'; //feature['arrowLength'] = '2'; //feature['arrowWidth'] = 2; feature.points = m.data.lineData; } else { delete feature.color; delete feature.thick; delete feature.fill; feature['type'] = 'image'; feature['opacity'] = 1; if(this.style != null && typeof this.style.externalGraphic != 'undefined') { if(this.style.externalGraphic.indexOf('http') > -1) { feature['imageUrl'] = this.style.externalGraphic; } else { feature['imageUrl'] = OpenMap.Config.defaultSiteDomain + this.style.externalGraphic; } } if(m.style != null && typeof m.style.externalGraphic != 'undefined') { if(m.style.externalGraphic.indexOf('http') > -1) { feature['imageUrl'] = m.style.externalGraphic; } else { feature['imageUrl'] = OpenMap.Config.defaultSiteDomain + m.style.externalGraphic; } } var x = m.geometry.x; var y = m.geometry.y; feature.points = [x, y]; var text = null; var color = null; var outline = null; var size = null; var align = null; if(m.style != null && typeof m.style.label != 'undefined') { text = m.style.label; } else if(this.style != null && typeof this.style.label != 'undefined') { text = this.style.label; } if(m.style != null && typeof m.style.fontColor != 'undefined') { color = m.style.fontColor.replace(/#/ig, '0x'); } else if(this.style != null && typeof this.style.fontColor != 'undefined') { color = this.style.fontColor.replace(/#/ig, '0x'); } if(m.style != null && typeof m.style.labelOutlineColor != 'undefined') { outline = m.style.labelOutlineColor.replace(/#/ig, '0x'); } else if(this.style != null && typeof this.style.labelOutlineColor != 'undefined') { outline = this.style.labelOutlineColor.replace(/#/ig, '0x'); } if(m.style != null && typeof m.style.fontSize != 'undefined') { size = m.style.fontSize.replace(/px/ig, ''); } else if(this.style != null && typeof this.style.fontSize != 'undefined') { size = this.style.fontSize.replace(/px/ig, ''); } if(m.style != null && typeof m.style.align != 'undefined') { align = m.style.align; } else if(this.style != null && typeof this.style.align != 'undefined') { align = this.style.align; } if (text != null) { var labels = [ { text : text, color : color, outline : outline, size : size, style : 'B', align : align } ]; feature.labels = labels; } } break; } ret.push(feature); } // switch return ret; };