Openlayers 측정 거리 와 면적 의 실현 방법
15918 단어 Openlayers측량 하 다.
1.지도 측정 기능
일반적인 지도의 측정 기능 은 주로 두 가지 측면 에 나타난다.하 나 는 거 리 를 측정 하 는 것 이 고 하 나 는 면적 을 측정 하 는 것 이다.면적 의 측정 은 마우스 가 그린 범위 에 따라 지리 좌표계 의 전환 을 통 해 실제 면적 의 크기 를 계산 하 는 것 이다.거리의 측정 은 마우스 가 지도 에 그린 점 에 따라 실시 간 으로 두 점 사이 의 실제 거 리 를 계산 하 는 것 이다.다음은 Openlayers 3 에서 이 기능 을 실현 한다.
2.코드 구현
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="../lib/ol/ol.js"></script>
<link href="../css/ol.css" rel="stylesheet" />
<script src="../lib/jquery/jquery-1.8.2.js"></script>
<link href="../css/bootstrap.min.css" rel="stylesheet" />
<script src="../lib/bootstrap/bootstrap.min.js"></script>
<style type="text/css">
#map {
width: 100%;
height: 100%;
position: absolute;
}
#menu {
float: left;
position: absolute;
bottom: 10px;
left: 10px;
z-index: 2000;
}
.checkbox {
left: 20px;
}
/**
*
*/
.tooltip {
position: relative;
background: rgba(0, 0, 0, 0.5);
border-radius: 4px;
color: white;
padding: 4px 8px;
opacity: 0.7;
white-space: nowrap;
}
.tooltip-measure {
opacity: 1;
font-weight: bold;
}
.tooltip-static {
background-color: #ffffff;
color: black;
border: 1px solid white;
}
.tooltip-measure:before,
.tooltip-static:before {
border-top: 6px solid rgba(0, 0, 0, 0.5);
border-right: 6px solid transparent;
border-left: 6px solid transparent;
content: "";
position: absolute;
bottom: -6px;
margin-left: -7px;
left: 50%;
}
.tooltip-static:before {
border-top-color: #ffffff;
}
#scalebar {
float: left;
margin-bottom: 10px;
}
</style>
<script type="text/javascript">
$(function () {
//
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source:new ol.source.OSM()
})
],
view: new ol.View({
center: new ol.proj.fromLonLat([114.4250, 23.0890]),
zoom: 18,
maxZoom: 20
})
});
//
var source = new ol.source.Vector();
//
var vector = new ol.layer.Vector({
source: source,
style: new ol.style.Style({
fill: new ol.style.Fill({
color:'rgba(255,255,255,0.2)'
}),
stroke: new ol.style.Stroke({
color: '#e21e0a',
width:2
}),
image: new ol.style.Circle({
radius: 5,
fill: new ol.style.Fill({
color:'#ffcc33'
})
})
})
});
//
map.addLayer(vector);
//
var scaleLineControl = new ol.control.ScaleLine({
units: 'metric',
target: 'scalebar',
className: 'ol-scale-line'
});
map.addControl(scaleLineControl);
// WGS84
var wgs84Sphere = new ol.Sphere(6378137);
//
var sketch = new ol.Feature();
//
var helpTooltipElement;
//
var helpTooltip;
//
var measureTooltipElement;
//
var measureTooltip;
//
var continuePolygonMsg = 'Click to continue drawing the polygon';
//
var continueLineMsg = 'Click to continue drawing the line';
//
var pointerMoveHandler = function (evt) {
//Indicates if the map is currently being dragged.
//Only set for POINTERDRAG and POINTERMOVE events. Default is false.
//
if (evt.dragging) {
return;
}
//
var helpMsg = 'Click to start drawing';
if (sketch) {
//Get the feature's default geometry.
//A feature may have any number of named geometries.
//
var geom = sketch.getGeometry();
// ,
// ,
if (geom instanceof ol.geom.Polygon) {
helpMsg = continuePolygonMsg;
} else if (geom instanceof ol.geom.LineString) {
helpMsg = continueLineMsg;
}
}
//
helpTooltipElement.innerHTML = helpMsg;
//
//The coordinate in view projection corresponding to the original browser event.
helpTooltip.setPosition(evt.coordinate);
//
$(helpTooltipElement).removeClass('hidden');
};
// pointermove
map.on('pointermove', pointerMoveHandler);
//
$(map.getViewport()).on('mouseout', function () {
$(helpTooltipElement).addClass('hidden');
});
//
var geodesicCheckbox = document.getElementById('geodesic');
//
var typeSelect = document.getElementById('type');
//
var draw;
//
function addInteraction() {
//
var type = typeSelect.value == 'area' ? 'Polygon' : 'LineString';
//
draw = new ol.interaction.Draw({
//
source: source,
//
type: type,
//
style: new ol.style.Style({
fill: new ol.style.Fill({
color:'rgba(255,255,255,0.2)'
}),
stroke: new ol.style.Stroke({
color: 'rgba(0,0,0,0.5)',
lineDash: [10, 10],
width:2
}),
image: new ol.style.Circle({
radius: 5,
stroke: new ol.style.Stroke({
color:'rgba(0,0,0,0.7)'
}),
fill: new ol.style.Fill({
color: 'rgba(255,255,255,0.2)'
})
})
})
});
//
map.addInteraction(draw);
//
createMeasureTooltip();
//
createHelpTooltip();
//
var listener;
//
var count = 0;
//
draw.on('drawstart', function (evt) {
//The feature being drawn.
sketch = evt.feature;
//
var tooltipCoord = evt.coordinate;
// change
//Increases the revision counter and dispatches a 'change' event.
listener = sketch.getGeometry().on('change', function (evt) {
//The event target.
//
var geom = evt.target;
// ,
var output;
if (geom instanceof ol.geom.Polygon) {
map.removeEventListener('singleclick');
map.removeEventListener('dblclick');
//
output = formatArea(geom);
//Return an interior point of the polygon.
//
tooltipCoord = geom.getInteriorPoint().getCoordinates();
} else if (geom instanceof ol.geom.LineString) {
//
output = formatLength(geom);
//Return the last coordinate of the geometry.
//
tooltipCoord = geom.getLastCoordinate();
}
//
measureTooltipElement.innerHTML = output;
//
measureTooltip.setPosition(tooltipCoord);
});
//
map.on('singleclick', function (evt) {
// ,
measureTooltip.setPosition(evt.coordinate);
// ,
if (count == 0) {
measureTooltipElement.innerHTML = " ";
}
//
var point = new ol.geom.Point(evt.coordinate);
//
source.addFeature(new ol.Feature(point));
// ,
measureTooltipElement.className = 'tooltip tooltip-static';
//
createMeasureTooltip();
//
count++;
});
//
map.on('dblclick', function (evt) {
//
var point = new ol.geom.Point(evt.coordinate);
source.addFeature(new ol.Feature(point));
});
}, this);
//
draw.on('drawend', function (evt) {
count = 0;
//
measureTooltipElement.className = 'tooltip tooltip-static';
//Set the offset for this overlay.
//
measureTooltip.setOffset([0, -7]);
//
sketch = null;
//
measureTooltipElement = null;
//
createMeasureTooltip();
//Removes an event listener using the key returned by on() or once().
//
ol.Observable.unByKey(listener);
//
map.removeEventListener('singleclick');
}, this);
}
//
function createHelpTooltip() {
//
if (helpTooltipElement) {
helpTooltipElement.parentNode.removeChild(helpTooltipElement);
}
// div
helpTooltipElement = document.createElement('div');
//
helpTooltipElement.className = 'tooltip hidden';
//
helpTooltip = new ol.Overlay({
element: helpTooltipElement,
offset: [15, 0],
positioning:'center-left'
});
//
map.addOverlay(helpTooltip);
}
//
function createMeasureTooltip() {
// div
measureTooltipElement = document.createElement('div');
measureTooltipElement.setAttribute('id','lengthLabel');
//
measureTooltipElement.className = 'tooltip tooltip-measure';
//
measureTooltip = new ol.Overlay({
element: measureTooltipElement,
offset: [0, -15],
positioning:'bottom-center'
});
//
map.addOverlay(measureTooltip);
}
//
typeSelect.onchange = function () {
//
map.removeInteraction(draw);
//
addInteraction();
};
//
var formatLength = function (line) {
//
var length;
// ,
if (geodesicCheckbox.checked) {
//Return the coordinates of the linestring.
//
var coordinates = line.getCoordinates();
// 0
length = 0;
//
var sourceProj = map.getView().getProjection();
//
for (var i = 0; i < coordinates.length - 1; i++) {
//
var c1 = ol.proj.transform(coordinates[i], sourceProj, 'EPSG:4326');
//
var c2 = ol.proj.transform(coordinates[i + 1], sourceProj, 'EPSG:4326');
//
//Returns the distance from c1 to c2 using the haversine formula.
length += wgs84Sphere.haversineDistance(c1,c2);
}
} else {
//Return the length of the linestring on projected plane.
//
length = Math.round(line.getLength() * 100) / 100;
}
//
var output;
// 1000, km , m
if (length > 1000) {
output = (Math.round(length / 1000 * 100) / 100) + ' ' + 'km'; // KM
} else {
output = (Math.round(length * 100) / 100) + ' ' + 'm'; //m
}
return output;
};
//
var formatArea = function (polygon) {
//
var area;
// ,
if (geodesicCheckbox.checked) {
//
var sourceProj = map.getView().getProjection();
//Make a complete copy of the geometry.
//Transform each coordinate of the geometry from one coordinate reference system to another.
//The geometry is modified in place. For example, a line will be transformed to a line and a circle to a circle.
//If you do not want the geometry modified in place, first clone() it and then use this function on the clone.
//
var geom = polygon.clone().transform(sourceProj, 'EPSG:4326');
//Return the Nth linear ring of the polygon geometry.
//Return null if the given index is out of range.
//The exterior linear ring is available at index 0 and the interior rings at index 1 and beyond.
//
var coordinates = geom.getLinearRing(0).getCoordinates();
//Returns the geodesic area for a list of coordinates.
//
area = Math.abs(wgs84Sphere.geodesicArea(coordinates));
} else {
//
area = polygon.getArea();
}
//
var output;
// 10000 , ,
if (area > 10000) {
output = (Math.round(area/1000000*100)/100) + ' ' + 'km<sup>2</sup>';
} else {
output = (Math.round(area*100)/100) + ' ' + 'm<sup>2</sup>';
}
return output;
};
//
addInteraction();
});
</script>
</head>
<body>
<div id="map">
<div id="menu">
<label> </label>
<select id="type">
<option value="length"> </option>
<option value="area"> </option>
</select>
<label class="checkbox"><input type="checkbox" id="geodesic" /> </label>
</div>
</div>
<div id="scalebar"></div>
</body>
</html>
3.결과 전시거 리 를 재다
면적 을 측량 하 다
이 밖 에 대지 측량 을 사용 한 복선 틀 을 선택 하여 구면 거리 와 면적 을 측정 할 수 있다
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React가 지원되지 않는 UI 라이브러리에서도 구성 요소로 그리기캔버스에서 그림과 도형을 그릴 수 있지만, 캔버스에서 Element을 그릴 수 있는 Overlay 기능이 있습니다. 다만, 오픈라이어스는 리액트를 지원하지 않기 때문에 일반적으로 설치하면 document.create...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.