You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
752 lines
42 KiB
HTML
752 lines
42 KiB
HTML
2 weeks ago
|
<!DOCTYPE html>
|
||
|
<html lang="en-US">
|
||
|
<head>
|
||
|
<meta charset="UTF-8">
|
||
|
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||
|
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
|
||
|
<script>
|
||
|
var gaProperty = 'UA-2577926-1';
|
||
|
// Disable tracking if the opt-out cookie exists.
|
||
|
var disableStr = 'ga-disable-' + gaProperty;
|
||
|
if (document.cookie.indexOf(disableStr + '=true') > -1) {
|
||
|
window[disableStr] = true;
|
||
|
}
|
||
|
function gaOptout() {
|
||
|
document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
|
||
|
window[disableStr] = true;
|
||
|
}
|
||
|
function gaOptoutRevoke() {
|
||
|
document.cookie = disableStr + '=false; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
|
||
|
window[disableStr] = false;
|
||
|
}
|
||
|
</script>
|
||
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-2577926-1"></script>
|
||
|
<script>
|
||
|
window.dataLayer = window.dataLayer || [];
|
||
|
function gtag(){dataLayer.push(arguments);}
|
||
|
gtag('js', new Date());
|
||
|
gtag('config', 'UA-2577926-1', { 'anonymize_ip': true });
|
||
|
</script>
|
||
|
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" />
|
||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script>
|
||
|
<script src="https://unpkg.com/lz-string@1.4.4/libs/lz-string.min.js"></script>
|
||
|
<script>
|
||
|
window.addEventListener("load", function() {
|
||
|
window.cookieconsent.initialise({
|
||
|
'palette': {
|
||
|
'popup': {
|
||
|
'background': '#eaf7f7',
|
||
|
'text': '#5c7291'
|
||
|
},
|
||
|
'button': {
|
||
|
'background': '#56cbdb',
|
||
|
'text': '#ffffff'
|
||
|
}
|
||
|
},
|
||
|
'theme': 'edgeless',
|
||
|
'type': 'opt-out',
|
||
|
'onInitialise': function (status) {
|
||
|
if (!this.hasConsented()) {
|
||
|
gaOptout()
|
||
|
}
|
||
|
},
|
||
|
'onStatusChange': function(status, chosenBefore) {
|
||
|
if (!this.hasConsented()) {
|
||
|
gaOptout()
|
||
|
}
|
||
|
},
|
||
|
'onRevokeChoice': function() {
|
||
|
gaOptoutRevoke()
|
||
|
}
|
||
|
})
|
||
|
});
|
||
|
</script>
|
||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" type="text/css">
|
||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" type="text/css">
|
||
|
<link rel="stylesheet" href="./resources/prism/prism-1.20.0.css" type="text/css">
|
||
|
<link rel="stylesheet" href="./css/ol.css" type="text/css">
|
||
|
<link rel="stylesheet" href="./resources/layout.css" type="text/css">
|
||
|
<script src="https://unpkg.com/elm-pep"></script>
|
||
|
<script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,TextDecoder"></script>
|
||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/core-js/3.18.3/minified.js"></script>
|
||
|
|
||
|
|
||
|
<title>Measure using vector styles</title>
|
||
|
</head>
|
||
|
<body>
|
||
|
|
||
|
<header class="navbar navbar-expand-sm navbar-dark mb-3 py-0" role="navigation">
|
||
|
<a class="navbar-brand" href="https://openlayers.org/"><img src="./resources/logo-70x70.png" alt=""> OpenLayers</a>
|
||
|
|
||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#olmenu" aria-controls="olmenu" aria-expanded="false" aria-label="Toggle navigation">
|
||
|
<span class="navbar-toggler-icon"></span>
|
||
|
</button>
|
||
|
|
||
|
<!-- menu items that get hidden below 768px width -->
|
||
|
<nav class="collapse navbar-collapse" id="olmenu">
|
||
|
<ul class="nav navbar-nav ml-auto">
|
||
|
<li class="nav-item dropdown">
|
||
|
<a class="nav-link dropdown-toggle" href="#" id="docdropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Docs</a>
|
||
|
<div class="dropdown-menu dropdown-menu-right mb-3" aria-labelledby="docdropdown">
|
||
|
<a class="dropdown-item" href="../doc/">Docs</a>
|
||
|
<div class="dropdown-divider"></div>
|
||
|
<a class="dropdown-item" href="../doc/quickstart.html"><i class="fa fa-check fa-fw mr-2 fa-lg"></i>Quick Start</a>
|
||
|
<a class="dropdown-item" href="../doc/faq.html"><i class="fa fa-question fa-fw mr-2 fa-lg"></i>FAQ</a>
|
||
|
<a class="dropdown-item" href="../doc/tutorials/"><i class="fa fa-book fa-fw mr-2 fa-lg"></i>Tutorials</a>
|
||
|
<a class="dropdown-item" href="/workshop/"><i class="fa fa-graduation-cap fa-fw mr-2 fa-lg"></i>Workshop</a>
|
||
|
<div class="dropdown-divider"></div>
|
||
|
<a class="dropdown-item" href="https://stackoverflow.com/questions/tagged/openlayers"><i class="fa fa-stack-overflow fa-fw mr-2"></i>Ask a Question</a>
|
||
|
</div>
|
||
|
</li>
|
||
|
<li class="nav-item active"><a class="nav-link" href="../examples/">Examples</a></li>
|
||
|
<li class="nav-item"><a class="nav-link" href="../apidoc/"><i class="fa fa-sitemap mr-1"></i>API</a></li>
|
||
|
<li class="nav-item dropdown">
|
||
|
<a class="nav-link dropdown-toggle" href="#" id="codedropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Code</a>
|
||
|
<div class="dropdown-menu dropdown-menu-right mb-3" aria-labelledby="codedropdown">
|
||
|
<a class="dropdown-item" href="https://github.com/openlayers/openlayers"><i class="fa fa-github fa-fw mr-2 fa-lg"></i>Repository</a>
|
||
|
<a class="dropdown-item" href="/download/"><i class="fa fa-download fa-fw mr-2 fa-lg"></i>Download</a>
|
||
|
</div>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</nav>
|
||
|
</header>
|
||
|
|
||
|
<div class="container-fluid line-numbers">
|
||
|
|
||
|
<div id="latest-check" class="alert alert-warning alert-dismissible" role="alert" style="display:none">
|
||
|
<button id="latest-dismiss" type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||
|
This example uses OpenLayers v<span>6.12.0</span>. The <a id="latest-link" href="#" class="alert-link">latest</a> is v<span id="latest-version"></span>.
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<div class="row-fluid">
|
||
|
<a href="#" id="codepen-button" class="btn btn-link float-right">
|
||
|
<i class="fa fa-codepen fa-lg"></i> Edit
|
||
|
</a>
|
||
|
<div class="span12">
|
||
|
<h4 id="title">Measure using vector styles</h4>
|
||
|
<p class="tags">
|
||
|
<span class="badge-group">
|
||
|
<a
|
||
|
href="./index.html?q=draw" class="badge badge-info">draw</a
|
||
|
><a
|
||
|
class="badge badge-info tag-modal-toggle text-white"
|
||
|
data-toggle="modal"
|
||
|
data-target="#tag-example-list"
|
||
|
data-title="draw"
|
||
|
data-content="
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-features.html">Draw and Modify Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-geodesic.html">Draw and Modify Geodesic Circles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-features.html">Draw Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-shapes.html">Draw Shapes</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-freehand.html">Freehand Drawing</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./line-arrows.html">LineString Arrows</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./measure.html">Measure</a>
|
||
|
<a class="list-group-item list-group-item-action active" href="./measure-style.html">Measure using vector styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-scale-and-rotate.html">Scale and Rotate using Modify Interaction</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./snap.html">Snap Interaction</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./topolis.html">topolis integration</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./tracing.html">Tracing around a polygon</a>"
|
||
|
tabindex="0"
|
||
|
>12</a>
|
||
|
</span>
|
||
|
<span class="badge-group">
|
||
|
<a
|
||
|
href="./index.html?q=edit" class="badge badge-info">edit</a
|
||
|
><a
|
||
|
class="badge badge-info tag-modal-toggle text-white"
|
||
|
data-toggle="modal"
|
||
|
data-target="#tag-example-list"
|
||
|
data-title="edit"
|
||
|
data-content="
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-features.html">Draw and Modify Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-geodesic.html">Draw and Modify Geodesic Circles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-features.html">Draw Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-shapes.html">Draw Shapes</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-esri-edit.html">Editable ArcGIS REST Feature Service</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-freehand.html">Freehand Drawing</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./measure.html">Measure</a>
|
||
|
<a class="list-group-item list-group-item-action active" href="./measure-style.html">Measure using vector styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-features.html">Modify Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-test.html">Modify Features Test</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-scale-and-rotate.html">Scale and Rotate using Modify Interaction</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./snap.html">Snap Interaction</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./topolis.html">topolis integration</a>"
|
||
|
tabindex="0"
|
||
|
>13</a>
|
||
|
</span>
|
||
|
<span class="badge-group">
|
||
|
<a
|
||
|
href="./index.html?q=measure" class="badge badge-info">measure</a
|
||
|
><a
|
||
|
class="badge badge-info tag-modal-toggle text-white"
|
||
|
data-toggle="modal"
|
||
|
data-target="#tag-example-list"
|
||
|
data-title="measure"
|
||
|
data-content="
|
||
|
<a class="list-group-item list-group-item-action" href="./measure.html">Measure</a>
|
||
|
<a class="list-group-item list-group-item-action active" href="./measure-style.html">Measure using vector styles</a>"
|
||
|
tabindex="0"
|
||
|
>2</a>
|
||
|
</span>
|
||
|
<span class="badge-group">
|
||
|
<a
|
||
|
href="./index.html?q=modify" class="badge badge-info">modify</a
|
||
|
><a
|
||
|
class="badge badge-info tag-modal-toggle text-white"
|
||
|
data-toggle="modal"
|
||
|
data-target="#tag-example-list"
|
||
|
data-title="modify"
|
||
|
data-content="
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-features.html">Draw and Modify Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-geodesic.html">Draw and Modify Geodesic Circles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-icon.html">Icon modification</a>
|
||
|
<a class="list-group-item list-group-item-action active" href="./measure-style.html">Measure using vector styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-features.html">Modify Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-test.html">Modify Features Test</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-scale-and-rotate.html">Scale and Rotate using Modify Interaction</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./snap.html">Snap Interaction</a>"
|
||
|
tabindex="0"
|
||
|
>8</a>
|
||
|
</span>
|
||
|
<span class="badge-group">
|
||
|
<a
|
||
|
href="./index.html?q=style" class="badge badge-info">style</a
|
||
|
><a
|
||
|
class="badge badge-info tag-modal-toggle text-white"
|
||
|
data-toggle="modal"
|
||
|
data-target="#tag-example-list"
|
||
|
data-title="style"
|
||
|
data-content="
|
||
|
<a class="list-group-item list-group-item-action" href="./animated-gif.html">Animated GIF</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./cog-stretch.html">Band Contrast Stretch</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./cog-style.html">Change Tile Layer Style</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./polygon-styles.html">Custom Polygon Styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./clusters-dynamic.html">Dynamic clusters</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./earthquake-clusters.html">Earthquake Clusters</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./heatmap-earthquakes.html">Earthquakes Heatmap</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./kml-earthquakes.html">Earthquakes in KML</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./earthquake-custom-symbol.html">Earthquakes with custom symbols</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon-color.html">Icon Colors</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon-negative.html">Icon Pixel Operations</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon-scale.html">Icon Scale</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon.html">Icon Symbolizer</a>
|
||
|
<a class="list-group-item list-group-item-action active" href="./measure-style.html">Measure using vector styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./regularshape.html">Regular Shapes</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./style-renderer.html">Style renderer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./canvas-gradient-pattern.html">Styling feature with CanvasGradient or CanvasPattern</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./kml-timezones.html">Timezones in KML</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./topojson.html">TopoJSON</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./webgl-tile-style.html">WebGL Tile Layer Styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./wind-arrows.html">Wind Arrows</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./zoomslider.html">Zoom Sliders</a>"
|
||
|
tabindex="0"
|
||
|
>22</a>
|
||
|
</span>
|
||
|
<span class="badge-group">
|
||
|
<a
|
||
|
href="./index.html?q=vector" class="badge badge-info">vector</a
|
||
|
><a
|
||
|
class="badge badge-info tag-modal-toggle text-white"
|
||
|
data-toggle="modal"
|
||
|
data-target="#tag-example-list"
|
||
|
data-title="vector"
|
||
|
data-content="
|
||
|
<a class="list-group-item list-group-item-action" href="./mapbox-vector-tiles-advanced.html">Advanced Mapbox Vector Tiles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./animated-gif.html">Animated GIF</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-esri.html">ArcGIS REST Feature Service</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./cluster.html">Clustered Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./feature-animation.html">Custom Animation</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./custom-circle-render.html">Custom Circle Render</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./custom-hit-detection-renderer.html">Custom Hit Detection Render</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./custom-interactions.html">Custom Interactions</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./polygon-styles.html">Custom Polygon Styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./drag-and-drop-image-vector.html">Drag-and-Drop Image Vector</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-features.html">Draw and Modify Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-and-modify-geodesic.html">Draw and Modify Geodesic Circles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-features.html">Draw Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-shapes.html">Draw Shapes</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./clusters-dynamic.html">Dynamic clusters</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./earthquake-clusters.html">Earthquake Clusters</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./heatmap-earthquakes.html">Earthquakes Heatmap</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./kml-earthquakes.html">Earthquakes in KML</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./earthquake-custom-symbol.html">Earthquakes with custom symbols</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-esri-edit.html">Editable ArcGIS REST Feature Service</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./flight-animation.html">Flight Animation</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./fractal.html">Fractal Rendering</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./draw-freehand.html">Freehand Drawing</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./geojson.html">GeoJSON</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./geojson-vt.html">geojson-vt integration</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon-color.html">Icon Colors</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-icon.html">Icon modification</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon-negative.html">Icon Pixel Operations</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon-scale.html">Icon Scale</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./icon.html">Icon Symbolizer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./jsts.html">JSTS Integration</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./line-arrows.html">LineString Arrows</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./mapbox-vector-layer.html">Mapbox Vector Layer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./mapbox-vector-tiles.html">Mapbox Vector Tiles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./mapbox-layer.html">Mapbox-gl Layer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./measure.html">Measure</a>
|
||
|
<a class="list-group-item list-group-item-action active" href="./measure-style.html">Measure using vector styles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-features.html">Modify Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-test.html">Modify Features Test</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./ogc-vector-tiles.html">OGC Vector Tiles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./osm-vector-tiles.html">OSM Vector Tiles</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-osm.html">OSM XML</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./regularshape.html">Regular Shapes</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./modify-scale-and-rotate.html">Scale and Rotate using Modify Interaction</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./select-features.html">Select Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./select-hover-features.html">Select Features by Hover</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./select-multiple-features.html">Select multiple Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./snap.html">Snap Interaction</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./street-labels.html">Street Labels</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./style-renderer.html">Style renderer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./synthetic-lines.html">Synthetic Lines</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./synthetic-points.html">Synthetic Points</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./kml-timezones.html">Timezones in KML</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./topojson.html">TopoJSON</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./topolis.html">topolis integration</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./tracing.html">Tracing around a polygon</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./translate-features.html">Translate Features</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./turf.html">turf.js</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./layer-clipping-vector.html">Vector Clipping Layer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./image-vector-layer.html">Vector Image Layer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-label-decluttering.html">Vector Label Decluttering</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-labels.html">Vector Labels</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-layer.html">Vector Layer</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./hitdetect-vector.html">Vector Layer Hit Detection</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-wfs.html">WFS</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-wfs-getfeature.html">WFS - GetFeature</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./vector-wfs-geographic.html">WFS with geographic coordinates</a>
|
||
|
<a class="list-group-item list-group-item-action" href="./wind-arrows.html">Wind Arrows</a>"
|
||
|
tabindex="0"
|
||
|
>68</a>
|
||
|
</span>
|
||
|
</p>
|
||
|
<div class="modal modal-tag-example" id="tag-example-list" tabindex="-1" role="dialog" aria-labelledby="tag-example-title" aria-hidden="true">
|
||
|
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||
|
<div class="modal-content">
|
||
|
<div class="modal-header">
|
||
|
<h5 class="modal-title" id="tag-example-title"></h5>
|
||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||
|
<span aria-hidden="true">×</span>
|
||
|
</button>
|
||
|
</div>
|
||
|
<div class="modal-body">
|
||
|
<div class="list-group"></div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div id="map" class="map"></div>
|
||
|
<form class="form-inline">
|
||
|
<label for="type">Measurement type </label>
|
||
|
<select id="type">
|
||
|
<option value="LineString">Length (LineString)</option>
|
||
|
<option value="Polygon">Area (Polygon)</option>
|
||
|
</select>
|
||
|
|
||
|
<label for="segments">Show segment lengths: </label>
|
||
|
<input type="checkbox" id="segments" checked />
|
||
|
|
||
|
<label for="clear">Clear previous measure: </label>
|
||
|
<input type="checkbox" id="clear" checked />
|
||
|
</form>
|
||
|
|
||
|
</div>
|
||
|
<form method="POST" id="codepen-form" target="_blank" action="https://codesandbox.io/api/v1/sandboxes/define">
|
||
|
<input id="codesandbox-params" type="hidden" name="parameters">
|
||
|
</form>
|
||
|
</div>
|
||
|
|
||
|
<div class="row-fluid">
|
||
|
<div class="span12">
|
||
|
<p id="shortdesc">Example of measuring lengths and areas using vector styles.</p>
|
||
|
<div id="docs"><p>Using vector styles instead of overlays makes it easy to set up, then modify and clear a measure. Additional information such as the lengths of individual segments or sides can be included as required.</p> <p>The <code>getLength()</code> and <code>getArea()</code> functions calculate spherical lengths and areas for geometries. Lengths are calculated by assuming great circle segments between geometry coordinates. Areas are calculated as if edges of polygons were great circle segments.</p> <p>Note that the <code>geometry.getLength()</code> and <code>geometry.getArea()</code> methods return measures of projected (planar) geometries. These can be very different than on-the-ground measures in certain situations — in northern and southern latitudes using Web Mercator for example. For better results, use the functions in the <code>ol/sphere</code> module.</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div class="row-fluid">
|
||
|
<h5 class="source-heading">main.js</h5>
|
||
|
<pre><code id="example-js-source" class="language-js">import 'ol/ol.css';
|
||
|
import Map from 'ol/Map';
|
||
|
import View from 'ol/View';
|
||
|
import {
|
||
|
Circle as CircleStyle,
|
||
|
Fill,
|
||
|
RegularShape,
|
||
|
Stroke,
|
||
|
Style,
|
||
|
Text,
|
||
|
} from 'ol/style';
|
||
|
import {Draw, Modify} from 'ol/interaction';
|
||
|
import {LineString, Point} from 'ol/geom';
|
||
|
import {OSM, Vector as VectorSource} from 'ol/source';
|
||
|
import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer';
|
||
|
import {getArea, getLength} from 'ol/sphere';
|
||
|
|
||
|
const typeSelect = document.getElementById('type');
|
||
|
const showSegments = document.getElementById('segments');
|
||
|
const clearPrevious = document.getElementById('clear');
|
||
|
|
||
|
const style = new Style({
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(255, 255, 255, 0.2)',
|
||
|
}),
|
||
|
stroke: new Stroke({
|
||
|
color: 'rgba(0, 0, 0, 0.5)',
|
||
|
lineDash: [10, 10],
|
||
|
width: 2,
|
||
|
}),
|
||
|
image: new CircleStyle({
|
||
|
radius: 5,
|
||
|
stroke: new Stroke({
|
||
|
color: 'rgba(0, 0, 0, 0.7)',
|
||
|
}),
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(255, 255, 255, 0.2)',
|
||
|
}),
|
||
|
}),
|
||
|
});
|
||
|
|
||
|
const labelStyle = new Style({
|
||
|
text: new Text({
|
||
|
font: '14px Calibri,sans-serif',
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(255, 255, 255, 1)',
|
||
|
}),
|
||
|
backgroundFill: new Fill({
|
||
|
color: 'rgba(0, 0, 0, 0.7)',
|
||
|
}),
|
||
|
padding: [3, 3, 3, 3],
|
||
|
textBaseline: 'bottom',
|
||
|
offsetY: -15,
|
||
|
}),
|
||
|
image: new RegularShape({
|
||
|
radius: 8,
|
||
|
points: 3,
|
||
|
angle: Math.PI,
|
||
|
displacement: [0, 10],
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(0, 0, 0, 0.7)',
|
||
|
}),
|
||
|
}),
|
||
|
});
|
||
|
|
||
|
const tipStyle = new Style({
|
||
|
text: new Text({
|
||
|
font: '12px Calibri,sans-serif',
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(255, 255, 255, 1)',
|
||
|
}),
|
||
|
backgroundFill: new Fill({
|
||
|
color: 'rgba(0, 0, 0, 0.4)',
|
||
|
}),
|
||
|
padding: [2, 2, 2, 2],
|
||
|
textAlign: 'left',
|
||
|
offsetX: 15,
|
||
|
}),
|
||
|
});
|
||
|
|
||
|
const modifyStyle = new Style({
|
||
|
image: new CircleStyle({
|
||
|
radius: 5,
|
||
|
stroke: new Stroke({
|
||
|
color: 'rgba(0, 0, 0, 0.7)',
|
||
|
}),
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(0, 0, 0, 0.4)',
|
||
|
}),
|
||
|
}),
|
||
|
text: new Text({
|
||
|
text: 'Drag to modify',
|
||
|
font: '12px Calibri,sans-serif',
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(255, 255, 255, 1)',
|
||
|
}),
|
||
|
backgroundFill: new Fill({
|
||
|
color: 'rgba(0, 0, 0, 0.7)',
|
||
|
}),
|
||
|
padding: [2, 2, 2, 2],
|
||
|
textAlign: 'left',
|
||
|
offsetX: 15,
|
||
|
}),
|
||
|
});
|
||
|
|
||
|
const segmentStyle = new Style({
|
||
|
text: new Text({
|
||
|
font: '12px Calibri,sans-serif',
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(255, 255, 255, 1)',
|
||
|
}),
|
||
|
backgroundFill: new Fill({
|
||
|
color: 'rgba(0, 0, 0, 0.4)',
|
||
|
}),
|
||
|
padding: [2, 2, 2, 2],
|
||
|
textBaseline: 'bottom',
|
||
|
offsetY: -12,
|
||
|
}),
|
||
|
image: new RegularShape({
|
||
|
radius: 6,
|
||
|
points: 3,
|
||
|
angle: Math.PI,
|
||
|
displacement: [0, 8],
|
||
|
fill: new Fill({
|
||
|
color: 'rgba(0, 0, 0, 0.4)',
|
||
|
}),
|
||
|
}),
|
||
|
});
|
||
|
|
||
|
const segmentStyles = [segmentStyle];
|
||
|
|
||
|
const formatLength = function (line) {
|
||
|
const length = getLength(line);
|
||
|
let output;
|
||
|
if (length > 100) {
|
||
|
output = Math.round((length / 1000) * 100) / 100 + ' km';
|
||
|
} else {
|
||
|
output = Math.round(length * 100) / 100 + ' m';
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
|
||
|
const formatArea = function (polygon) {
|
||
|
const area = getArea(polygon);
|
||
|
let output;
|
||
|
if (area > 10000) {
|
||
|
output = Math.round((area / 1000000) * 100) / 100 + ' km\xB2';
|
||
|
} else {
|
||
|
output = Math.round(area * 100) / 100 + ' m\xB2';
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
|
||
|
const raster = new TileLayer({
|
||
|
source: new OSM(),
|
||
|
});
|
||
|
|
||
|
const source = new VectorSource();
|
||
|
|
||
|
const modify = new Modify({source: source, style: modifyStyle});
|
||
|
|
||
|
let tipPoint;
|
||
|
|
||
|
function styleFunction(feature, segments, drawType, tip) {
|
||
|
const styles = [style];
|
||
|
const geometry = feature.getGeometry();
|
||
|
const type = geometry.getType();
|
||
|
let point, label, line;
|
||
|
if (!drawType || drawType === type) {
|
||
|
if (type === 'Polygon') {
|
||
|
point = geometry.getInteriorPoint();
|
||
|
label = formatArea(geometry);
|
||
|
line = new LineString(geometry.getCoordinates()[0]);
|
||
|
} else if (type === 'LineString') {
|
||
|
point = new Point(geometry.getLastCoordinate());
|
||
|
label = formatLength(geometry);
|
||
|
line = geometry;
|
||
|
}
|
||
|
}
|
||
|
if (segments && line) {
|
||
|
let count = 0;
|
||
|
line.forEachSegment(function (a, b) {
|
||
|
const segment = new LineString([a, b]);
|
||
|
const label = formatLength(segment);
|
||
|
if (segmentStyles.length - 1 < count) {
|
||
|
segmentStyles.push(segmentStyle.clone());
|
||
|
}
|
||
|
const segmentPoint = new Point(segment.getCoordinateAt(0.5));
|
||
|
segmentStyles[count].setGeometry(segmentPoint);
|
||
|
segmentStyles[count].getText().setText(label);
|
||
|
styles.push(segmentStyles[count]);
|
||
|
count++;
|
||
|
});
|
||
|
}
|
||
|
if (label) {
|
||
|
labelStyle.setGeometry(point);
|
||
|
labelStyle.getText().setText(label);
|
||
|
styles.push(labelStyle);
|
||
|
}
|
||
|
if (
|
||
|
tip &&
|
||
|
type === 'Point' &&
|
||
|
!modify.getOverlay().getSource().getFeatures().length
|
||
|
) {
|
||
|
tipPoint = geometry;
|
||
|
tipStyle.getText().setText(tip);
|
||
|
styles.push(tipStyle);
|
||
|
}
|
||
|
return styles;
|
||
|
}
|
||
|
|
||
|
const vector = new VectorLayer({
|
||
|
source: source,
|
||
|
style: function (feature) {
|
||
|
return styleFunction(feature, showSegments.checked);
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const map = new Map({
|
||
|
layers: [raster, vector],
|
||
|
target: 'map',
|
||
|
view: new View({
|
||
|
center: [-11000000, 4600000],
|
||
|
zoom: 15,
|
||
|
}),
|
||
|
});
|
||
|
|
||
|
map.addInteraction(modify);
|
||
|
|
||
|
let draw; // global so we can remove it later
|
||
|
|
||
|
function addInteraction() {
|
||
|
const drawType = typeSelect.value;
|
||
|
const activeTip =
|
||
|
'Click to continue drawing the ' +
|
||
|
(drawType === 'Polygon' ? 'polygon' : 'line');
|
||
|
const idleTip = 'Click to start measuring';
|
||
|
let tip = idleTip;
|
||
|
draw = new Draw({
|
||
|
source: source,
|
||
|
type: drawType,
|
||
|
style: function (feature) {
|
||
|
return styleFunction(feature, showSegments.checked, drawType, tip);
|
||
|
},
|
||
|
});
|
||
|
draw.on('drawstart', function () {
|
||
|
if (clearPrevious.checked) {
|
||
|
source.clear();
|
||
|
}
|
||
|
modify.setActive(false);
|
||
|
tip = activeTip;
|
||
|
});
|
||
|
draw.on('drawend', function () {
|
||
|
modifyStyle.setGeometry(tipPoint);
|
||
|
modify.setActive(true);
|
||
|
map.once('pointermove', function () {
|
||
|
modifyStyle.setGeometry();
|
||
|
});
|
||
|
tip = idleTip;
|
||
|
});
|
||
|
modify.setActive(true);
|
||
|
map.addInteraction(draw);
|
||
|
}
|
||
|
|
||
|
typeSelect.onchange = function () {
|
||
|
map.removeInteraction(draw);
|
||
|
addInteraction();
|
||
|
};
|
||
|
|
||
|
addInteraction();
|
||
|
|
||
|
showSegments.onchange = function () {
|
||
|
vector.changed();
|
||
|
draw.getOverlay().changed();
|
||
|
};
|
||
|
</code></pre>
|
||
|
</div>
|
||
|
|
||
|
<div class="row-fluid">
|
||
|
<h5 class="source-heading">index.html</h5>
|
||
|
<pre><code id="example-html-source" class="language-markup"><!DOCTYPE html>
|
||
|
<html lang="en">
|
||
|
<head>
|
||
|
<meta charset="UTF-8">
|
||
|
<title>Measure using vector styles</title>
|
||
|
<!-- Pointer events polyfill for old browsers, see https://caniuse.com/#feat=pointer -->
|
||
|
<script src="https://unpkg.com/elm-pep"></script>
|
||
|
<!-- The lines below are only needed for old environments like Internet Explorer and Android 4.x -->
|
||
|
<script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,TextDecoder"></script>
|
||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/core-js/3.18.3/minified.js"></script>
|
||
|
<style>
|
||
|
.map {
|
||
|
width: 100%;
|
||
|
height:400px;
|
||
|
}
|
||
|
</style>
|
||
|
</head>
|
||
|
<body>
|
||
|
<div id="map" class="map"></div>
|
||
|
<form class="form-inline">
|
||
|
<label for="type">Measurement type &nbsp;</label>
|
||
|
<select id="type">
|
||
|
<option value="LineString">Length (LineString)</option>
|
||
|
<option value="Polygon">Area (Polygon)</option>
|
||
|
</select>
|
||
|
&nbsp;&nbsp;&nbsp;&nbsp;
|
||
|
<label for="segments">Show segment lengths:&nbsp;</label>
|
||
|
<input type="checkbox" id="segments" checked />
|
||
|
&nbsp;&nbsp;&nbsp;&nbsp;
|
||
|
<label for="clear">Clear previous measure:&nbsp;</label>
|
||
|
<input type="checkbox" id="clear" checked />
|
||
|
</form>
|
||
|
<script src="main.js"></script>
|
||
|
</body>
|
||
|
</html></code></pre>
|
||
|
</div>
|
||
|
|
||
|
<div class="row-fluid">
|
||
|
<h5 class="source-heading">package.json</h5>
|
||
|
<pre><code id="example-pkg-source" class="language-json">{
|
||
|
"name": "measure-style",
|
||
|
"dependencies": {
|
||
|
"ol": "6.12.0"
|
||
|
},
|
||
|
"devDependencies": {
|
||
|
"parcel": "^2.0.0"
|
||
|
},
|
||
|
"scripts": {
|
||
|
"start": "parcel index.html",
|
||
|
"build": "parcel build --public-url . index.html"
|
||
|
}
|
||
|
}</code></pre>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
|
||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.bundle.min.js"></script>
|
||
|
<script src="./resources/prism/prism-1.20.0.min.js"></script>
|
||
|
<script src="./resources/common.js"></script>
|
||
|
<script src="common.js"></script>
|
||
|
<script src="measure-style.js"></script>
|
||
|
<script>
|
||
|
$('#tag-example-list').on('show.bs.modal', function (event) {
|
||
|
const button = $(event.relatedTarget); // Button that triggered the modal
|
||
|
const title = button.data('title');
|
||
|
const content = button.data('content');
|
||
|
const modal = $(this)
|
||
|
modal.find('.modal-title').text(title);
|
||
|
modal.find('.modal-body').html(content);
|
||
|
});
|
||
|
|
||
|
var packageUrl = 'https://raw.githubusercontent.com/openlayers/openlayers.github.io/build/package.json';
|
||
|
fetch(packageUrl).then(function(response) {
|
||
|
return response.json();
|
||
|
}).then(function(json) {
|
||
|
var latestVersion = json.version;
|
||
|
document.getElementById('latest-version').innerHTML = latestVersion;
|
||
|
var url = window.location.href;
|
||
|
var branchSearch = url.match(/\/([^\/]*)\/examples\//);
|
||
|
var cookieText = 'dismissed=-' + latestVersion + '-';
|
||
|
var dismissed = document.cookie.indexOf(cookieText) != -1;
|
||
|
if (branchSearch && !dismissed && /^v[0-9\.]*$/.test(branchSearch[1]) && '6.12.0' != latestVersion) {
|
||
|
var link = url.replace(branchSearch[0], '/latest/examples/');
|
||
|
fetch(link, {method: 'head'}).then(function(response) {
|
||
|
var a = document.getElementById('latest-link');
|
||
|
a.href = response.status == 200 ? link : '../../latest/examples/';
|
||
|
});
|
||
|
var latestCheck = document.getElementById('latest-check');
|
||
|
latestCheck.style.display = '';
|
||
|
document.getElementById('latest-dismiss').onclick = function() {
|
||
|
latestCheck.style.display = 'none';
|
||
|
document.cookie = cookieText;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
</script>
|
||
|
</body>
|
||
|
</html>
|