Im Unterschied zu einem Overlay behält ein Control seine Position auf der Karte bei,
ein Overlay bewegt sich mit der Karte mit.
Ein Control sollten sie also implementieren, wenn sie eine feste Position auf der Karte
einnehmen wollen, wie in diesem Bespiel.
Ein Overlay stellt Daten in Abhängigkeit von der Karte dar,
z.B. die Visualisierung einer BoundingBox, welche von geografischen Koordinaten abhängig ist.
Das entsprechende Beispiel finden Sie in unserem
Beispiel für ein BoundingBox-Overlay
Initializing the map
- registerNodeListener(window, "load", main);
-
- var map;
- var options = {fitToWorld:false};
- var zoomlevel;
- var geocode = new FalkPoint();
- var geocode1 = new FalkPoint();
- var geocode2 = new FalkPoint();
- var bb = new FalkArea(geocode1, geocode2);
- var stageViewerControl;
- var fmo;
- var layerFalkStage;
-
- function main(){
-
-
- map = new FalkMap("mymap");
- map.enableMapFeature(FalkMap.FEATURE_ZOOM_MAP_ON_MOUSE_WHEEL);
- map.enableMapFeature (FalkMap.FEATURE_ANIMATED_ZOOM_ON_MAP);
- map.subscribe(FalkMap.MSG_MAP_CHANGED, handleMapChanged);
- bigMapControl = new FalkBigMapControl("mycontrol");
- map.addMapControl(bigMapControl);
- map.addMapControl(new FalkMapSwitchControl());
-
- geocode = new FalkPoint(parseFloat(YAHOO.util.Dom.get("geoX").value, 10),
- parseFloat(YAHOO.util.Dom.get("geoY").value, 10));
- map.centerMapToGeocode(geocode, parseInt(YAHOO.util.Dom.get("zoomlevel").value, 10));
- stageViewerControl = new YAHOO.Custom.Control.StageViewer()
- map.addMapControl(stageViewerControl);
-
-
- var overlay = map.getMapOverlay();
-
- fmo = new FalkMapObject();
- fmo.setGeocode(geocode);
-
- overlay.addFalkMapObject (fmo);
-
- layerFalkStage = new FalkLayer("FalkStage");
- overlay.addLayer (layerFalkStage);
-
- }
-
- function centerByGeocode() {
- geocode.x = parseFloat(YAHOO.util.Dom.get("geoX").value, 10);
- geocode.y = parseFloat(YAHOO.util.Dom.get("geoY").value, 10);
- zoomlevel = parseInt(YAHOO.util.Dom.get("zoomlevel").value, 10);
- map.centerMapToGeocode(geocode, zoomlevel, options);
- fmo.setGeocode(geocode);
- map.getMapOverlay().update();
- }
-
- function centerByBoundingBox() {
- geocode1.x = parseFloat(YAHOO.util.Dom.get("geoX1").value, 10);
- geocode1.y = parseFloat(YAHOO.util.Dom.get("geoY1").value, 10);
- geocode2.x = parseFloat(YAHOO.util.Dom.get("geoX2").value, 10);
- geocode2.y = parseFloat(YAHOO.util.Dom.get("geoY2").value, 10);
-
- var bb = new FalkArea(geocode1, geocode2 );
- map.centerMapToBoundingBox(bb, options);
- }
-
- function handleMapChanged(){
- var stage = map.getFalkMapStage();
- if(is_null(stage)){
- YDom.get("geocode").innerHTML = "No Stage set."
- return;
- }
- var pNW = map.getGeocodeOfPixelPosition(new FalkPoint(stage.offsetX, stage.offsetY));
- var pSE = map.getGeocodeOfPixelPosition(new FalkPoint(stage.width + stage.offsetX, stage.height + stage.offsetY));
- var NW = {lat: pNW.y.toFixed(6), lon:pNW.x.toFixed(6)};
- var SE = {lat: pSE.y.toFixed(6), lon:pSE.x.toFixed(6)};
- var out = [
- "<p>",
- "Geo NW:<br/>",
- objToString(NW).replace(/>/g, ">"),
- "</p>",
- "<p>",
- "Geo SE:<br/>",
- objToString(SE).replace(/>/g, ">"),
- "</p>"
- ].join("");
- YDom.get("geocode").innerHTML = out;
-
- }
-
- function setMapStage() {
- var offsetX = parseInt(YAHOO.util.Dom.get("offsetX").value, 10);
- var offsetY = parseInt(YAHOO.util.Dom.get("offsetY").value, 10);
- var width = parseInt(YAHOO.util.Dom.get("width").value, 10);
- var height = parseInt(YAHOO.util.Dom.get("height").value, 10);
- var mapStage = new FalkMapStage (width, height, offsetX, offsetY);
- map.setFalkMapStage(mapStage);
- stageViewerControl.displayFalkMapStage(mapStage);
- handleMapChanged();
- }
-
- function resetMapStage() {
- map.setFalkMapStage(null);
- stageViewerControl.displayFalkMapStage(null);
- }
-
-
-
-
- function createInfoContent(point){
- var geo = "";
- if(!is_null(point)){
- geo = ['<span class="geo">',
- '<abbr class="latitude" title="Lat: ',
- normalize(point.y, 6),
- '">',
- getGeoMinSec(point.y, "lat"),
- '</abbr>,<br/>',
- '<abbr class="longitude" title="Lon: ',
- normalize(point.x, 6),
- '">',
- getGeoMinSec(point.x, "lon"),
- '</abbr>',
- '</span>'].join("");
- }
- return geo;
- }
-
-
-
-
-
-
-
- function getGeoMinSec(number, dir){
- var absNumber = Math.abs(number);
- var degree = Math.floor(absNumber);
- var min = Math.floor((absNumber-degree)*60);
- var sec = normalize((((absNumber-degree)*60)-min)*60, 2);
-
- var gms = degree + "° " + min + "' " + sec + "''";
- if(dir === "lat"){
- gms += number < 0 ? "S " : "N ";
- } else if(dir === "lon"){
- gms += number < 0 ? "W " : "E ";
- }
- return gms;
- }
-
-
-
-
-
-
-
- function normalize(number, digits){
- return Math.round( number * Math.pow(10, digits) ) / Math.pow(10, digits);
- }
registerNodeListener(window, "load", main);
// define map gobal
var map;
var options = {fitToWorld:false};
var zoomlevel;
var geocode = new FalkPoint();
var geocode1 = new FalkPoint();
var geocode2 = new FalkPoint();
var bb = new FalkArea(geocode1, geocode2);
var stageViewerControl;
var fmo;
var layerFalkStage;
// html loaded
function main(){
// create a new map
map = new FalkMap("mymap");
map.enableMapFeature(FalkMap.FEATURE_ZOOM_MAP_ON_MOUSE_WHEEL);
map.enableMapFeature (FalkMap.FEATURE_ANIMATED_ZOOM_ON_MAP);
map.subscribe(FalkMap.MSG_MAP_CHANGED, handleMapChanged);
bigMapControl = new FalkBigMapControl("mycontrol");
map.addMapControl(bigMapControl);
map.addMapControl(new FalkMapSwitchControl());
geocode = new FalkPoint(parseFloat(YAHOO.util.Dom.get("geoX").value, 10),
parseFloat(YAHOO.util.Dom.get("geoY").value, 10));
map.centerMapToGeocode(geocode, parseInt(YAHOO.util.Dom.get("zoomlevel").value, 10));
stageViewerControl = new YAHOO.Custom.Control.StageViewer()
map.addMapControl(stageViewerControl);
// get the overlay
var overlay = map.getMapOverlay();
// create a FMO
fmo = new FalkMapObject();
fmo.setGeocode(geocode);
// add the falk map object to the overlay
overlay.addFalkMapObject (fmo);
layerFalkStage = new FalkLayer("FalkStage");
overlay.addLayer (layerFalkStage);
}
function centerByGeocode() {
geocode.x = parseFloat(YAHOO.util.Dom.get("geoX").value, 10);
geocode.y = parseFloat(YAHOO.util.Dom.get("geoY").value, 10);
zoomlevel = parseInt(YAHOO.util.Dom.get("zoomlevel").value, 10);
map.centerMapToGeocode(geocode, zoomlevel, options);
fmo.setGeocode(geocode);
map.getMapOverlay().update();
}
function centerByBoundingBox() {
geocode1.x = parseFloat(YAHOO.util.Dom.get("geoX1").value, 10);
geocode1.y = parseFloat(YAHOO.util.Dom.get("geoY1").value, 10);
geocode2.x = parseFloat(YAHOO.util.Dom.get("geoX2").value, 10);
geocode2.y = parseFloat(YAHOO.util.Dom.get("geoY2").value, 10);
var bb = new FalkArea(geocode1, geocode2 );
map.centerMapToBoundingBox(bb, options);
}
function handleMapChanged(){
var stage = map.getFalkMapStage();
if(is_null(stage)){
YDom.get("geocode").innerHTML = "No Stage set."
return;
}
var pNW = map.getGeocodeOfPixelPosition(new FalkPoint(stage.offsetX, stage.offsetY));
var pSE = map.getGeocodeOfPixelPosition(new FalkPoint(stage.width + stage.offsetX, stage.height + stage.offsetY));
var NW = {lat: pNW.y.toFixed(6), lon:pNW.x.toFixed(6)};
var SE = {lat: pSE.y.toFixed(6), lon:pSE.x.toFixed(6)};
var out = [
"<p>",
"Geo NW:<br/>",
objToString(NW).replace(/>/g, ">"),
"</p>",
"<p>",
"Geo SE:<br/>",
objToString(SE).replace(/>/g, ">"),
"</p>"
].join("");
YDom.get("geocode").innerHTML = out;
}
function setMapStage() {
var offsetX = parseInt(YAHOO.util.Dom.get("offsetX").value, 10);
var offsetY = parseInt(YAHOO.util.Dom.get("offsetY").value, 10);
var width = parseInt(YAHOO.util.Dom.get("width").value, 10);
var height = parseInt(YAHOO.util.Dom.get("height").value, 10);
var mapStage = new FalkMapStage (width, height, offsetX, offsetY);
map.setFalkMapStage(mapStage);
stageViewerControl.displayFalkMapStage(mapStage);
handleMapChanged();
}
function resetMapStage() {
map.setFalkMapStage(null);
stageViewerControl.displayFalkMapStage(null);
}
/**
* format address info to be shown in falk info window
*/
function createInfoContent(point){
var geo = "";
if(!is_null(point)){
geo = ['<span class="geo">',
'<abbr class="latitude" title="Lat: ',
normalize(point.y, 6),
'">',
getGeoMinSec(point.y, "lat"),
'</abbr>,<br/>',
'<abbr class="longitude" title="Lon: ',
normalize(point.x, 6),
'">',
getGeoMinSec(point.x, "lon"),
'</abbr>',
'</span>'].join("");
}
return geo;
}
/**
* formates lat or lon values to degree minutes seconds.
*
* @param {Number} number: lat/lon values are WGS-84 coordinates
* @param {String} dir: one of "lat" or "lon"
*/
function getGeoMinSec(number, dir){
var absNumber = Math.abs(number);
var degree = Math.floor(absNumber);
var min = Math.floor((absNumber-degree)*60);
var sec = normalize((((absNumber-degree)*60)-min)*60, 2);
var gms = degree + "° " + min + "' " + sec + "''";
if(dir === "lat"){
gms += number < 0 ? "S " : "N ";
} else if(dir === "lon"){
gms += number < 0 ? "W " : "E ";
}
return gms;
}
/**
* formats a float value with given digits
*
* param {Number} number: float value
* param {Number} digits: digits, must be an integer value
*/
function normalize(number, digits){
return Math.round( number * Math.pow(10, digits) ) / Math.pow(10, digits);
}
Visual Map Stage Control
Dieses Control dunkelt die Teile der Karte ab, die nicht zur Stage gehören und
dient ausschließlich der Visualisierung.
Ein Control verschiebt sich mit der Karte nicht mit, sondern liegt immer über der Karte.
Das führt unter anderem dazu, die abgedunkelten Teile der Karte nicht auf MouseEvents reagieren.
Bei Benutzung der FalkMapStage
ohne diese Control reagiert natürlich die gesamte Karte auf MouseEvents.
Implementiert man dieses Feature nicht als Control sondern als FalkOverlay
, reagiert die gesamte
Karte auf MouseEvents, ein Beispiel dazu findet sich im Beispiel
FalkMap: BoundingBox Overlay.
Dieses Overlay verdeutlicht aber nicht die Arbeitsweise der FalkMapStage
.
-
-
-
-
-
-
- YAHOO.namespace("Custom.Control");
-
-
-
- YAHOO.Custom.Control.StageViewer = function(name) {
- this.name = name || "StageViewer";
- this.initialStyle = [
- {key: "width", value:"0"},
- {key: "height", value:"0"},
- {key: "position", value:"absolute"},
- {key: "top", value:"0"},
- {key: "left", value:"0"},
- {key: "z-index", value:"100"},
- {key: "background", value:"transparent url('img/examples/milk.png') 0 0 repeat"}
- ];
- this.leftArea = null;
- this.topArea = null;
- this.rightArea = null;
- this.bottomArea = null;
- this.root = null;
- };
-
-
-
-
-
- YAHOO.Custom.Control.StageViewer.prototype.getName = function(){
- return this.name;
- };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- YAHOO.Custom.Control.StageViewer.prototype.init = function (falkMap, rootRenderElement) {
- this.root = rootRenderElement;
-
- var o = document.createElement("DIV");
- this.leftArea = o;
- o.className = "left";
- rootRenderElement.appendChild(o)
- this.setStyle(o, this.initialStyle);
-
- o = document.createElement("DIV");
- this.topArea = o;
- o.className = "top";
- rootRenderElement.appendChild(o)
- this.setStyle(o, this.initialStyle);
-
- o = document.createElement("DIV");
- this.rightArea = o;
- o.className = "right";
- rootRenderElement.appendChild(o)
- this.setStyle(o, this.initialStyle);
-
- o = document.createElement("DIV");
- this.bottomArea = o;
- o.className = "bottom";
- rootRenderElement.appendChild(o)
- this.setStyle(o, this.initialStyle);
-
- var mwh = function(e){
- var ev = YEvent.getEvent(e);
- YEvent.stopPropagation(ev);
- }
- YEvent.addListener(this.leftArea, "mousewheel", mwh);
- YEvent.addListener(this.leftArea, "DOMMouseScroll", mwh);
- YEvent.addListener(this.topArea, "mousewheel", mwh);
- YEvent.addListener(this.topArea, "DOMMouseScroll", mwh);
- YEvent.addListener(this.rightArea, "mousewheel", mwh);
- YEvent.addListener(this.rightArea, "DOMMouseScroll", mwh);
- YEvent.addListener(this.bottomArea, "mousewheel", mwh);
- YEvent.addListener(this.bottomArea, "DOMMouseScroll", mwh);
- };
-
-
-
-
- YAHOO.Custom.Control.StageViewer.prototype.displayFalkMapStage = function(fms){
- if(is_null(fms)){
- this.setStyle(this.topArea, this.initialStyle);
- this.setStyle(this.rightArea, this.initialStyle);
- this.setStyle(this.bottomArea, this.initialStyle);
- this.setStyle(this.leftArea, this.initialStyle);
- return;
- }
-
- YDom.setStyle(this.topArea, "left", fms.offsetX+"px");
- YDom.setStyle(this.topArea, "width", fms.width+"px");
- YDom.setStyle(this.topArea, "height", fms.offsetY+"px");
-
- YDom.setStyle(this.rightArea, "left", (fms.width + fms.offsetX)+"px");
- YDom.setStyle(this.rightArea, "width", (this.root.offsetWidth-(fms.width + fms.offsetX)) + "px");
- YDom.setStyle(this.rightArea, "height", "100%");
-
- YDom.setStyle(this.bottomArea, "left", fms.offsetX+"px");
- YDom.setStyle(this.bottomArea, "top", (fms.height + fms.offsetY)+"px");
- YDom.setStyle(this.bottomArea, "height", (this.root.offsetHeight-(fms.height + fms.offsetY)) + "px");
- YDom.setStyle(this.bottomArea, "width", fms.width+"px");
-
- YDom.setStyle(this.leftArea, "width", fms.offsetX+"px");
- YDom.setStyle(this.leftArea, "height", "100%");
-
- };
-
-
-
- YAHOO.Custom.Control.StageViewer.prototype.setStyle = function(o, style){
- for(var i=0; i<style.length; ++i){
- YDom.setStyle(o, style[i].key, style[i].value);
- }
- };
/**
* This control add a transparent area to the map
* visualizing the borders of given FalkMapStage.
*
* Additionally it's an example how to implement a custom map control.
*/
YAHOO.namespace("Custom.Control");
/**
* Constructor must be implemented
*/
YAHOO.Custom.Control.StageViewer = function(name) {
this.name = name || "StageViewer";
this.initialStyle = [
{key: "width", value:"0"},
{key: "height", value:"0"},
{key: "position", value:"absolute"},
{key: "top", value:"0"},
{key: "left", value:"0"},
{key: "z-index", value:"100"},
{key: "background", value:"transparent url('img/examples/milk.png') 0 0 repeat"}
];
this.leftArea = null;
this.topArea = null;
this.rightArea = null;
this.bottomArea = null;
this.root = null;
};
/**
* Method to get the name of control. This is needed for events.
* Must be implemented.
*/
YAHOO.Custom.Control.StageViewer.prototype.getName = function(){
return this.name;
};
/**
* handleMapChanged is an interface method, implementation is optional,
* if it is implemented, you will get an object representing the current map status
*/
/*
YAHOO.Custom.Control.StageViewer.prototype.handleMapChanged = function(mapParam){
// nothing to do here
};
*/
/**
* Method to initialize custom control and getting access to the map object.
* Must be implemented.
*/
YAHOO.Custom.Control.StageViewer.prototype.init = function (falkMap, rootRenderElement) {
this.root = rootRenderElement;
var o = document.createElement("DIV");
this.leftArea = o;
o.className = "left";
rootRenderElement.appendChild(o)
this.setStyle(o, this.initialStyle);
o = document.createElement("DIV");
this.topArea = o;
o.className = "top";
rootRenderElement.appendChild(o)
this.setStyle(o, this.initialStyle);
o = document.createElement("DIV");
this.rightArea = o;
o.className = "right";
rootRenderElement.appendChild(o)
this.setStyle(o, this.initialStyle);
o = document.createElement("DIV");
this.bottomArea = o;
o.className = "bottom";
rootRenderElement.appendChild(o)
this.setStyle(o, this.initialStyle);
var mwh = function(e){
var ev = YEvent.getEvent(e);
YEvent.stopPropagation(ev);
}
YEvent.addListener(this.leftArea, "mousewheel", mwh);
YEvent.addListener(this.leftArea, "DOMMouseScroll", mwh);
YEvent.addListener(this.topArea, "mousewheel", mwh);
YEvent.addListener(this.topArea, "DOMMouseScroll", mwh);
YEvent.addListener(this.rightArea, "mousewheel", mwh);
YEvent.addListener(this.rightArea, "DOMMouseScroll", mwh);
YEvent.addListener(this.bottomArea, "mousewheel", mwh);
YEvent.addListener(this.bottomArea, "DOMMouseScroll", mwh);
};
/**
* Changes visualiziation of Falk Map Stage
*/
YAHOO.Custom.Control.StageViewer.prototype.displayFalkMapStage = function(fms){
if(is_null(fms)){
this.setStyle(this.topArea, this.initialStyle);
this.setStyle(this.rightArea, this.initialStyle);
this.setStyle(this.bottomArea, this.initialStyle);
this.setStyle(this.leftArea, this.initialStyle);
return;
}
YDom.setStyle(this.topArea, "left", fms.offsetX+"px");
YDom.setStyle(this.topArea, "width", fms.width+"px");
YDom.setStyle(this.topArea, "height", fms.offsetY+"px");
YDom.setStyle(this.rightArea, "left", (fms.width + fms.offsetX)+"px");
YDom.setStyle(this.rightArea, "width", (this.root.offsetWidth-(fms.width + fms.offsetX)) + "px");
YDom.setStyle(this.rightArea, "height", "100%");
YDom.setStyle(this.bottomArea, "left", fms.offsetX+"px");
YDom.setStyle(this.bottomArea, "top", (fms.height + fms.offsetY)+"px");
YDom.setStyle(this.bottomArea, "height", (this.root.offsetHeight-(fms.height + fms.offsetY)) + "px");
YDom.setStyle(this.bottomArea, "width", fms.width+"px");
YDom.setStyle(this.leftArea, "width", fms.offsetX+"px");
YDom.setStyle(this.leftArea, "height", "100%");
};
/**
* Helper methode to set style
*/
YAHOO.Custom.Control.StageViewer.prototype.setStyle = function(o, style){
for(var i=0; i<style.length; ++i){
YDom.setStyle(o, style[i].key, style[i].value);
}
};
CSS
- #mymap {
- width: 820px;
- height: 620px;
- border: 1px solid black;
- }
-
- #parameterForMapStage {
- display: inline
- }
-
- #parameterForGeocode {
- display: inline
- }
-
- #parameterForUpdateBoundingBox {
- display: inline
- }
-
- a.ref {
- font-size: 60%;
- font-weight: normal;
- }
- span.iconText{
- background-color:#FFFFFF !important;
- }
-
- fieldset{float:left;overflow:auto;height:25ex;}
#mymap {
width: 820px;
height: 620px;
border: 1px solid black;
}
#parameterForMapStage {
display: inline
}
#parameterForGeocode {
display: inline
}
#parameterForUpdateBoundingBox {
display: inline
}
a.ref {
font-size: 60%;
font-weight: normal;
}
span.iconText{
background-color:#FFFFFF !important;
}
fieldset{float:left;overflow:auto;height:25ex;}