304 lines
9.7 KiB
HTML
304 lines
9.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" class="dark-mode">
|
|
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<title>Overlay</title>
|
|
|
|
|
|
|
|
<script src="../../3rdparty/highlight/highlight.pack.js"></script>
|
|
|
|
<link rel="stylesheet" href="../../../fonts/material-icon-font/material-icons.css">
|
|
<link rel='stylesheet' href='../../3rdparty/highlight/styles/vs2015.css'>
|
|
<link rel='stylesheet' href='../../../css/doctest.css'>
|
|
|
|
<script src="../../../dist/iwmlib.3rdparty.js"></script>
|
|
<script src="../../../dist/iwmlib.js"></script>
|
|
<script src="../../../dist/iwmlib.pixi.js"></script>
|
|
|
|
<link rel="shortcut icon" type="image/x-icon" href="../../../assets/icons/map.png">
|
|
|
|
|
|
<style>
|
|
.inline-showcase {
|
|
display: flex;
|
|
}
|
|
|
|
.map-example {
|
|
display: inline-block;
|
|
width: 256px;
|
|
margin: 5px;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body onload="Doctest.run()">
|
|
<h1 class="title">Overlay</h1>
|
|
<!-- <a href="../../../" class="Documentation"></a> -->
|
|
<p class="description">
|
|
The overlayclass creates a convenient way to create and design
|
|
complex map overlays.
|
|
</p>
|
|
<canvas id="view" class="center"> </canvas>
|
|
<script>
|
|
let app = new MapApp({
|
|
view,
|
|
width: 512,
|
|
height: 512,
|
|
coordsLogging: true
|
|
})
|
|
var osmworld = '../assets/maps/osm/0/0/0.png'
|
|
let worlOSMData = new MapProjection(new Projection.Mercator())
|
|
|
|
|
|
function setupMap(textures) {
|
|
|
|
// Create the map!
|
|
let map = new ImageMap(
|
|
new PIXI.Sprite(textures.get(osmworld)),
|
|
worlOSMData
|
|
)
|
|
|
|
// Setup the map in the mapapp.
|
|
app.setMap('osm', map)
|
|
app.setup().run()
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
<script class="doctest" data-collapsible data-collapsed data-title="Overlay Data">
|
|
|
|
/**
|
|
* To create an overlay you just need to create a JSON file.
|
|
* The styles defined in the styles are cascading, meaning that
|
|
* the styles can be defined on the top level, or directly at the
|
|
* single items. If the style is not defined in the item, the top-level style will be used.
|
|
* If the top-level style is not defined either, the default style is applied.
|
|
*
|
|
* The structure of an overlay file is as follows:
|
|
*
|
|
* {
|
|
* //COMMENT: Top-Level
|
|
*
|
|
* //COMMENT: Frequently used properties are:
|
|
* size: 500,
|
|
* color: 0xFF00FF,
|
|
* fillAlpha:0.5
|
|
*
|
|
* icon: 'path/to/icon.png'
|
|
* iconColor: 0xFFFFFF,
|
|
* "items": [
|
|
* //COMMENT: Items are defined in the items array.
|
|
* {
|
|
* location: {
|
|
* //COMMENT: Location must be defined.
|
|
* x: LAT_VALUE,
|
|
* y: LNG_VALUE
|
|
* }
|
|
* },{
|
|
* color: 0xFF0000,
|
|
* location: {
|
|
* //COMMENT: Location must be defined.
|
|
* x: LAT_VALUE,
|
|
* y: LNG_VALUE
|
|
* }
|
|
* }
|
|
* ]
|
|
* }
|
|
*/
|
|
|
|
let exampleOverlayJSON = {
|
|
icon: '../../../assets/icons/place.png',
|
|
iconColor: "0x35aaea",
|
|
iconAnchor: { x: 0.5, y: 1 },
|
|
size: 5,
|
|
scale: 0.2,
|
|
disabledColor: 0x000000,
|
|
disabledIconColor: 0xCCCCCC,
|
|
disabledScale: 0.5,
|
|
color: '0x3FA7EE',
|
|
items: [
|
|
{
|
|
name: 'Custom Icon',
|
|
fontWeight: "bold",
|
|
icon: '../../../assets/icons/beenhere.png',
|
|
iconColor: 0x00ff00,
|
|
iconAlpha: 0.5,
|
|
size: 0,
|
|
labelVerticalAlignment: "underneath",
|
|
label: 'Abidjan',
|
|
location: {
|
|
x: 5.34947,
|
|
y: -4.006472
|
|
},
|
|
information:
|
|
'Here a custom icon is used. It overrides the icon setting in the global section.'
|
|
},
|
|
{
|
|
name: 'Berlin',
|
|
label: "enabled",
|
|
disabledLabel: "disabled",
|
|
location: {
|
|
x: 52.52543,
|
|
y: 13.385291
|
|
},
|
|
information:
|
|
'... ist die Bundeshauptstadt der Bundesrepublik Deutschland.',
|
|
enabled: false
|
|
},
|
|
{
|
|
name: 'Canberra',
|
|
|
|
location: {
|
|
x: -35.282025,
|
|
y: 149.128648
|
|
},
|
|
information:
|
|
'... ist die Hauptstadt und achtgrößte Stadt Australiens.'
|
|
},
|
|
{
|
|
name: 'Kapstadt',
|
|
|
|
location: {
|
|
x: -33.925448,
|
|
y: 18.416962
|
|
},
|
|
information:
|
|
`This item adjusts it's size according to the map.`
|
|
},
|
|
{
|
|
name: 'Moskau',
|
|
|
|
location: {
|
|
x: 55.750892,
|
|
y: 37.622799
|
|
},
|
|
information:
|
|
'... die kosmopolitische Hauptstadt Russlands, liegt im Westen des Landes und wird von der Moskwa durchflossen.'
|
|
},
|
|
{
|
|
name: 'Washington, D.C.',
|
|
|
|
location: {
|
|
x: 38.89565,
|
|
y: -77.031407
|
|
},
|
|
information:
|
|
'... ist die Hauptstadt der USA und eine kompakte Stadt am Potomac River, die an die Bundesstaaten Maryland und Virginia grenzt.'
|
|
},
|
|
{
|
|
name: 'Rio de Janeiro',
|
|
|
|
location: {
|
|
x: -22.8714,
|
|
y: -43.28049
|
|
},
|
|
information:
|
|
'... ist eine ausgedehnte brasilianische Küstenmetropole. '
|
|
},
|
|
{
|
|
name: 'Tokio',
|
|
type: "factory",
|
|
label: "factory",
|
|
location: {
|
|
x: 35.696278,
|
|
y: 139.731366
|
|
},
|
|
information:
|
|
'... ist eine Global City in der Kantō-Region im Osten der japanischen Hauptinsel Honshū.'
|
|
}
|
|
]
|
|
}
|
|
</script>
|
|
|
|
<script class="doctest" data-collapsible data-title="Overlay">
|
|
|
|
let overlay = new Overlay(exampleOverlayJSON)
|
|
|
|
/**
|
|
* Textures should be loaded using the app's texture loader.
|
|
* With the findTexture method all required Textures within the
|
|
* overlays are loaded.
|
|
*/
|
|
let overlayTextures = overlay.findAllTextures()
|
|
|
|
let list = [osmworld].concat(overlayTextures)
|
|
app.loadTextures(list, textures => texturesLoaded(textures), {
|
|
resolutionDependent: false
|
|
})
|
|
|
|
function texturesLoaded(textures) {
|
|
|
|
|
|
/** When all textures are loaded .... */
|
|
setupMap(textures)
|
|
|
|
//Retrieve all overlay textures.
|
|
overlay.selectTextures(textures)
|
|
|
|
// Just some Helpers for the Popups.
|
|
let popup = null
|
|
let cleaner = null
|
|
const vanishingTime = 1000
|
|
|
|
// Factories must return a geographics object.
|
|
Overlay.createFactory("factory", (item) => {
|
|
|
|
// This is applied to every item in the overlay that has
|
|
// the type factory'
|
|
|
|
|
|
let geographics = new GeoPoint(item.location)
|
|
|
|
geographics.drawHandler.add((graphics) => {
|
|
graphics.beginFill(item.color, item.fillAlpha)
|
|
graphics.drawRect(0, 0, 10, 10)
|
|
})
|
|
|
|
let text = new PIXI.Text(item.name, {fontSize: 5})
|
|
geographics.graphics.addChild(text)
|
|
|
|
|
|
return geographics
|
|
})
|
|
|
|
/**
|
|
*
|
|
* The actual PIXI elements are created when the overlay.create() is called.
|
|
* This returns an GeoLayer which can be directly put onto the map's Maplayer (or any other GeoLayer).
|
|
*
|
|
* INFO: MapLayer and GeoLayer are specialized container for PIXI. They are meant to
|
|
* place PIXI Elements according to their world-coordinates (lat/lng position), instead
|
|
* of actual pixel values.
|
|
*
|
|
*/
|
|
|
|
let exampleOverlayGeoLayer = overlay.create()
|
|
|
|
// When placed on the mapLayer, the PIXI Graphic elements, that
|
|
// reside inside GeoGraphic Objects are placed automatically at the
|
|
// correct coordinates of the map.
|
|
app.mapLayer.addLayer(exampleOverlayGeoLayer)
|
|
|
|
|
|
// Just a helper function that clears the popups and removes
|
|
// a remaining cleaner timeout.
|
|
function clearPopup() {
|
|
if (popup) {
|
|
popup.parent.removeChild(popup)
|
|
popup = null
|
|
}
|
|
|
|
if (cleaner != null) {
|
|
clearTimeout(cleaner)
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<script>
|
|
</script>
|
|
</body>
|
|
|
|
</html> |