GIS

 

[GEOSERVER] SLD적용 안될때

[현상]

WAS에 따라 SLD가 적용되기도, 안되기도 함 GetMap Request에 sld_body의 내용을 변경해도 이미 지정한 스타일대로만 그려냄. jetty에서는 되나 tomcat에서는 안됨 layers파라미터를 제거하면 “Unkown layer” 오류 발생함.

[해결방법]

GetMap요청 시 layers 파라미터를 요청에 포함시키지 않도록 함. sld_body 내용 맨 앞부분에 인코딩 추가함

[하소연]

구글링 결과 위와 같은 해결책은 전에도 봤었으나 layers 파라미터를 제거해야된다는 내용과 encondig을 변경해야된다는 내용을 각각 따로 적용함. 게다가 encoding부분은 GeoServer의 스타일편집기에만 추가하고 요청시 동적으로 만들어지는 sld_body는 손을 안댐.

 

OPENLAYERS이용 MAP으로부터 축척 구하기

[용어설명]
  • 축척

    - 보여지는 지도상에서 1유닛(보통m)이 나타내는 거리값

  • Resolution(해상도)

    - 현재축척에서 1픽셀이 표현하는 거리값(이미 설정된 UNIT기준)

  • INCHES_PER_UNIT

    - 각 유닛이 몇 인치로 구성되는 지를 나타내는 값 - OpenLayers.Util CLASS에 있음. OpenLayers.INCHES_PER_UNIT = {
    'inches':1.0,
    'ft':12.0,
    'mi':63360.0,
    'm':39.97,
    'km':39370,
    'dd':4374754,
    'yd':36
    };

  • DOTS_PER_INCHES

    - 1인치에 몇개의 픽셀을 표현할건지를 나타내는 값
    OpenLayers.DOTS_PER_INCHES = 96 (혹은 72)

현재축척 = map.getResolution() * OpenLayers.INCHES_PER_UNIT[map.getUnits()] * OpenLayers.DOTS_PER_INCH

해설 :

To find the scale a resolution represents, you have to know how big a pixel is;

OL doesn’t know that for sure, but makes some reasonable assumptions.

If you look at Util.js, and search for getScaleFromResolution(), you will find that it uses 2 constants, INCHES_PER_UNIT and DOTS_PER_INCH, and the calculation is “resolution * OpenLayers.INCHES_PER_UNIT[units] * OpenLayers.DOTS_PER_INCH”. For degrees this is resolution*4374754*72 (314,982,288), so the maximum scale is 1:442,943,843. In metres, the maximum scale is 156543.0339*39.3701*72 (2,834.6472) or 1:443,744,273.

 

동일레이어에 FEATURE단위 위상(ZINDEX) 부여하기

동일한 레이어상에서도 특정 feature가 가려지는 현상 등을 방지하기 위해 위상을 부여할 필요가 있을 수 있다.
이때 사용가능한 방법이다.

첫째>
vectorLayer 생성시 “rendererOptions: { zIndexing: true } ” 옵션 부여하기

fn_initVectorLayer : function() {
vectorLayer = new OpenLayers.Layer.Vector(“LayerName”, {
rendererOptions: { zIndexing: true }
});

sMap.addLayers([vectorLayer]);

controls = {
point: new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Point),
line: new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Path),
polygon: new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Polygon),
drag: new OpenLayers.Control.DragFeature(vectorLayer),
modify: new OpenLayers.Control.ModifyFeature(vectorLayer)
};

for (var key in controls) {
sMap.addControl(controls[key]);
}
}

두번째>
벡터레이어에 적용할 style에 graphicZIndex부여하기

var style = {
strokeColor: colors[istIdx ? 1],
strokeOpacity: 1,
strokeWidth: roxIdx,
pointRadius: 6,
context: “보여주고 싶은 정보 또는 도움말”,
pointerEvents: “visiblePainted”,
featureType: “fireSpreadLine”,
graphicZIndex: featureIdx
};

var line = [];

var oriPt = new OpenLayers.Geometry.Point(points[0].x, points[0].y);
var chgPt = oriPt.clone().transform(new OpenLayers.Projection(“EPSG:5186”), new OpenLayers.Projection(“EPSG:900913”));
line.push(new OpenLayers.Geometry.Point(chgPt.x, chgPt.y));
var oriPt = new OpenLayers.Geometry.Point(points[1].x, points[1].y);
var chgPt = oriPt.clone().transform(new OpenLayers.Projection(“EPSG:5186”), new OpenLayers.Projection(“EPSG:900913”));
line.push(new OpenLayers.Geometry.Point(chgPt.x, chgPt.y));

return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(line), null, style);

세번째>
원하는 시점(이벤트가 발생하는 시점)에 graphicZIndex부여하기

var style = oFeature.style;
style.fontSize = “20px”;
style.fontFamily = “dotum”;
style.fontWeight = “bold”;