|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="utf-8" /> |
|
<meta name="viewport" content="width=device-width, initial-scale=1" /> |
|
<title>OpenLayers Vector Tiles</title> |
|
|
|
<!-- CSS/JS for OpenLayers map --> |
|
<link |
|
rel="stylesheet" |
|
href="https://openlayers.org/en/v6.1.1/css/ol.css" |
|
type="text/css" |
|
/> |
|
<script src="https://openlayers.org/en/v6.1.1/build/ol.js"></script> |
|
<script src="https://unpkg.com/ol-layerswitcher@3.7.0"></script> |
|
<script src="https://unpkg.com/ol-popup@4.0.0"></script> |
|
|
|
<link |
|
rel="stylesheet" |
|
href="https://unpkg.com/ol-layerswitcher@3.7.0/src/ol-layerswitcher.css" |
|
/> |
|
<link |
|
rel="stylesheet" |
|
href="https://unpkg.com/ol-popup@4.0.0/src/ol-popup.css" |
|
/> |
|
|
|
<style> |
|
body { |
|
padding: 0; |
|
margin: 0; |
|
} |
|
html, |
|
body, |
|
#map { |
|
height: 100%; |
|
width: 100%; |
|
font-family: "Gill Sans", "Gill Sans MT", Calibri, "Trebuchet MS", |
|
sans-serif; |
|
} |
|
#meta { |
|
background-color: rgba(255, 255, 255, 0.85); |
|
color: #803536; |
|
z-index: 2; |
|
position: absolute; |
|
bottom: 10px; |
|
left: 20px; |
|
padding: 10px 20px; |
|
margin: 0; |
|
} |
|
.ol-popup-content { |
|
min-width: 250px; |
|
} |
|
.my-popup { |
|
color: #803536; |
|
} |
|
.my-popup ul { |
|
padding-left: 0; |
|
} |
|
</style> |
|
</head> |
|
|
|
<body> |
|
<div id="meta"> |
|
<h2>Our cartographic application !</h2> |
|
<ul> |
|
<li><a href="https://localhost:7800"> pg_tileserv server</a></li> |
|
</ul> |
|
</div> |
|
|
|
<div id="map"></div> |
|
|
|
<script> |
|
function getPlainStyle(color) { |
|
return new ol.style.Style({ |
|
stroke: new ol.style.Stroke({ |
|
width: 2, |
|
color: color, |
|
}), |
|
fill: new ol.style.Fill({ |
|
color: color + "33", |
|
}), |
|
}); |
|
} |
|
|
|
function getLayer(name, url, color, olProps) { |
|
return new ol.layer.VectorTile({ |
|
title: name, |
|
source: new ol.source.VectorTile({ |
|
format: new ol.format.MVT(), |
|
url: url, |
|
}), |
|
style: getPlainStyle(color), |
|
...olProps |
|
}); |
|
} |
|
|
|
function generateLists(properties) { |
|
var list = []; |
|
for (prop in properties) { |
|
list.push(`<li><strong>${prop}</strong>: ${properties[prop]}</li>`); |
|
} |
|
return list.join(""); |
|
} |
|
|
|
const vectorServer = "http://localhost:7800/"; |
|
const vectorXYZ = "/{z}/{x}/{y}.pbf"; |
|
|
|
var baseLayer = new ol.layer.Tile({ |
|
title: "osm", |
|
source: new ol.source.XYZ({ |
|
url: "http://osm.oslandia.io/styles/osm-bright/{z}/{x}/{y}.png", |
|
}), |
|
}); |
|
|
|
const dataLayers = [ |
|
{ |
|
name: "Communes", |
|
table: "public.communes", |
|
props: ["ogc_fid", "nom"], |
|
color: "#0a7e80", |
|
ol: { |
|
visible: false |
|
} |
|
}, |
|
{ |
|
name: "Blocks", |
|
table: "public.blocks", |
|
props: [ |
|
"ogc_fid", |
|
"id", |
|
], |
|
color: "#0a7e80", |
|
ol: { |
|
visible: true |
|
} |
|
}, |
|
{ |
|
name: "Parcelles", |
|
table: "public.parcelles", |
|
props: [ |
|
"ogc_fid", |
|
"commune", |
|
"prefixe", |
|
"section", |
|
"numero", |
|
"contenance", |
|
], |
|
color: "#803536", |
|
ol: { |
|
visible: false |
|
} |
|
}, |
|
{ |
|
name: "Batiments", |
|
table: "public.batiments", |
|
props: ["ogc_fid", "commune", "nom", "type"], |
|
color: "#310655", |
|
ol: { |
|
visible: false |
|
} |
|
}, |
|
]; |
|
|
|
var layers = [ |
|
baseLayer, |
|
...dataLayers.map((layer) => { |
|
return getLayer( |
|
layer.name, |
|
vectorServer + |
|
layer.table + |
|
vectorXYZ + |
|
"?properties=" + |
|
layer.props.join(","), |
|
layer.color, |
|
layer.ol |
|
); |
|
}), |
|
|
|
]; |
|
|
|
var map = new ol.Map({ |
|
target: "map", |
|
view: new ol.View({ |
|
center: [260010, 6251497], |
|
extent: [238942,6236363,287345,6260517], |
|
zoom: 17, |
|
}), |
|
layers, |
|
}); |
|
|
|
var layerSwitcher = new ol.control.LayerSwitcher({ |
|
tipLabel: "Legend", // Optional label for button |
|
groupSelectStyle: "children", // Can be 'children' [default], 'group' or 'none' |
|
}); |
|
map.addControl(layerSwitcher); |
|
|
|
var popup = new Popup(); |
|
map.addOverlay(popup); |
|
|
|
map.on("singleclick", function (evt) { |
|
var info_text = ""; |
|
var features = map.getFeaturesAtPixel(evt.pixel); |
|
if (features.length != 0) { |
|
var properties = features[0].getProperties(); |
|
info_text = "<ul>" + generateLists(properties) + "</ul>"; |
|
} |
|
popup.show( |
|
evt.coordinate, |
|
'<div class="my-popup"><h3>Attributes</h3>' + info_text + "</div>" |
|
); |
|
}); |
|
</script> |
|
</body> |
|
</html> |