Merge branch 'master' into fixed-strategy

This commit is contained in:
friedjoff
2013-04-30 12:44:17 +02:00
330 changed files with 3632 additions and 1924 deletions

View File

@@ -379,7 +379,6 @@ Group: OpenLayers {
File: Popup (no auto-title, OpenLayers/Popup.js) File: Popup (no auto-title, OpenLayers/Popup.js)
File: Anchored (no auto-title, OpenLayers/Popup/Anchored.js) File: Anchored (no auto-title, OpenLayers/Popup/Anchored.js)
File: AnchoredBubble (no auto-title, OpenLayers/Popup/AnchoredBubble.js)
File: Framed (no auto-title, OpenLayers/Popup/Framed.js) File: Framed (no auto-title, OpenLayers/Popup/Framed.js)
File: FramedCloud (no auto-title, OpenLayers/Popup/FramedCloud.js) File: FramedCloud (no auto-title, OpenLayers/Popup/FramedCloud.js)
} # Group: Popup } # Group: Popup

View File

@@ -32,6 +32,13 @@ def build(config_file = None, output_file = None, options = None):
except ImportError: except ImportError:
print "No minimize" print "No minimize"
try:
import uglify_js
uglify_js.check_available()
have_compressor.append("uglify-js")
except Exception, E:
print "No uglify-js (%s)" % E
use_compressor = None use_compressor = None
if options.compressor and options.compressor in have_compressor: if options.compressor and options.compressor in have_compressor:
use_compressor = options.compressor use_compressor = options.compressor
@@ -52,7 +59,7 @@ def build(config_file = None, output_file = None, options = None):
print "Merging libraries." print "Merging libraries."
try: try:
if use_compressor == "closure": if use_compressor == "closure" or use_compressor == 'uglify-js':
sourceFiles = mergejs.getNames(sourceDirectory, configFilename) sourceFiles = mergejs.getNames(sourceDirectory, configFilename)
else: else:
merged = mergejs.run(sourceDirectory, None, configFilename) merged = mergejs.run(sourceDirectory, None, configFilename)
@@ -107,6 +114,14 @@ def build(config_file = None, output_file = None, options = None):
print "\nAbnormal termination due to compilation errors." print "\nAbnormal termination due to compilation errors."
sys.exit("ERROR: Closure Compilation failed! See compilation errors.") sys.exit("ERROR: Closure Compilation failed! See compilation errors.")
print "Closure Compilation has completed successfully." print "Closure Compilation has completed successfully."
elif use_compressor == "uglify-js":
minimized = uglify_js.compile(sourceFiles)
if minimized is None:
print "\nAbnormal termination due to compilation errors."
sys.exit("ERROR: Uglify JS compilation failed! See compilation errors.")
print "Uglify JS compilation has completed successfully."
else: # fallback else: # fallback
minimized = merged minimized = merged

View File

@@ -29,6 +29,7 @@ OpenLayers/Protocol/HTTP.js
OpenLayers/Protocol/WFS.js OpenLayers/Protocol/WFS.js
OpenLayers/Protocol/WFS/v1_0_0.js OpenLayers/Protocol/WFS/v1_0_0.js
OpenLayers/Strategy/Fixed.js OpenLayers/Strategy/Fixed.js
OpenLayers/TileManager.js
[exclude] [exclude]

View File

@@ -379,7 +379,6 @@ Group: OpenLayers {
File: Popup (no auto-title, OpenLayers/Popup.js) File: Popup (no auto-title, OpenLayers/Popup.js)
File: Anchored (no auto-title, OpenLayers/Popup/Anchored.js) File: Anchored (no auto-title, OpenLayers/Popup/Anchored.js)
File: AnchoredBubble (no auto-title, OpenLayers/Popup/AnchoredBubble.js)
File: Framed (no auto-title, OpenLayers/Popup/Framed.js) File: Framed (no auto-title, OpenLayers/Popup/Framed.js)
File: FramedCloud (no auto-title, OpenLayers/Popup/FramedCloud.js) File: FramedCloud (no auto-title, OpenLayers/Popup/FramedCloud.js)
} # Group: Popup } # Group: Popup

View File

@@ -1,35 +1,21 @@
var streets = new OpenLayers.Layer.XYZ( var earth = new OpenLayers.Layer.XYZ(
"MapBox Streets", "Natural Earth",
[ [
"http://a.tiles.mapbox.com/v3/mapbox.mapbox-streets/${z}/${x}/${y}.png", "http://a.tiles.mapbox.com/v3/mapbox.natural-earth-hypso-bathy/${z}/${x}/${y}.png",
"http://b.tiles.mapbox.com/v3/mapbox.mapbox-streets/${z}/${x}/${y}.png", "http://b.tiles.mapbox.com/v3/mapbox.natural-earth-hypso-bathy/${z}/${x}/${y}.png",
"http://c.tiles.mapbox.com/v3/mapbox.mapbox-streets/${z}/${x}/${y}.png", "http://c.tiles.mapbox.com/v3/mapbox.natural-earth-hypso-bathy/${z}/${x}/${y}.png",
"http://d.tiles.mapbox.com/v3/mapbox.mapbox-streets/${z}/${x}/${y}.png" "http://d.tiles.mapbox.com/v3/mapbox.natural-earth-hypso-bathy/${z}/${x}/${y}.png"
], { ], {
attribution: "Tiles &copy; <a href='http://mapbox.com/'>MapBox</a> | " + attribution: "Tiles &copy; <a href='http://mapbox.com/'>MapBox</a>",
"Data &copy; <a href='http://www.openstreetmap.org/'>OpenStreetMap</a> " +
"and contributors, CC-BY-SA",
sphericalMercator: true, sphericalMercator: true,
wrapDateLine: true, wrapDateLine: true,
transitionEffect: "resize", numZoomLevels: 5
buffer: 1,
numZoomLevels: 17
} }
); );
var map = new OpenLayers.Map({ var map = new OpenLayers.Map({
div: "map", div: "map",
layers: [streets], layers: [earth],
controls: [
new OpenLayers.Control.Attribution(),
new OpenLayers.Control.Navigation({
dragPanOptions: {
enableKinetic: true
}
}),
new OpenLayers.Control.Zoom(),
new OpenLayers.Control.Permalink({anchor: true})
],
center: [0, 0], center: [0, 0],
zoom: 1 zoom: 1
}); });

View File

@@ -5,10 +5,10 @@ var map = new OpenLayers.Map({
new OpenLayers.Layer.XYZ( new OpenLayers.Layer.XYZ(
"OpenStreetMap", "OpenStreetMap",
[ [
"http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png", "http://otile1.mqcdn.com/tiles/1.0.0/map/${z}/${x}/${y}.png",
"http://otile2.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png", "http://otile2.mqcdn.com/tiles/1.0.0/map/${z}/${x}/${y}.png",
"http://otile3.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png", "http://otile3.mqcdn.com/tiles/1.0.0/map/${z}/${x}/${y}.png",
"http://otile4.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png" "http://otile4.mqcdn.com/tiles/1.0.0/map/${z}/${x}/${y}.png"
], ],
{ {
attribution: "Data, imagery and map information provided by <a href='http://www.mapquest.com/' target='_blank'>MapQuest</a>, <a href='http://www.openstreetmap.org/' target='_blank'>Open Street Map</a> and contributors, <a href='http://creativecommons.org/licenses/by-sa/2.0/' target='_blank'>CC-BY-SA</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>", attribution: "Data, imagery and map information provided by <a href='http://www.mapquest.com/' target='_blank'>MapQuest</a>, <a href='http://www.openstreetmap.org/' target='_blank'>Open Street Map</a> and contributors, <a href='http://creativecommons.org/licenses/by-sa/2.0/' target='_blank'>CC-BY-SA</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>",
@@ -18,10 +18,10 @@ var map = new OpenLayers.Map({
new OpenLayers.Layer.XYZ( new OpenLayers.Layer.XYZ(
"Imagery", "Imagery",
[ [
"http://oatile1.mqcdn.com/naip/${z}/${x}/${y}.png", "http://otile1.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.png",
"http://oatile2.mqcdn.com/naip/${z}/${x}/${y}.png", "http://otile2.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.png",
"http://oatile3.mqcdn.com/naip/${z}/${x}/${y}.png", "http://otile3.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.png",
"http://oatile4.mqcdn.com/naip/${z}/${x}/${y}.png" "http://otile4.mqcdn.com/tiles/1.0.0/sat/${z}/${x}/${y}.png"
], ],
{ {
attribution: "Tiles Courtesy of <a href='http://open.mapquest.co.uk/' target='_blank'>MapQuest</a>. Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency. <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>", attribution: "Tiles Courtesy of <a href='http://open.mapquest.co.uk/' target='_blank'>MapQuest</a>. Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency. <img src='http://developer.mapquest.com/content/osm/mq_logo.png' border='0'>",

View File

@@ -5,7 +5,15 @@ function init() {
styleMap: new OpenLayers.StyleMap({ styleMap: new OpenLayers.StyleMap({
temporary: OpenLayers.Util.applyDefaults({ temporary: OpenLayers.Util.applyDefaults({
pointRadius: 16 pointRadius: 16
}, OpenLayers.Feature.Vector.style.temporary) }, OpenLayers.Feature.Vector.style.temporary),
'default': OpenLayers.Util.applyDefaults({
pointRadius: 16,
strokeWidth: 3,
}, OpenLayers.Feature.Vector.style['default']),
select: OpenLayers.Util.applyDefaults({
pointRadius: 16,
strokeWidth: 3
}, OpenLayers.Feature.Vector.style.select)
}) })
}); });

View File

@@ -12,14 +12,48 @@ html, body, #map {
#title, #tags, #shortdesc { #title, #tags, #shortdesc {
display: none; display: none;
} }
div.olMapViewport {
-ms-touch-action: none;
}
/* Turn on GPU support where available */
.olTileImage {
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-o-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
perspective: 1000;
}
/* Tile fade animation */
.olLayerGrid .olTileImage { .olLayerGrid .olTileImage {
-webkit-transition: opacity 0.2s linear; -webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear; -moz-transition: opacity 0.2s linear;
-o-transition: opacity 0.2s linear; -o-transition: opacity 0.2s linear;
transition: opacity 0.2s linear; transition: opacity 0.2s linear;
/* workaround for strange border tile squeezing on Android 4.x */
-webkit-transform: scale(1.001);
} }
/* Zoom Box */
.olHandlerBoxZoomBox {
border: 2px solid red;
position: absolute;
background-color: white;
opacity: 0.50;
font-size: 1px;
filter: alpha(opacity=50);
}
.olDrawBox {
cursor: crosshair;
}
div.olControlAttribution { div.olControlAttribution {
position: absolute; position: absolute;
font-size: 10px; font-size: 10px;
@@ -168,4 +202,4 @@ div.layerPanel div.mapButtonItemActive:after {
div.layerPanel div.mapButtonItemInactive, div.layerPanel div.mapButtonItemInactive,
div.layerPanel div.mapButtonItemActive { div.layerPanel div.mapButtonItemActive {
margin-left: 1px; margin-left: 1px;
} }

View File

@@ -46,49 +46,53 @@ var map;
// Geolocate control for the Locate button - the locationupdated handler // Geolocate control for the Locate button - the locationupdated handler
// draws a cross at the location and a circle showing the accuracy radius. // draws a cross at the location and a circle showing the accuracy radius.
zoomPanel.addControls([ var geolocate = new OpenLayers.Control.Geolocate({
new OpenLayers.Control.Geolocate({ type: OpenLayers.Control.TYPE_TOGGLE,
type: OpenLayers.Control.TYPE_TOGGLE, bind: false,
geolocationOptions: { watch: true,
enableHighAccuracy: false, geolocationOptions: {
maximumAge: 0, enableHighAccuracy: false,
timeout: 7000 maximumAge: 0,
timeout: 7000
},
eventListeners: {
activate: function() {
map.addLayer(vector);
}, },
eventListeners: { deactivate: function() {
activate: function() { map.removeLayer(vector);
map.addLayer(vector); vector.removeAllFeatures();
}, },
deactivate: function() { locationupdated: function(e) {
map.removeLayer(vector); vector.removeAllFeatures();
vector.removeAllFeatures(); vector.addFeatures([
}, new OpenLayers.Feature.Vector(e.point, null, {
locationupdated: function(e) { graphicName: 'cross',
vector.removeAllFeatures(); strokeColor: '#f00',
vector.addFeatures([ strokeWidth: 2,
new OpenLayers.Feature.Vector(e.point, null, { fillOpacity: 0,
graphicName: 'cross', pointRadius: 10
}),
new OpenLayers.Feature.Vector(
OpenLayers.Geometry.Polygon.createRegularPolygon(
new OpenLayers.Geometry.Point(e.point.x, e.point.y),
e.position.coords.accuracy / 2, 50, 0
), null, {
fillOpacity: 0.1,
fillColor: '#000',
strokeColor: '#f00', strokeColor: '#f00',
strokeWidth: 2, strokeOpacity: 0.6
fillOpacity: 0, }
pointRadius: 10 )
}), ]);
new OpenLayers.Feature.Vector( map.zoomToExtent(vector.getDataExtent());
OpenLayers.Geometry.Polygon.createRegularPolygon(
new OpenLayers.Geometry.Point(e.point.x, e.point.y),
e.position.coords.accuracy / 2, 50, 0
), null, {
fillOpacity: 0.1,
fillColor: '#000',
strokeColor: '#f00',
strokeOpacity: 0.6
}
)
]);
map.zoomToExtent(vector.getDataExtent());
}
} }
}) }
]); });
zoomPanel.addControls([geolocate]);
// Fallback layer when outside Vienna
var osm = new OpenLayers.Layer.OSM();
// Map with navigation controls optimized for touch devices // Map with navigation controls optimized for touch devices
map = new OpenLayers.Map({ map = new OpenLayers.Map({
@@ -96,23 +100,11 @@ var map;
theme: null, theme: null,
projection: "EPSG:3857", projection: "EPSG:3857",
units: "m", units: "m",
maxExtent: [-20037508.34, -20037508.34, 20037508.34, 20037508.34], maxResolution: 38.21851413574219,
maxResolution: 156543.0339, numZoomLevels: 8,
numZoomLevels: 20,
tileManager: new OpenLayers.TileManager(), tileManager: new OpenLayers.TileManager(),
controls: [ controls: [
new OpenLayers.Control.Navigation({ new OpenLayers.Control.Navigation(),
mouseWheelOptions: {
cumulative: false,
interval: 20
},
dragPanOptions: {
enableKinetic: {
deceleration: 0.02
}
},
zoomBoxEnabled: false
}),
new OpenLayers.Control.Attribution(), new OpenLayers.Control.Attribution(),
zoomPanel, zoomPanel,
layerPanel layerPanel
@@ -122,6 +114,15 @@ var map;
// update anchor for permalinks // update anchor for permalinks
var ctr = map.getCenter(); var ctr = map.getCenter();
window.location.hash = "x="+ctr.lon+"&y="+ctr.lat+"&z="+map.getZoom(); window.location.hash = "x="+ctr.lon+"&y="+ctr.lat+"&z="+map.getZoom();
// switch to OSM when outside Vienna
if (!map.getExtent().intersectsBounds(fmzk.tileFullExtent)) {
if (map.baseLayer !== osm) {
map.addLayer(osm);
map.setBaseLayer(osm);
}
} else if (map.baseLayer === osm) {
map.removeLayer(osm);
}
} }
} }
}); });
@@ -133,6 +134,7 @@ var map;
// Defaults for the WMTS layers // Defaults for the WMTS layers
var defaults = { var defaults = {
zoomOffset: 12,
requestEncoding: "REST", requestEncoding: "REST",
matrixSet: "google3857", matrixSet: "google3857",
attribution: 'Datenquelle: Stadt Wien - <a href="http://data.wien.gv.at">data.wien.gv.at</a>' attribution: 'Datenquelle: Stadt Wien - <a href="http://data.wien.gv.at">data.wien.gv.at</a>'
@@ -160,13 +162,13 @@ var map;
var doc = request.responseText, var doc = request.responseText,
caps = format.read(doc); caps = format.read(doc);
fmzk = format.createLayer(caps, OpenLayers.Util.applyDefaults( fmzk = format.createLayer(caps, OpenLayers.Util.applyDefaults(
{layer:"fmzk", transitionEffect:"resize"}, defaults {layer:"fmzk"}, defaults
)); ));
aerial = format.createLayer(caps, OpenLayers.Util.applyDefaults( aerial = format.createLayer(caps, OpenLayers.Util.applyDefaults(
{layer:"lb", transitionEffect:"resize"}, defaults {layer:"lb"}, defaults
)); ));
labels = format.createLayer(caps, OpenLayers.Util.applyDefaults( labels = format.createLayer(caps, OpenLayers.Util.applyDefaults(
{layer:"beschriftung", isBaseLayer: false}, {layer:"beschriftung", isBaseLayer: false, transitionEffect: 'map-resize'},
defaults defaults
)); ));
map.addLayers([fmzk, aerial, labels]); map.addLayers([fmzk, aerial, labels]);
@@ -182,25 +184,41 @@ var map;
var extent = new OpenLayers.Bounds(1799448.394855, 6124949.74777, 1848250.442089, 6162571.828177); var extent = new OpenLayers.Bounds(1799448.394855, 6124949.74777, 1848250.442089, 6162571.828177);
defaults.tileFullExtent = extent; defaults.tileFullExtent = extent;
fmzk = new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults({ fmzk = new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults({
url: "http://maps.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg", url: [
"http://maps.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps1.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps2.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps3.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps4.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg"
],
layer: "fmzk", layer: "fmzk",
style: "pastell", style: "pastell"
transitionEffect: "resize"
}, },
defaults)); defaults));
aerial = new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults({ aerial = new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults({
url: "http://maps.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg", url: [
"http://maps.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps1.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps2.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps3.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg",
"http://maps4.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg"
],
layer: "lb", layer: "lb",
style: "farbe", style: "farbe"
transitionEffect: "resize"
}, },
defaults)); defaults));
labels = new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults({ labels = new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults({
url: "http://maps.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png", url: [
"http://maps.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png",
"http://maps1.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png",
"http://maps2.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png",
"http://maps3.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png",
"http://maps4.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png"
],
layer: "beschriftung", layer: "beschriftung",
style: "normal", style: "normal",
transitionEffect: null, isBaseLayer: false,
isBaseLayer: false transitionEffect: 'map-resize'
}, },
defaults)); defaults));
map.addLayers([fmzk, aerial, labels]); map.addLayers([fmzk, aerial, labels]);

View File

@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>Switch between polar projections</title>
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="http://svn.osgeo.org/metacrs/proj4js/trunk/lib/proj4js-compressed.js"></script>
<script type="text/javascript" src="http://spatialreference.org/ref/epsg/3574/proj4js/"></script>
<script type="text/javascript" src="http://spatialreference.org/ref/epsg/3576/proj4js/"></script>
<script type="text/javascript" src="http://spatialreference.org/ref/epsg/3571/proj4js/"></script>
<script type="text/javascript" src="http://spatialreference.org/ref/epsg/3573/proj4js/"></script>
<script type="text/javascript" src="../lib/OpenLayers.js"></script>
<script type="text/javascript" src="polar-projections.js"></script>
</head>
<body onload="init()">
<h1 id="title">Polar Projections WMS Example</h1>
<div id="tags">
switch projections polar
</div>
<div id="shortdesc">Switch between different projections</div>
<div id="map" class="smallmap" style="height:512px"></div>
<button id='epsg3574'>EPSG:3574</button>
<button id='epsg3576'>EPSG:3576</button>
<button id='epsg3571'>EPSG:3571</button>
<button id='epsg3573'>EPSG:3573</button>
<div id="docs">
<p>This example shows how to switch between different projections,
maintaining the center and resolution.</p>
<p>Click the buttons above to try it, and see
<a href='polar-projections.js'>polar-projections.js</a> for the
source code.</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,84 @@
var map, layer, overlay;
var projectionOptions = {
'EPSG:3574': {
projection: new OpenLayers.Projection('EPSG:3574'),
units: 'm',
maxExtent: new OpenLayers.Bounds(-5505054, -5505054, 5505054, 5505054),
maxResolution: 5505054 / 128,
numZoomLevels: 18
},
'EPSG:3576': {
projection: new OpenLayers.Projection('EPSG:3576'),
units: 'm',
maxExtent: new OpenLayers.Bounds(-5505054, -5505054, 5505054, 5505054),
maxResolution: 5505054 / 128,
numZoomLevels: 18
},
'EPSG:3571': {
projection: new OpenLayers.Projection('EPSG:3571'),
units: 'm',
maxExtent: new OpenLayers.Bounds(-5505054, -5505054, 5505054, 5505054),
maxResolution: 5505054 / 128,
numZoomLevels: 18
},
'EPSG:3573': {
projection: new OpenLayers.Projection('EPSG:3573'),
units: 'm',
maxExtent: new OpenLayers.Bounds(-5505054, -5505054, 5505054, 5505054),
maxResolution: 5505054 / 128,
numZoomLevels: 18
}
};
function setProjection() {
projCode = this.innerHTML;
var oldExtent = map.getExtent();
var oldCenter = map.getCenter();
var oldProjection = map.getProjectionObject();
// map projection is controlled by the base layer
map.baseLayer.addOptions(projectionOptions[projCode]);
// with the base layer updated, the map has the new projection now
var newProjection = map.getProjectionObject();
// transform the center of the old projection, not the extent
map.setCenter(
oldCenter.transform(oldProjection, newProjection,
map.getZoomForExtent(oldExtent.transform(oldProjection, newProjection))
));
for (var i=map.layers.length-1; i>=0; --i) {
// update grid settings
map.layers[i].addOptions(projectionOptions[projCode]);
// redraw layer - just in case center and zoom are the same in old and
// new projection
map.layers[i].redraw();
}
}
function init() {
map = new OpenLayers.Map('map');
layer = new OpenLayers.Layer.WMS(
'world',
'http://v2.suite.opengeo.org/geoserver/wms',
{layers: 'world', version: '1.1.1'},
projectionOptions['EPSG:3574']
);
overlay = new OpenLayers.Layer.WMS(
'world',
'http://v2.suite.opengeo.org/geoserver/wms',
{transparent: 'true', layers: 'world:borders', styles: 'line'},
projectionOptions['EPSG:3574']
);
overlay.isBaseLayer = false;
map.addLayers([layer, overlay]);
map.zoomToMaxExtent();
// add behaviour to dom elements
document.getElementById('epsg3574').onclick = setProjection;
document.getElementById('epsg3576').onclick = setProjection;
document.getElementById('epsg3571').onclick = setProjection;
document.getElementById('epsg3573').onclick = setProjection;
}

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -144,8 +144,6 @@
"OpenLayers/Console.js", "OpenLayers/Console.js",
"OpenLayers/Tween.js", "OpenLayers/Tween.js",
"OpenLayers/Kinetic.js", "OpenLayers/Kinetic.js",
"Rico/Corner.js",
"Rico/Color.js",
"OpenLayers/Events.js", "OpenLayers/Events.js",
"OpenLayers/Events/buttonclick.js", "OpenLayers/Events/buttonclick.js",
"OpenLayers/Request.js", "OpenLayers/Request.js",
@@ -191,7 +189,6 @@
"OpenLayers/Layer/Zoomify.js", "OpenLayers/Layer/Zoomify.js",
"OpenLayers/Layer/ArcGISCache.js", "OpenLayers/Layer/ArcGISCache.js",
"OpenLayers/Popup/Anchored.js", "OpenLayers/Popup/Anchored.js",
"OpenLayers/Popup/AnchoredBubble.js",
"OpenLayers/Popup/Framed.js", "OpenLayers/Popup/Framed.js",
"OpenLayers/Popup/FramedCloud.js", "OpenLayers/Popup/FramedCloud.js",
"OpenLayers/Feature.js", "OpenLayers/Feature.js",

View File

@@ -1,9 +1,9 @@
/** /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. * full text of the license. */
*
/**
* @requires OpenLayers/SingleFile.js * @requires OpenLayers/SingleFile.js
* @requires OpenLayers/Util/vendorPrefix.js * @requires OpenLayers/Util/vendorPrefix.js
*/ */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -127,7 +127,9 @@ OpenLayers.String = {
if (i == 0) { if (i == 0) {
replacement = context; replacement = context;
} }
if (replacement === undefined) {
break;
}
replacement = replacement[subs[i]]; replacement = replacement[subs[i]];
} }
@@ -295,7 +297,25 @@ OpenLayers.Number = {
str = integer + dsep + rem; str = integer + dsep + rem;
} }
return str; return str;
} },
/**
* Method: zeroPad
* Create a zero padded string optionally with a radix for casting numbers.
*
* Parameters:
* num - {Number} The number to be zero padded.
* len - {Number} The length of the string to be returned.
* radix - {Number} An integer between 2 and 36 specifying the base to use
* for representing numeric values.
*/
zeroPad: function(num, len, radix) {
var str = num.toString(radix || 10);
while (str.length < len) {
str = "0" + str;
}
return str;
}
}; };
/** /**

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -63,7 +63,7 @@ OpenLayers.Bounds = OpenLayers.Class({
* left - {Number} The left bounds of the box. Note that for width * left - {Number} The left bounds of the box. Note that for width
* calculations, this is assumed to be less than the right value. * calculations, this is assumed to be less than the right value.
* bottom - {Number} The bottom bounds of the box. Note that for height * bottom - {Number} The bottom bounds of the box. Note that for height
* calculations, this is assumed to be more than the top value. * calculations, this is assumed to be less than the top value.
* right - {Number} The right bounds. * right - {Number} The right bounds.
* top - {Number} The top bounds. * top - {Number} The top bounds.
* *
@@ -355,39 +355,59 @@ OpenLayers.Bounds = OpenLayers.Class({
* object. * object.
*/ */
extend:function(object) { extend:function(object) {
var bounds = null;
if (object) { if (object) {
// clear cached center location
switch(object.CLASS_NAME) { switch(object.CLASS_NAME) {
case "OpenLayers.LonLat": case "OpenLayers.LonLat":
bounds = new OpenLayers.Bounds(object.lon, object.lat, this.extendXY(object.lon, object.lat);
object.lon, object.lat);
break; break;
case "OpenLayers.Geometry.Point": case "OpenLayers.Geometry.Point":
bounds = new OpenLayers.Bounds(object.x, object.y, this.extendXY(object.x, object.y);
object.x, object.y);
break; break;
case "OpenLayers.Bounds": case "OpenLayers.Bounds":
bounds = object; // clear cached center location
this.centerLonLat = null;
if ( (this.left == null) || (object.left < this.left)) {
this.left = object.left;
}
if ( (this.bottom == null) || (object.bottom < this.bottom) ) {
this.bottom = object.bottom;
}
if ( (this.right == null) || (object.right > this.right) ) {
this.right = object.right;
}
if ( (this.top == null) || (object.top > this.top) ) {
this.top = object.top;
}
break; break;
} }
}
if (bounds) { },
this.centerLonLat = null;
if ( (this.left == null) || (bounds.left < this.left)) { /**
this.left = bounds.left; * APIMethod: extendXY
} * Extend the bounds to include the XY coordinate specified.
if ( (this.bottom == null) || (bounds.bottom < this.bottom) ) { *
this.bottom = bounds.bottom; * Parameters:
} * x - {number} The X part of the the coordinate.
if ( (this.right == null) || (bounds.right > this.right) ) { * y - {number} The Y part of the the coordinate.
this.right = bounds.right; */
} extendXY:function(x, y) {
if ( (this.top == null) || (bounds.top > this.top) ) { // clear cached center location
this.top = bounds.top; this.centerLonLat = null;
}
} if ((this.left == null) || (x < this.left)) {
this.left = x;
}
if ((this.bottom == null) || (y < this.bottom)) {
this.bottom = y;
}
if ((this.right == null) || (x > this.right)) {
this.right = x;
}
if ((this.top == null) || (y > this.top)) {
this.top = y;
} }
}, },

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -49,13 +49,6 @@ OpenLayers.Date = {
return date.toISOString(); return date.toISOString();
}; };
} else { } else {
function pad(num, len) {
var str = num + "";
while (str.length < len) {
str = "0" + str;
}
return str;
}
return function(date) { return function(date) {
var str; var str;
if (isNaN(date.getTime())) { if (isNaN(date.getTime())) {
@@ -65,12 +58,12 @@ OpenLayers.Date = {
} else { } else {
str = str =
date.getUTCFullYear() + "-" + date.getUTCFullYear() + "-" +
pad(date.getUTCMonth() + 1, 2) + "-" + OpenLayers.Number.zeroPad(date.getUTCMonth() + 1, 2) + "-" +
pad(date.getUTCDate(), 2) + "T" + OpenLayers.Number.zeroPad(date.getUTCDate(), 2) + "T" +
pad(date.getUTCHours(), 2) + ":" + OpenLayers.Number.zeroPad(date.getUTCHours(), 2) + ":" +
pad(date.getUTCMinutes(), 2) + ":" + OpenLayers.Number.zeroPad(date.getUTCMinutes(), 2) + ":" +
pad(date.getUTCSeconds(), 2) + "." + OpenLayers.Number.zeroPad(date.getUTCSeconds(), 2) + "." +
pad(date.getUTCMilliseconds(), 3) + "Z"; OpenLayers.Number.zeroPad(date.getUTCMilliseconds(), 3) + "Z";
} }
return str; return str;
}; };

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -56,11 +56,11 @@ OpenLayers.Control.DragPan = OpenLayers.Class(OpenLayers.Control, {
* {Boolean} Set this option to enable "kinetic dragging". Can be * {Boolean} Set this option to enable "kinetic dragging". Can be
* set to true or to an object. If set to an object this * set to true or to an object. If set to an object this
* object will be passed to the {<OpenLayers.Kinetic>} * object will be passed to the {<OpenLayers.Kinetic>}
* constructor. Defaults to false. * constructor. Defaults to true.
* If you set this property, you should ensure that * To get kinetic dragging, ensure that OpenLayers/Kinetic.js is
* OpenLayers/Kinetic.js is included in your build config * included in your build config.
*/ */
enableKinetic: false, enableKinetic: true,
/** /**
* APIProperty: kineticInterval * APIProperty: kineticInterval
@@ -77,7 +77,7 @@ OpenLayers.Control.DragPan = OpenLayers.Class(OpenLayers.Control, {
* <panMapDone> as callbacks. * <panMapDone> as callbacks.
*/ */
draw: function() { draw: function() {
if(this.enableKinetic) { if (this.enableKinetic && OpenLayers.Kinetic) {
var config = {interval: this.kineticInterval}; var config = {interval: this.kineticInterval};
if(typeof this.enableKinetic === "object") { if(typeof this.enableKinetic === "object") {
config = OpenLayers.Util.extend(config, this.enableKinetic); config = OpenLayers.Util.extend(config, this.enableKinetic);

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -45,8 +45,15 @@ OpenLayers.Control.Geolocate = OpenLayers.Class(OpenLayers.Control, {
/** /**
* Property: geolocation * Property: geolocation
* {Object} The geolocation engine, as a property to be possibly mocked. * {Object} The geolocation engine, as a property to be possibly mocked.
* This is set lazily to avoid a memory leak in IE9.
*/ */
geolocation: navigator.geolocation, geolocation: null,
/**
* Property: available
* {Boolean} The navigator.geolocation object is available.
*/
available: ('geolocation' in navigator),
/** /**
* APIProperty: bind * APIProperty: bind
@@ -90,6 +97,10 @@ OpenLayers.Control.Geolocate = OpenLayers.Class(OpenLayers.Control, {
* {Boolean} The control was effectively activated. * {Boolean} The control was effectively activated.
*/ */
activate: function () { activate: function () {
if (this.available && !this.geolocation) {
// set lazily to avoid IE9 memory leak
this.geolocation = navigator.geolocation;
}
if (!this.geolocation) { if (!this.geolocation) {
this.events.triggerEvent("locationuncapable"); this.events.triggerEvent("locationuncapable");
return false; return false;

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,49 +1,30 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
/** /**
* @requires OpenLayers/Control.js * @requires OpenLayers/Control.js
* @requires OpenLayers/Lang.js * @requires OpenLayers/Lang.js
* @requires OpenLayers/Console.js * @requires OpenLayers/Util.js
* @requires OpenLayers/Events/buttonclick.js * @requires OpenLayers/Events/buttonclick.js
*/ */
/** /**
* Class: OpenLayers.Control.LayerSwitcher * Class: OpenLayers.Control.LayerSwitcher
* The LayerSwitcher control displays a table of contents for the map. This * The LayerSwitcher control displays a table of contents for the map. This
* allows the user interface to switch between BaseLasyers and to show or hide * allows the user interface to switch between BaseLasyers and to show or hide
* Overlays. By default the switcher is shown minimized on the right edge of * Overlays. By default the switcher is shown minimized on the right edge of
* the map, the user may expand it by clicking on the handle. * the map, the user may expand it by clicking on the handle.
* *
* To create the LayerSwitcher outside of the map, pass the Id of a html div * To create the LayerSwitcher outside of the map, pass the Id of a html div
* as the first argument to the constructor. * as the first argument to the constructor.
* *
* Inherits from: * Inherits from:
* - <OpenLayers.Control> * - <OpenLayers.Control>
*/ */
OpenLayers.Control.LayerSwitcher = OpenLayers.Control.LayerSwitcher = OpenLayers.Class(OpenLayers.Control, {
OpenLayers.Class(OpenLayers.Control, {
/**
* APIProperty: roundedCorner
* {Boolean} If true the Rico library is used for rounding the corners
* of the layer switcher div, defaults to false. *Deprecated*. Use
* CSS3's border-radius instead. If this option is set to true the
* Rico/Corner.js script must be loaded in the page, and therefore
* listed in the build profile.
*
*/
roundedCorner: false,
/**
* APIProperty: roundedCornerColor
* {String} The color of the rounded corners, only applies if roundedCorner
* is true, defaults to "darkblue".
*/
roundedCornerColor: "darkblue",
/** /**
* Property: layerStates * Property: layerStates
* {Array(Object)} Basically a copy of the "state" of the map's layers * {Array(Object)} Basically a copy of the "state" of the map's layers
@@ -51,90 +32,85 @@ OpenLayers.Control.LayerSwitcher =
* unnecessarily redrawing the control. * unnecessarily redrawing the control.
*/ */
layerStates: null, layerStates: null,
// DOM Elements // DOM Elements
/** /**
* Property: layersDiv * Property: layersDiv
* {DOMElement} * {DOMElement}
*/ */
layersDiv: null, layersDiv: null,
/** /**
* Property: baseLayersDiv * Property: baseLayersDiv
* {DOMElement} * {DOMElement}
*/ */
baseLayersDiv: null, baseLayersDiv: null,
/** /**
* Property: baseLayers * Property: baseLayers
* {Array(Object)} * {Array(Object)}
*/ */
baseLayers: null, baseLayers: null,
/** /**
* Property: dataLbl * Property: dataLbl
* {DOMElement} * {DOMElement}
*/ */
dataLbl: null, dataLbl: null,
/** /**
* Property: dataLayersDiv * Property: dataLayersDiv
* {DOMElement} * {DOMElement}
*/ */
dataLayersDiv: null, dataLayersDiv: null,
/** /**
* Property: dataLayers * Property: dataLayers
* {Array(Object)} * {Array(Object)}
*/ */
dataLayers: null, dataLayers: null,
/** /**
* Property: minimizeDiv * Property: minimizeDiv
* {DOMElement} * {DOMElement}
*/ */
minimizeDiv: null, minimizeDiv: null,
/** /**
* Property: maximizeDiv * Property: maximizeDiv
* {DOMElement} * {DOMElement}
*/ */
maximizeDiv: null, maximizeDiv: null,
/** /**
* APIProperty: ascending * APIProperty: ascending
* {Boolean} * {Boolean}
*/ */
ascending: true, ascending: true,
/** /**
* Constructor: OpenLayers.Control.LayerSwitcher * Constructor: OpenLayers.Control.LayerSwitcher
* *
* Parameters: * Parameters:
* options - {Object} * options - {Object}
*/ */
initialize: function(options) { initialize: function(options) {
OpenLayers.Control.prototype.initialize.apply(this, arguments); OpenLayers.Control.prototype.initialize.apply(this, arguments);
this.layerStates = []; this.layerStates = [];
if(this.roundedCorner) {
OpenLayers.Console.warn('roundedCorner option is deprecated');
}
}, },
/** /**
* APIMethod: destroy * APIMethod: destroy
*/ */
destroy: function() { destroy: function() {
//clear out layers info and unregister their events //clear out layers info and unregister their events
this.clearLayersArray("base"); this.clearLayersArray("base");
this.clearLayersArray("data"); this.clearLayersArray("data");
this.map.events.un({ this.map.events.un({
buttonclick: this.onButtonClick, buttonclick: this.onButtonClick,
addlayer: this.redraw, addlayer: this.redraw,
@@ -144,15 +120,15 @@ OpenLayers.Control.LayerSwitcher =
scope: this scope: this
}); });
this.events.unregister("buttonclick", this, this.onButtonClick); this.events.unregister("buttonclick", this, this.onButtonClick);
OpenLayers.Control.prototype.destroy.apply(this, arguments); OpenLayers.Control.prototype.destroy.apply(this, arguments);
}, },
/** /**
* Method: setMap * Method: setMap
* *
* Properties: * Properties:
* map - {<OpenLayers.Map>} * map - {<OpenLayers.Map>}
*/ */
setMap: function(map) { setMap: function(map) {
OpenLayers.Control.prototype.setMap.apply(this, arguments); OpenLayers.Control.prototype.setMap.apply(this, arguments);
@@ -176,9 +152,9 @@ OpenLayers.Control.LayerSwitcher =
* Method: draw * Method: draw
* *
* Returns: * Returns:
* {DOMElement} A reference to the DIV DOMElement containing the * {DOMElement} A reference to the DIV DOMElement containing the
* switcher tabs. * switcher tabs.
*/ */
draw: function() { draw: function() {
OpenLayers.Control.prototype.draw.apply(this); OpenLayers.Control.prototype.draw.apply(this);
@@ -191,7 +167,7 @@ OpenLayers.Control.LayerSwitcher =
} }
// populate div with current info // populate div with current info
this.redraw(); this.redraw();
return this.div; return this.div;
}, },
@@ -224,13 +200,13 @@ OpenLayers.Control.LayerSwitcher =
} }
}, },
/** /**
* Method: clearLayersArray * Method: clearLayersArray
* User specifies either "base" or "data". we then clear all the * User specifies either "base" or "data". we then clear all the
* corresponding listeners, the div, and reinitialize a new array. * corresponding listeners, the div, and reinitialize a new array.
* *
* Parameters: * Parameters:
* layersType - {String} * layersType - {String}
*/ */
clearLayersArray: function(layersType) { clearLayersArray: function(layersType) {
this[layersType + "LayersDiv"].innerHTML = ""; this[layersType + "LayersDiv"].innerHTML = "";
@@ -241,54 +217,53 @@ OpenLayers.Control.LayerSwitcher =
/** /**
* Method: checkRedraw * Method: checkRedraw
* Checks if the layer state has changed since the last redraw() call. * Checks if the layer state has changed since the last redraw() call.
* *
* Returns: * Returns:
* {Boolean} The layer state changed since the last redraw() call. * {Boolean} The layer state changed since the last redraw() call.
*/ */
checkRedraw: function() { checkRedraw: function() {
var redraw = false;
if ( !this.layerStates.length || if ( !this.layerStates.length ||
(this.map.layers.length != this.layerStates.length) ) { (this.map.layers.length != this.layerStates.length) ) {
redraw = true; return true;
} else { }
for (var i=0, len=this.layerStates.length; i<len; i++) {
var layerState = this.layerStates[i]; for (var i = 0, len = this.layerStates.length; i < len; i++) {
var layer = this.map.layers[i]; var layerState = this.layerStates[i];
if ( (layerState.name != layer.name) || var layer = this.map.layers[i];
(layerState.inRange != layer.inRange) || if ( (layerState.name != layer.name) ||
(layerState.id != layer.id) || (layerState.inRange != layer.inRange) ||
(layerState.visibility != layer.visibility) ) { (layerState.id != layer.id) ||
redraw = true; (layerState.visibility != layer.visibility) ) {
break; return true;
}
} }
} }
return redraw;
return false;
}, },
/** /**
* Method: redraw * Method: redraw
* Goes through and takes the current state of the Map and rebuilds the * Goes through and takes the current state of the Map and rebuilds the
* control to display that state. Groups base layers into a * control to display that state. Groups base layers into a
* radio-button group and lists each data layer with a checkbox. * radio-button group and lists each data layer with a checkbox.
* *
* Returns: * Returns:
* {DOMElement} A reference to the DIV DOMElement containing the control * {DOMElement} A reference to the DIV DOMElement containing the control
*/ */
redraw: function() { redraw: function() {
//if the state hasn't changed since last redraw, no need //if the state hasn't changed since last redraw, no need
// to do anything. Just return the existing div. // to do anything. Just return the existing div.
if (!this.checkRedraw()) { if (!this.checkRedraw()) {
return this.div; return this.div;
} }
//clear out previous layers //clear out previous layers
this.clearLayersArray("base"); this.clearLayersArray("base");
this.clearLayersArray("data"); this.clearLayersArray("data");
var containsOverlays = false; var containsOverlays = false;
var containsBaseLayers = false; var containsBaseLayers = false;
// Save state -- for checking layer if the map state changed. // Save state -- for checking layer if the map state changed.
// We save this before redrawing, because in the process of redrawing // We save this before redrawing, because in the process of redrawing
// we will trigger more visibility changes, and we want to not redraw // we will trigger more visibility changes, and we want to not redraw
@@ -298,12 +273,12 @@ OpenLayers.Control.LayerSwitcher =
for (var i=0; i <len; i++) { for (var i=0; i <len; i++) {
var layer = this.map.layers[i]; var layer = this.map.layers[i];
this.layerStates[i] = { this.layerStates[i] = {
'name': layer.name, 'name': layer.name,
'visibility': layer.visibility, 'visibility': layer.visibility,
'inRange': layer.inRange, 'inRange': layer.inRange,
'id': layer.id 'id': layer.id
}; };
} }
var layers = this.map.layers.slice(); var layers = this.map.layers.slice();
if (!this.ascending) { layers.reverse(); } if (!this.ascending) { layers.reverse(); }
@@ -317,16 +292,22 @@ OpenLayers.Control.LayerSwitcher =
containsBaseLayers = true; containsBaseLayers = true;
} else { } else {
containsOverlays = true; containsOverlays = true;
} }
// only check a baselayer if it is *the* baselayer, check data // only check a baselayer if it is *the* baselayer, check data
// layers if they are visible // layers if they are visible
var checked = (baseLayer) ? (layer == this.map.baseLayer) var checked = (baseLayer) ? (layer == this.map.baseLayer)
: layer.getVisibility(); : layer.getVisibility();
// create input element // create input element
var inputElem = document.createElement("input"); var inputElem = document.createElement("input"),
inputElem.id = this.id + "_input_" + layer.name; // The input shall have an id attribute so we can use
// labels to interact with them.
inputId = OpenLayers.Util.createUniqueID(
this.id + "_input_"
);
inputElem.id = inputId;
inputElem.name = (baseLayer) ? this.id + "_baseLayers" : layer.name; inputElem.name = (baseLayer) ? this.id + "_baseLayers" : layer.name;
inputElem.type = (baseLayer) ? "radio" : "checkbox"; inputElem.type = (baseLayer) ? "radio" : "checkbox";
inputElem.value = layer.name; inputElem.value = layer.name;
@@ -339,9 +320,11 @@ OpenLayers.Control.LayerSwitcher =
if (!baseLayer && !layer.inRange) { if (!baseLayer && !layer.inRange) {
inputElem.disabled = true; inputElem.disabled = true;
} }
// create span // create span
var labelSpan = document.createElement("label"); var labelSpan = document.createElement("label");
// this isn't the DOM attribute 'for', but an arbitrary name we
// use to find the appropriate input element in <onButtonClick>
labelSpan["for"] = inputElem.id; labelSpan["for"] = inputElem.id;
OpenLayers.Element.addClass(labelSpan, "labelSpan olButton"); OpenLayers.Element.addClass(labelSpan, "labelSpan olButton");
labelSpan._layer = layer.id; labelSpan._layer = layer.id;
@@ -350,12 +333,12 @@ OpenLayers.Control.LayerSwitcher =
labelSpan.style.color = "gray"; labelSpan.style.color = "gray";
} }
labelSpan.innerHTML = layer.name; labelSpan.innerHTML = layer.name;
labelSpan.style.verticalAlign = (baseLayer) ? "bottom" labelSpan.style.verticalAlign = (baseLayer) ? "bottom"
: "baseline"; : "baseline";
// create line break // create line break
var br = document.createElement("br"); var br = document.createElement("br");
var groupArray = (baseLayer) ? this.baseLayers var groupArray = (baseLayer) ? this.baseLayers
: this.dataLayers; : this.dataLayers;
groupArray.push({ groupArray.push({
@@ -363,8 +346,8 @@ OpenLayers.Control.LayerSwitcher =
'inputElem': inputElem, 'inputElem': inputElem,
'labelSpan': labelSpan 'labelSpan': labelSpan
}); });
var groupDiv = (baseLayer) ? this.baseLayersDiv var groupDiv = (baseLayer) ? this.baseLayersDiv
: this.dataLayersDiv; : this.dataLayersDiv;
groupDiv.appendChild(inputElem); groupDiv.appendChild(inputElem);
@@ -374,24 +357,24 @@ OpenLayers.Control.LayerSwitcher =
} }
// if no overlays, dont display the overlay label // if no overlays, dont display the overlay label
this.dataLbl.style.display = (containsOverlays) ? "" : "none"; this.dataLbl.style.display = (containsOverlays) ? "" : "none";
// if no baselayers, dont display the baselayer label // if no baselayers, dont display the baselayer label
this.baseLbl.style.display = (containsBaseLayers) ? "" : "none"; this.baseLbl.style.display = (containsBaseLayers) ? "" : "none";
return this.div; return this.div;
}, },
/** /**
* Method: updateMap * Method: updateMap
* Cycles through the loaded data and base layer input arrays and makes * Cycles through the loaded data and base layer input arrays and makes
* the necessary calls to the Map object such that that the map's * the necessary calls to the Map object such that that the map's
* visual state corresponds to what the user has selected in * visual state corresponds to what the user has selected in
* the control. * the control.
*/ */
updateMap: function() { updateMap: function() {
// set the newly selected base layer // set the newly selected base layer
for(var i=0, len=this.baseLayers.length; i<len; i++) { for(var i=0, len=this.baseLayers.length; i<len; i++) {
var layerEntry = this.baseLayers[i]; var layerEntry = this.baseLayers[i];
if (layerEntry.inputElem.checked) { if (layerEntry.inputElem.checked) {
@@ -401,18 +384,18 @@ OpenLayers.Control.LayerSwitcher =
// set the correct visibilities for the overlays // set the correct visibilities for the overlays
for(var i=0, len=this.dataLayers.length; i<len; i++) { for(var i=0, len=this.dataLayers.length; i<len; i++) {
var layerEntry = this.dataLayers[i]; var layerEntry = this.dataLayers[i];
layerEntry.layer.setVisibility(layerEntry.inputElem.checked); layerEntry.layer.setVisibility(layerEntry.inputElem.checked);
} }
}, },
/** /**
* Method: maximizeControl * Method: maximizeControl
* Set up the labels and divs for the control * Set up the labels and divs for the control
* *
* Parameters: * Parameters:
* e - {Event} * e - {Event}
*/ */
maximizeControl: function(e) { maximizeControl: function(e) {
@@ -424,17 +407,17 @@ OpenLayers.Control.LayerSwitcher =
this.showControls(false); this.showControls(false);
if (e != null) { if (e != null) {
OpenLayers.Event.stop(e); OpenLayers.Event.stop(e);
} }
}, },
/** /**
* Method: minimizeControl * Method: minimizeControl
* Hide all the contents of the control, shrink the size, * Hide all the contents of the control, shrink the size,
* add the maximize icon * add the maximize icon
* *
* Parameters: * Parameters:
* e - {Event} * e - {Event}
*/ */
minimizeControl: function(e) { minimizeControl: function(e) {
@@ -448,7 +431,7 @@ OpenLayers.Control.LayerSwitcher =
this.showControls(true); this.showControls(true);
if (e != null) { if (e != null) {
OpenLayers.Event.stop(e); OpenLayers.Event.stop(e);
} }
}, },
@@ -456,7 +439,7 @@ OpenLayers.Control.LayerSwitcher =
* Method: showControls * Method: showControls
* Hide/Show all LayerSwitcher controls depending on whether we are * Hide/Show all LayerSwitcher controls depending on whether we are
* minimized or not * minimized or not
* *
* Parameters: * Parameters:
* minimize - {Boolean} * minimize - {Boolean}
*/ */
@@ -467,14 +450,14 @@ OpenLayers.Control.LayerSwitcher =
this.layersDiv.style.display = minimize ? "none" : ""; this.layersDiv.style.display = minimize ? "none" : "";
}, },
/** /**
* Method: loadContents * Method: loadContents
* Set up the labels and divs for the control * Set up the labels and divs for the control
*/ */
loadContents: function() { loadContents: function() {
// layers list div // layers list div
this.layersDiv = document.createElement("div"); this.layersDiv = document.createElement("div");
this.layersDiv.id = this.id + "_layersDiv"; this.layersDiv.id = this.id + "_layersDiv";
OpenLayers.Element.addClass(this.layersDiv, "layersDiv"); OpenLayers.Element.addClass(this.layersDiv, "layersDiv");
@@ -482,14 +465,14 @@ OpenLayers.Control.LayerSwitcher =
this.baseLbl = document.createElement("div"); this.baseLbl = document.createElement("div");
this.baseLbl.innerHTML = OpenLayers.i18n("Base Layer"); this.baseLbl.innerHTML = OpenLayers.i18n("Base Layer");
OpenLayers.Element.addClass(this.baseLbl, "baseLbl"); OpenLayers.Element.addClass(this.baseLbl, "baseLbl");
this.baseLayersDiv = document.createElement("div"); this.baseLayersDiv = document.createElement("div");
OpenLayers.Element.addClass(this.baseLayersDiv, "baseLayersDiv"); OpenLayers.Element.addClass(this.baseLayersDiv, "baseLayersDiv");
this.dataLbl = document.createElement("div"); this.dataLbl = document.createElement("div");
this.dataLbl.innerHTML = OpenLayers.i18n("Overlays"); this.dataLbl.innerHTML = OpenLayers.i18n("Overlays");
OpenLayers.Element.addClass(this.dataLbl, "dataLbl"); OpenLayers.Element.addClass(this.dataLbl, "dataLbl");
this.dataLayersDiv = document.createElement("div"); this.dataLayersDiv = document.createElement("div");
OpenLayers.Element.addClass(this.dataLayersDiv, "dataLayersDiv"); OpenLayers.Element.addClass(this.dataLayersDiv, "dataLayersDiv");
@@ -503,46 +486,36 @@ OpenLayers.Control.LayerSwitcher =
this.layersDiv.appendChild(this.dataLayersDiv); this.layersDiv.appendChild(this.dataLayersDiv);
this.layersDiv.appendChild(this.baseLbl); this.layersDiv.appendChild(this.baseLbl);
this.layersDiv.appendChild(this.baseLayersDiv); this.layersDiv.appendChild(this.baseLayersDiv);
}
this.div.appendChild(this.layersDiv);
if(this.roundedCorner) {
OpenLayers.Rico.Corner.round(this.div, {
corners: "tl bl",
bgColor: "transparent",
color: this.roundedCornerColor,
blend: false
});
OpenLayers.Rico.Corner.changeOpacity(this.layersDiv, 0.75);
} }
this.div.appendChild(this.layersDiv);
// maximize button div // maximize button div
var img = OpenLayers.Util.getImageLocation('layer-switcher-maximize.png'); var img = OpenLayers.Util.getImageLocation('layer-switcher-maximize.png');
this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv( this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv(
"OpenLayers_Control_MaximizeDiv", "OpenLayers_Control_MaximizeDiv",
null, null,
null, null,
img, img,
"absolute"); "absolute");
OpenLayers.Element.addClass(this.maximizeDiv, "maximizeDiv olButton"); OpenLayers.Element.addClass(this.maximizeDiv, "maximizeDiv olButton");
this.maximizeDiv.style.display = "none"; this.maximizeDiv.style.display = "none";
this.div.appendChild(this.maximizeDiv); this.div.appendChild(this.maximizeDiv);
// minimize button div // minimize button div
var img = OpenLayers.Util.getImageLocation('layer-switcher-minimize.png'); var img = OpenLayers.Util.getImageLocation('layer-switcher-minimize.png');
this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv( this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv(
"OpenLayers_Control_MinimizeDiv", "OpenLayers_Control_MinimizeDiv",
null, null,
null, null,
img, img,
"absolute"); "absolute");
OpenLayers.Element.addClass(this.minimizeDiv, "minimizeDiv olButton"); OpenLayers.Element.addClass(this.minimizeDiv, "minimizeDiv olButton");
this.minimizeDiv.style.display = "none"; this.minimizeDiv.style.display = "none";
this.div.appendChild(this.minimizeDiv); this.div.appendChild(this.minimizeDiv);
}, },
CLASS_NAME: "OpenLayers.Control.LayerSwitcher" CLASS_NAME: "OpenLayers.Control.LayerSwitcher"
}); });

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -17,7 +17,7 @@
*/ */
OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, { OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
/** /**
* APIProperty: events * APIProperty: events
* {<OpenLayers.Events>} Events instance for listeners and triggering * {<OpenLayers.Events>} Events instance for listeners and triggering
* control specific events. * control specific events.
@@ -41,28 +41,28 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
* APIProperty: handlerOptions * APIProperty: handlerOptions
* {Object} Used to set non-default properties on the control's handler * {Object} Used to set non-default properties on the control's handler
*/ */
/** /**
* Property: callbacks * Property: callbacks
* {Object} The functions that are sent to the handler for callback * {Object} The functions that are sent to the handler for callback
*/ */
callbacks: null, callbacks: null,
/** /**
* Property: displaySystem * APIProperty: displaySystem
* {String} Display system for output measurements. Supported values * {String} Display system for output measurements. Supported values
* are 'english', 'metric', and 'geographic'. Default is 'metric'. * are 'english', 'metric', and 'geographic'. Default is 'metric'.
*/ */
displaySystem: 'metric', displaySystem: 'metric',
/** /**
* Property: geodesic * APIProperty: geodesic
* {Boolean} Calculate geodesic metrics instead of planar metrics. This * {Boolean} Calculate geodesic metrics instead of planar metrics. This
* requires that geometries can be transformed into Geographic/WGS84 * requires that geometries can be transformed into Geographic/WGS84
* (if that is not already the map projection). Default is false. * (if that is not already the map projection). Default is false.
*/ */
geodesic: false, geodesic: false,
/** /**
* Property: displaySystemUnits * Property: displaySystemUnits
* {Object} Units for various measurement systems. Values are arrays * {Object} Units for various measurement systems. Values are arrays
@@ -111,10 +111,10 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
/** /**
* Constructor: OpenLayers.Control.Measure * Constructor: OpenLayers.Control.Measure
* *
* Parameters: * Parameters:
* handler - {<OpenLayers.Handler>} * handler - {<OpenLayers.Handler>}
* options - {Object} * options - {Object}
*/ */
initialize: function(handler, options) { initialize: function(handler, options) {
OpenLayers.Control.prototype.initialize.apply(this, [options]); OpenLayers.Control.prototype.initialize.apply(this, [options]);
@@ -125,14 +125,14 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
} }
this.callbacks = OpenLayers.Util.extend(callbacks, this.callbacks); this.callbacks = OpenLayers.Util.extend(callbacks, this.callbacks);
// let the handler options override, so old code that passes 'persist' // let the handler options override, so old code that passes 'persist'
// directly to the handler does not need an update // directly to the handler does not need an update
this.handlerOptions = OpenLayers.Util.extend( this.handlerOptions = OpenLayers.Util.extend(
{persist: this.persist}, this.handlerOptions {persist: this.persist}, this.handlerOptions
); );
this.handler = new handler(this, this.callbacks, this.handlerOptions); this.handler = new handler(this, this.callbacks, this.handlerOptions);
}, },
/** /**
* APIMethod: deactivate * APIMethod: deactivate
*/ */
@@ -164,7 +164,7 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
delete this.callbacks.modify; delete this.callbacks.modify;
} }
}, },
/** /**
* Method: updateHandler * Method: updateHandler
* *
@@ -194,7 +194,7 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
this.cancelDelay(); this.cancelDelay();
this.measure(geometry, "measure"); this.measure(geometry, "measure");
}, },
/** /**
* Method: measurePartial * Method: measurePartial
* Called each time a new point is added to the measurement sketch. * Called each time a new point is added to the measurement sketch.
@@ -225,9 +225,11 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
/** /**
* Method: measureImmediate * Method: measureImmediate
* Called each time the measurement sketch is modified. * Called each time the measurement sketch is modified.
* *
* Parameters: point - {<OpenLayers.Geometry.Point>} The point at the * Parameters:
* mouseposition. feature - {<OpenLayers.Feature.Vector>} The sketch feature. * point - {<OpenLayers.Geometry.Point>} The point at the mouse position.
* feature - {<OpenLayers.Feature.Vector>} The sketch feature.
* drawing - {Boolean} Indicates whether we're currently drawing.
*/ */
measureImmediate : function(point, feature, drawing) { measureImmediate : function(point, feature, drawing) {
if (drawing && !this.handler.freehandMode(this.handler.evt)) { if (drawing && !this.handler.freehandMode(this.handler.evt)) {
@@ -270,7 +272,7 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
geometry: geometry geometry: geometry
}); });
}, },
/** /**
* Method: getBestArea * Method: getBestArea
* Based on the <displaySystem> returns the area of a geometry. * Based on the <displaySystem> returns the area of a geometry.
@@ -294,7 +296,7 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
} }
return [area, unit]; return [area, unit];
}, },
/** /**
* Method: getArea * Method: getArea
* *
@@ -321,7 +323,7 @@ OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
} }
return area; return area;
}, },
/** /**
* Method: getBestLength * Method: getBestLength
* Based on the <displaySystem> returns the length of a geometry. * Based on the <displaySystem> returns the length of a geometry.

View File

@@ -1,11 +1,10 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
/** /**
* @requires OpenLayers/Control/DragFeature.js * @requires OpenLayers/Handler/Drag.js
* @requires OpenLayers/Control/SelectFeature.js
* @requires OpenLayers/Handler/Keyboard.js * @requires OpenLayers/Handler/Keyboard.js
*/ */
@@ -50,7 +49,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
* Default is true. * Default is true.
*/ */
toggle: true, toggle: true,
/** /**
* APIProperty: standalone * APIProperty: standalone
* {Boolean} Set to true to create a control without SelectFeature * {Boolean} Set to true to create a control without SelectFeature
@@ -67,20 +66,26 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
* {<OpenLayers.Layer.Vector>} * {<OpenLayers.Layer.Vector>}
*/ */
layer: null, layer: null,
/** /**
* Property: feature * Property: feature
* {<OpenLayers.Feature.Vector>} Feature currently available for modification. * {<OpenLayers.Feature.Vector>} Feature currently available for modification.
*/ */
feature: null, feature: null,
/**
* Property: vertex
* {<OpenLayers.Feature.Vector>} Vertex currently being modified.
*/
vertex: null,
/** /**
* Property: vertices * Property: vertices
* {Array(<OpenLayers.Feature.Vector>)} Verticies currently available * {Array(<OpenLayers.Feature.Vector>)} Verticies currently available
* for dragging. * for dragging.
*/ */
vertices: null, vertices: null,
/** /**
* Property: virtualVertices * Property: virtualVertices
* {Array(<OpenLayers.Feature.Vector>)} Virtual vertices in the middle * {Array(<OpenLayers.Feature.Vector>)} Virtual vertices in the middle
@@ -88,24 +93,12 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
*/ */
virtualVertices: null, virtualVertices: null,
/**
* Property: selectControl
* {<OpenLayers.Control.SelectFeature>}
*/
selectControl: null,
/**
* Property: dragControl
* {<OpenLayers.Control.DragFeature>}
*/
dragControl: null,
/** /**
* Property: handlers * Property: handlers
* {Object} * {Object}
*/ */
handlers: null, handlers: null,
/** /**
* APIProperty: deleteCodes * APIProperty: deleteCodes
* {Array(Integer)} Keycodes for deleting verticies. Set to null to disable * {Array(Integer)} Keycodes for deleting verticies. Set to null to disable
@@ -120,7 +113,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
* {Object} A symbolizer to be used for virtual vertices. * {Object} A symbolizer to be used for virtual vertices.
*/ */
virtualStyle: null, virtualStyle: null,
/** /**
* APIProperty: vertexRenderIntent * APIProperty: vertexRenderIntent
* {String} The renderIntent to use for vertices. If no <virtualStyle> is * {String} The renderIntent to use for vertices. If no <virtualStyle> is
@@ -232,64 +225,50 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
if(!(OpenLayers.Util.isArray(this.deleteCodes))) { if(!(OpenLayers.Util.isArray(this.deleteCodes))) {
this.deleteCodes = [this.deleteCodes]; this.deleteCodes = [this.deleteCodes];
} }
var control = this;
// configure the drag handler
// configure the select control var dragCallbacks = {
var selectOptions = { down: function(pixel) {
geometryTypes: this.geometryTypes, this.vertex = null;
clickout: this.clickout, var feature = this.layer.getFeatureFromEvent(
toggle: this.toggle, this.handlers.drag.evt);
onBeforeSelect: this.beforeSelectFeature, if (feature) {
onSelect: this.selectFeature, this.dragStart(feature);
onUnselect: this.unselectFeature, } else if (this.feature && this.clickout) {
scope: this this.unselectFeature(this.feature);
}; }
if(this.standalone === false) {
this.selectControl = new OpenLayers.Control.SelectFeature(
layer, selectOptions
);
}
// configure the drag control
var dragOptions = {
documentDrag: this.documentDrag,
geometryTypes: ["OpenLayers.Geometry.Point"],
onStart: function(feature, pixel) {
control.dragStart.apply(control, [feature, pixel]);
}, },
onDrag: function(feature, pixel) { move: function(pixel) {
control.dragVertex.apply(control, [feature, pixel]); delete this._unselect;
if (this.vertex) {
this.dragVertex(this.vertex, pixel);
}
}, },
onComplete: function(feature) { up: function() {
control.dragComplete.apply(control, [feature]); this.handlers.drag.stopDown = false;
if (this._unselect) {
this.unselectFeature(this._unselect);
delete this._unselect;
}
}, },
featureCallbacks: { done: function(pixel) {
over: function(feature) { if (this.vertex) {
/** this.dragComplete(this.vertex);
* In normal mode, the feature handler is set up to allow
* dragging of all points. In standalone mode, we only
* want to allow dragging of sketch vertices and virtual
* vertices - or, in the case of a modifiable point, the
* point itself.
*/
if(control.standalone !== true || feature._sketch ||
control.feature === feature) {
control.dragControl.overFeature.apply(
control.dragControl, [feature]);
}
} }
} }
}; };
this.dragControl = new OpenLayers.Control.DragFeature( var dragOptions = {
layer, dragOptions documentDrag: this.documentDrag,
); stopDown: false
};
// configure the keyboard handler // configure the keyboard handler
var keyboardOptions = { var keyboardOptions = {
keydown: this.handleKeypress keydown: this.handleKeypress
}; };
this.handlers = { this.handlers = {
keyboard: new OpenLayers.Handler.Keyboard(this, keyboardOptions) keyboard: new OpenLayers.Handler.Keyboard(this, keyboardOptions),
drag: new OpenLayers.Handler.Drag(this, dragCallbacks, dragOptions)
}; };
}, },
@@ -298,9 +277,14 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
* Take care of things that are not handled in superclass. * Take care of things that are not handled in superclass.
*/ */
destroy: function() { destroy: function() {
if (this.map) {
this.map.events.un({
"removelayer": this.handleMapEvents,
"changelayer": this.handleMapEvents,
scope: this
});
}
this.layer = null; this.layer = null;
this.standalone || this.selectControl.destroy();
this.dragControl.destroy();
OpenLayers.Control.prototype.destroy.apply(this, []); OpenLayers.Control.prototype.destroy.apply(this, []);
}, },
@@ -312,8 +296,14 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
* {Boolean} Successfully activated the control. * {Boolean} Successfully activated the control.
*/ */
activate: function() { activate: function() {
return ((this.standalone || this.selectControl.activate()) && this.moveLayerToTop();
this.handlers.keyboard.activate() && this.map.events.on({
"removelayer": this.handleMapEvents,
"changelayer": this.handleMapEvents,
scope: this
});
return (this.handlers.keyboard.activate() &&
this.handlers.drag.activate() &&
OpenLayers.Control.prototype.activate.apply(this, arguments)); OpenLayers.Control.prototype.activate.apply(this, arguments));
}, },
@@ -328,29 +318,26 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
var deactivated = false; var deactivated = false;
// the return from the controls is unimportant in this case // the return from the controls is unimportant in this case
if(OpenLayers.Control.prototype.deactivate.apply(this, arguments)) { if(OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
this.moveLayerBack();
this.map.events.un({
"removelayer": this.handleMapEvents,
"changelayer": this.handleMapEvents,
scope: this
});
this.layer.removeFeatures(this.vertices, {silent: true}); this.layer.removeFeatures(this.vertices, {silent: true});
this.layer.removeFeatures(this.virtualVertices, {silent: true}); this.layer.removeFeatures(this.virtualVertices, {silent: true});
this.vertices = []; this.vertices = [];
this.dragControl.deactivate(); this.handlers.drag.deactivate();
var feature = this.feature;
var valid = feature && feature.geometry && feature.layer;
if(this.standalone === false) {
if(valid) {
this.selectControl.unselect.apply(this.selectControl,
[feature]);
}
this.selectControl.deactivate();
} else {
if(valid) {
this.unselectFeature(feature);
}
}
this.handlers.keyboard.deactivate(); this.handlers.keyboard.deactivate();
var feature = this.feature;
if (feature && feature.geometry && feature.layer) {
this.unselectFeature(feature);
}
deactivated = true; deactivated = true;
} }
return deactivated; return deactivated;
}, },
/** /**
* Method: beforeSelectFeature * Method: beforeSelectFeature
* Called before a feature is selected. * Called before a feature is selected.
@@ -367,19 +354,27 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
/** /**
* APIMethod: selectFeature * APIMethod: selectFeature
* Select a feature for modification in standalone mode. In non-standalone * Select a feature for modification in standalone mode. In non-standalone
* mode, this method is called when the select feature control selects a * mode, this method is called when a feature is selected by clicking.
* feature. Register a listener to the beforefeaturemodified event and * Register a listener to the beforefeaturemodified event and return false
* return false to prevent feature modification. * to prevent feature modification.
* *
* Parameters: * Parameters:
* feature - {<OpenLayers.Feature.Vector>} the selected feature. * feature - {<OpenLayers.Feature.Vector>} the selected feature.
*/ */
selectFeature: function(feature) { selectFeature: function(feature) {
if (!this.standalone || this.beforeSelectFeature(feature) !== false) { if (this.geometryTypes && OpenLayers.Util.indexOf(this.geometryTypes,
feature.geometry.CLASS_NAME) == -1) {
return;
}
if (this.beforeSelectFeature(feature) !== false) {
if (this.feature) {
this.unselectFeature(this.feature);
}
this.feature = feature; this.feature = feature;
this.layer.selectedFeatures.push(feature);
this.layer.drawFeature(feature, 'select');
this.modified = false; this.modified = false;
this.resetVertices(); this.resetVertices();
this.dragControl.activate();
this.onModificationStart(this.feature); this.onModificationStart(this.feature);
} }
// keep track of geometry modifications // keep track of geometry modifications
@@ -409,8 +404,9 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
this.layer.destroyFeatures([this.radiusHandle], {silent: true}); this.layer.destroyFeatures([this.radiusHandle], {silent: true});
delete this.radiusHandle; delete this.radiusHandle;
} }
this.layer.drawFeature(this.feature, 'default');
this.feature = null; this.feature = null;
this.dragControl.deactivate(); OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature);
this.onModificationEnd(feature); this.onModificationEnd(feature);
this.layer.events.triggerEvent("afterfeaturemodified", { this.layer.events.triggerEvent("afterfeaturemodified", {
feature: feature, feature: feature,
@@ -418,64 +414,48 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
}); });
this.modified = false; this.modified = false;
}, },
/** /**
* Method: dragStart * Method: dragStart
* Called by the drag feature control with before a feature is dragged. * Called by the drag handler before a feature is dragged. This method is
* This method is used to differentiate between points and vertices * used to differentiate between points and vertices
* of higher order geometries. This respects the <geometryTypes> * of higher order geometries.
* property and forces a select of points when the drag control is
* already active (and stops events from propagating to the select
* control).
* *
* Parameters: * Parameters:
* feature - {<OpenLayers.Feature.Vector>} The point or vertex about to be * feature - {<OpenLayers.Feature.Vector>} The point or vertex about to be
* dragged. * dragged.
* pixel - {<OpenLayers.Pixel>} Pixel location of the mouse event.
*/ */
dragStart: function(feature, pixel) { dragStart: function(feature) {
// only change behavior if the feature is not in the vertices array var isPoint = feature.geometry.CLASS_NAME ==
if(feature != this.feature && !feature.geometry.parent && 'OpenLayers.Geometry.Point';
feature != this.dragHandle && feature != this.radiusHandle) { if (!this.standalone &&
if(this.standalone === false && this.feature) { ((!feature._sketch && isPoint) || !feature._sketch)) {
// unselect the currently selected feature if (this.toggle && this.feature === feature) {
this.selectControl.clickFeature.apply(this.selectControl, // mark feature for unselection
[this.feature]); this._unselect = feature;
}
// check any constraints on the geometry type
if(this.geometryTypes == null ||
OpenLayers.Util.indexOf(this.geometryTypes,
feature.geometry.CLASS_NAME) != -1) {
// select the point
this.standalone || this.selectControl.clickFeature.apply(
this.selectControl, [feature]);
/**
* TBD: These lines improve workflow by letting the user
* immediately start dragging after the mouse down.
* However, it is very ugly to be messing with controls
* and their handlers in this way. I'd like a better
* solution if the workflow change is necessary.
*/
// prepare the point for dragging
this.dragControl.overFeature.apply(this.dragControl,
[feature]);
this.dragControl.lastPixel = pixel;
this.dragControl.handlers.drag.started = true;
this.dragControl.handlers.drag.start = pixel;
this.dragControl.handlers.drag.last = pixel;
} }
this.selectFeature(feature);
}
if (feature._sketch || isPoint) {
// feature is a drag or virtual handle or point
this.vertex = feature;
this.handlers.drag.stopDown = true;
} }
}, },
/** /**
* Method: dragVertex * Method: dragVertex
* Called by the drag feature control with each drag move of a vertex. * Called by the drag handler with each drag move of a vertex.
* *
* Parameters: * Parameters:
* vertex - {<OpenLayers.Feature.Vector>} The vertex being dragged. * vertex - {<OpenLayers.Feature.Vector>} The vertex being dragged.
* pixel - {<OpenLayers.Pixel>} Pixel location of the mouse event. * pixel - {<OpenLayers.Pixel>} Pixel location of the mouse event.
*/ */
dragVertex: function(vertex, pixel) { dragVertex: function(vertex, pixel) {
var pos = this.map.getLonLatFromViewPortPx(pixel);
var geom = vertex.geometry;
geom.move(pos.lon - geom.x, pos.lat - geom.y);
this.modified = true; this.modified = true;
/** /**
* Five cases: * Five cases:
@@ -487,9 +467,6 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
*/ */
if(this.feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { if(this.feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
// dragging a simple point // dragging a simple point
if(this.feature != vertex) {
this.feature = vertex;
}
this.layer.events.triggerEvent("vertexmodified", { this.layer.events.triggerEvent("vertexmodified", {
vertex: vertex.geometry, vertex: vertex.geometry,
feature: this.feature, feature: this.feature,
@@ -526,7 +503,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
this.virtualVertices = []; this.virtualVertices = [];
} }
this.layer.drawFeature(this.feature, this.standalone ? undefined : this.layer.drawFeature(this.feature, this.standalone ? undefined :
this.selectControl.renderIntent); 'select');
} }
// keep the vertex on top so it gets the mouseout after dragging // keep the vertex on top so it gets the mouseout after dragging
// this should be removed in favor of an option to draw under or // this should be removed in favor of an option to draw under or
@@ -536,7 +513,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
/** /**
* Method: dragComplete * Method: dragComplete
* Called by the drag feature control when the feature dragging is complete. * Called by the drag handler when the feature dragging is complete.
* *
* Parameters: * Parameters:
* vertex - {<OpenLayers.Feature.Vector>} The vertex being dragged. * vertex - {<OpenLayers.Feature.Vector>} The vertex being dragged.
@@ -572,16 +549,6 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
* Method: resetVertices * Method: resetVertices
*/ */
resetVertices: function() { resetVertices: function() {
// if coming from a drag complete we're about to destroy the vertex
// that was just dragged. For that reason, the drag feature control
// will never detect a mouse-out on that vertex, meaning that the drag
// handler won't be deactivated. This can cause errors because the drag
// feature control still has a feature to drag but that feature is
// destroyed. To prevent this, we call outFeature on the drag feature
// control if the control actually has a feature to drag.
if(this.dragControl.feature) {
this.dragControl.outFeature(this.dragControl.feature);
}
if(this.vertices.length > 0) { if(this.vertices.length > 0) {
this.layer.removeFeatures(this.vertices, {silent: true}); this.layer.removeFeatures(this.vertices, {silent: true});
this.vertices = []; this.vertices = [];
@@ -632,11 +599,10 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
// check for delete key // check for delete key
if(this.feature && if(this.feature &&
OpenLayers.Util.indexOf(this.deleteCodes, code) != -1) { OpenLayers.Util.indexOf(this.deleteCodes, code) != -1) {
var vertex = this.dragControl.feature; var vertex = this.layer.getFeatureFromEvent(this.handlers.drag.evt);
if(vertex && if (vertex &&
OpenLayers.Util.indexOf(this.vertices, vertex) != -1 && OpenLayers.Util.indexOf(this.vertices, vertex) != -1 &&
!this.dragControl.handlers.drag.dragging && !this.handlers.drag.dragging && vertex.geometry.parent) {
vertex.geometry.parent) {
// remove the vertex // remove the vertex
vertex.geometry.parent.removeComponent(vertex.geometry); vertex.geometry.parent.removeComponent(vertex.geometry);
this.layer.events.triggerEvent("vertexremoved", { this.layer.events.triggerEvent("vertexremoved", {
@@ -645,8 +611,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
pixel: evt.xy pixel: evt.xy
}); });
this.layer.drawFeature(this.feature, this.standalone ? this.layer.drawFeature(this.feature, this.standalone ?
undefined : undefined : 'select');
this.selectControl.renderIntent);
this.modified = true; this.modified = true;
this.resetVertices(); this.resetVertices();
this.setFeatureState(); this.setFeatureState();
@@ -800,11 +765,49 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
* map - {<OpenLayers.Map>} The control's map. * map - {<OpenLayers.Map>} The control's map.
*/ */
setMap: function(map) { setMap: function(map) {
this.standalone || this.selectControl.setMap(map); this.handlers.drag.setMap(map);
this.dragControl.setMap(map);
OpenLayers.Control.prototype.setMap.apply(this, arguments); OpenLayers.Control.prototype.setMap.apply(this, arguments);
}, },
/**
* Method: handleMapEvents
*
* Parameters:
* evt - {Object}
*/
handleMapEvents: function(evt) {
if (evt.type == "removelayer" || evt.property == "order") {
this.moveLayerToTop();
}
},
/**
* Method: moveLayerToTop
* Moves the layer for this handler to the top, so mouse events can reach
* it.
*/
moveLayerToTop: function() {
var index = Math.max(this.map.Z_INDEX_BASE['Feature'] - 1,
this.layer.getZIndex()) + 1;
this.layer.setZIndex(index);
},
/**
* Method: moveLayerBack
* Moves the layer back to the position determined by the map's layers
* array.
*/
moveLayerBack: function() {
var index = this.layer.getZIndex() - 1;
if (index >= this.map.Z_INDEX_BASE['Feature']) {
this.layer.setZIndex(index);
} else {
this.map.setLayerZIndex(this.layer,
this.map.getLayerIndex(this.layer));
}
},
CLASS_NAME: "OpenLayers.Control.ModifyFeature" CLASS_NAME: "OpenLayers.Control.ModifyFeature"
}); });

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -77,7 +77,9 @@ OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
/** /**
* Property: mouseWheelOptions * Property: mouseWheelOptions
* {Object} Options passed to the MouseWheel control (only useful if * {Object} Options passed to the MouseWheel control (only useful if
* <zoomWheelEnabled> is set to true) * <zoomWheelEnabled> is set to true). Default is no options for maps
* with fractionalZoom set to true, otherwise
* {cumulative: false, interval: 50, maxDelta: 6}
*/ */
mouseWheelOptions: null, mouseWheelOptions: null,
@@ -208,10 +210,15 @@ OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
{map: this.map, keyMask: this.zoomBoxKeyMask}); {map: this.map, keyMask: this.zoomBoxKeyMask});
this.dragPan.draw(); this.dragPan.draw();
this.zoomBox.draw(); this.zoomBox.draw();
var wheelOptions = this.map.fractionalZoom ? {} : {
cumulative: false,
interval: 50,
maxDelta: 6
};
this.handlers.wheel = new OpenLayers.Handler.MouseWheel( this.handlers.wheel = new OpenLayers.Handler.MouseWheel(
this, {"up" : this.wheelUp, this, {up : this.wheelUp, down: this.wheelDown},
"down": this.wheelDown}, OpenLayers.Util.extend(wheelOptions, this.mouseWheelOptions)
this.mouseWheelOptions ); );
if (OpenLayers.Control.PinchZoom) { if (OpenLayers.Control.PinchZoom) {
this.pinchZoom = new OpenLayers.Control.PinchZoom( this.pinchZoom = new OpenLayers.Control.PinchZoom(
OpenLayers.Util.extend( OpenLayers.Util.extend(
@@ -238,8 +245,7 @@ OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
* evt - {Event} * evt - {Event}
*/ */
defaultDblClick: function (evt) { defaultDblClick: function (evt) {
var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); this.map.zoomTo(this.map.zoom + 1, evt.xy);
this.map.setCenter(newCenter, this.map.zoom + 1);
}, },
/** /**
@@ -249,8 +255,7 @@ OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
* evt - {Event} * evt - {Event}
*/ */
defaultDblRightClick: function (evt) { defaultDblRightClick: function (evt) {
var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); this.map.zoomTo(this.map.zoom - 1, evt.xy);
this.map.setCenter(newCenter, this.map.zoom - 1);
}, },
/** /**
@@ -264,22 +269,14 @@ OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
if (!this.map.fractionalZoom) { if (!this.map.fractionalZoom) {
deltaZ = Math.round(deltaZ); deltaZ = Math.round(deltaZ);
} }
var currentZoom = this.map.getZoom(); var currentZoom = this.map.getZoom(),
var newZoom = this.map.getZoom() + deltaZ; newZoom = currentZoom + deltaZ;
newZoom = Math.max(newZoom, 0); newZoom = Math.max(newZoom, 0);
newZoom = Math.min(newZoom, this.map.getNumZoomLevels()); newZoom = Math.min(newZoom, this.map.getNumZoomLevels());
if (newZoom === currentZoom) { if (newZoom === currentZoom) {
return; return;
} }
var size = this.map.getSize(); this.map.zoomTo(newZoom, evt.xy);
var deltaX = size.w/2 - evt.xy.x;
var deltaY = evt.xy.y - size.h/2;
var newRes = this.map.baseLayer.getResolutionForZoom(newZoom);
var zoomPoint = this.map.getLonLatFromPixel(evt.xy);
var newCenter = new OpenLayers.LonLat(
zoomPoint.lon + deltaX * newRes,
zoomPoint.lat + deltaY * newRes );
this.map.setCenter( newCenter, newZoom );
}, },
/** /**

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -4,7 +4,6 @@
* full text of the license. */ * full text of the license. */
/** /**
* @requires OpenLayers/Util/vendorPrefix.js
* @requires OpenLayers/Handler/Pinch.js * @requires OpenLayers/Handler/Pinch.js
*/ */
@@ -105,27 +104,13 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
var current = (this.preserveCenter) ? var current = (this.preserveCenter) ?
this.map.getPixelFromLonLat(this.map.getCenter()) : evt.xy; this.map.getPixelFromLonLat(this.map.getCenter()) : evt.xy;
var dx = Math.round((current.x - pinchOrigin.x) + (scale - 1) * (containerOrigin.x - pinchOrigin.x)); var dx = Math.round((containerOrigin.x + current.x - pinchOrigin.x) + (scale - 1) * (containerOrigin.x - pinchOrigin.x));
var dy = Math.round((current.y - pinchOrigin.y) + (scale - 1) * (containerOrigin.y - pinchOrigin.y)); var dy = Math.round((containerOrigin.y + current.y - pinchOrigin.y) + (scale - 1) * (containerOrigin.y - pinchOrigin.y));
this.applyTransform( this.map.applyTransform(dx, dy, scale);
"translate(" + dx + "px, " + dy + "px) scale(" + scale + ")"
);
this.currentCenter = current; this.currentCenter = current;
}, },
/**
* Method: applyTransform
* Applies the given transform to layers.
*/
applyTransform: function(transform) {
var style = this.map.layerContainerDiv.style;
var transformProperty = OpenLayers.Util.vendorPrefix.style("transform");
if (transformProperty) {
style[transformProperty] = transform;
}
},
/** /**
* Method: pinchDone * Method: pinchDone
* *
@@ -137,7 +122,7 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
* of the pinch gesture. This give us the final scale of the pinch. * of the pinch gesture. This give us the final scale of the pinch.
*/ */
pinchDone: function(evt, start, last) { pinchDone: function(evt, start, last) {
this.applyTransform(""); this.map.applyTransform();
var zoom = this.map.getZoomForResolution(this.map.getResolution() / last.scale, true); var zoom = this.map.getZoomForResolution(this.map.getResolution() / last.scale, true);
if (zoom !== this.map.getZoom() || !this.currentCenter.equals(this.pinchOrigin)) { if (zoom !== this.map.getZoom() || !this.currentCenter.equals(this.pinchOrigin)) {
var resolution = this.map.getResolutionForZoom(zoom); var resolution = this.map.getResolutionForZoom(zoom);

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -175,8 +175,7 @@ OpenLayers.Control.TouchNavigation = OpenLayers.Class(OpenLayers.Control, {
* evt - {Event} * evt - {Event}
*/ */
defaultDblClick: function (evt) { defaultDblClick: function (evt) {
var newCenter = this.map.getLonLatFromViewPortPx(evt.xy); this.map.zoomTo(this.map.zoom + 1, evt.xy);
this.map.setCenter(newCenter, this.map.zoom + 1);
}, },
CLASS_NAME: "OpenLayers.Control.TouchNavigation" CLASS_NAME: "OpenLayers.Control.TouchNavigation"

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -15,10 +15,10 @@
/** /**
* Class: OpenLayers.Control.WMSGetFeatureInfo * Class: OpenLayers.Control.WMSGetFeatureInfo
* The WMSGetFeatureInfo control uses a WMS query to get information about a point on the map. The * The WMSGetFeatureInfo control uses a WMS query to get information about a point on the map. The
* information may be in a display-friendly format such as HTML, or a machine-friendly format such * information may be in a display-friendly format such as HTML, or a machine-friendly format such
* as GML, depending on the server's capabilities and the client's configuration. This control * as GML, depending on the server's capabilities and the client's configuration. This control
* handles click or hover events, attempts to parse the results using an OpenLayers.Format, and * handles click or hover events, attempts to parse the results using an OpenLayers.Format, and
* fires a 'getfeatureinfo' event with the click position, the raw body of the response, and an * fires a 'getfeatureinfo' event with the click position, the raw body of the response, and an
* array of features if it successfully read the response. * array of features if it successfully read the response.
* *
* Inherits from: * Inherits from:
@@ -49,23 +49,25 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
*/ */
maxFeatures: 10, maxFeatures: 10,
/** APIProperty: clickCallback /**
* {String} The click callback to register in the * APIProperty: clickCallback
* {<OpenLayers.Handler.Click>} object created when the hover * {String} The click callback to register in the
* option is set to false. Default is "click". * {<OpenLayers.Handler.Click>} object created when the hover
* option is set to false. Default is "click".
*/ */
clickCallback: "click", clickCallback: "click",
/** APIProperty: output /**
* {String} Either "features" or "object". When triggering a * APIProperty: output
* getfeatureinfo request should we pass on an array of features * {String} Either "features" or "object". When triggering a getfeatureinfo
* or an object with with a "features" property and other properties * request should we pass on an array of features or an object with with
* (such as the url of the WMS). Default is "features". * a "features" property and other properties (such as the url of the
* WMS). Default is "features".
*/ */
output: "features", output: "features",
/** /**
* Property: layers * APIProperty: layers
* {Array(<OpenLayers.Layer.WMS>)} The layers to query for feature info. * {Array(<OpenLayers.Layer.WMS>)} The layers to query for feature info.
* If omitted, all map WMS layers with a url that matches this <url> or * If omitted, all map WMS layers with a url that matches this <url> or
* <layerUrls> will be considered. * <layerUrls> will be considered.
@@ -73,21 +75,21 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
layers: null, layers: null,
/** /**
* Property: queryVisible * APIProperty: queryVisible
* {Boolean} If true, filter out hidden layers when searching the map for * {Boolean} If true, filter out hidden layers when searching the map for
* layers to query. Default is false. * layers to query. Default is false.
*/ */
queryVisible: false, queryVisible: false,
/** /**
* Property: url * APIProperty: url
* {String} The URL of the WMS service to use. If not provided, the url * {String} The URL of the WMS service to use. If not provided, the url
* of the first eligible layer will be used. * of the first eligible layer will be used.
*/ */
url: null, url: null,
/** /**
* Property: layerUrls * APIProperty: layerUrls
* {Array(String)} Optional list of urls for layers that should be queried. * {Array(String)} Optional list of urls for layers that should be queried.
* This can be used when the layer url differs from the url used for * This can be used when the layer url differs from the url used for
* making GetFeatureInfo requests (in the case of a layer using cached * making GetFeatureInfo requests (in the case of a layer using cached
@@ -96,18 +98,18 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
layerUrls: null, layerUrls: null,
/** /**
* Property: infoFormat * APIProperty: infoFormat
* {String} The mimetype to request from the server. If you are using * {String} The mimetype to request from the server. If you are using
* drillDown mode and have multiple servers that do not share a common * drillDown mode and have multiple servers that do not share a common
* infoFormat, you can override the control's infoFormat by providing an * infoFormat, you can override the control's infoFormat by providing an
* INFO_FORMAT parameter in your <OpenLayers.Layer.WMS> instance(s). * INFO_FORMAT parameter in your <OpenLayers.Layer.WMS> instance(s).
*/ */
infoFormat: 'text/html', infoFormat: 'text/html',
/** /**
* Property: vendorParams * APIProperty: vendorParams
* {Object} Additional parameters that will be added to the request, for * {Object} Additional parameters that will be added to the request, for
* WMS implementations that support them. This could e.g. look like * WMS implementations that support them. This could e.g. look like
* (start code) * (start code)
* { * {
* radius: 5 * radius: 5
@@ -115,16 +117,16 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
* (end) * (end)
*/ */
vendorParams: {}, vendorParams: {},
/** /**
* Property: format * APIProperty: format
* {<OpenLayers.Format>} A format for parsing GetFeatureInfo responses. * {<OpenLayers.Format>} A format for parsing GetFeatureInfo responses.
* Default is <OpenLayers.Format.WMSGetFeatureInfo>. * Default is <OpenLayers.Format.WMSGetFeatureInfo>.
*/ */
format: null, format: null,
/** /**
* Property: formatOptions * APIProperty: formatOptions
* {Object} Optional properties to set on the format (if one is not provided * {Object} Optional properties to set on the format (if one is not provided
* in the <format> property. * in the <format> property.
*/ */
@@ -140,21 +142,21 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
* } * }
* (end) * (end)
*/ */
/** /**
* Property: handler * Property: handler
* {Object} Reference to the <OpenLayers.Handler> for this control * {Object} Reference to the <OpenLayers.Handler> for this control
*/ */
handler: null, handler: null,
/** /**
* Property: hoverRequest * Property: hoverRequest
* {<OpenLayers.Request>} contains the currently running hover request * {<OpenLayers.Request>} contains the currently running hover request
* (if any). * (if any).
*/ */
hoverRequest: null, hoverRequest: null,
/** /**
* APIProperty: events * APIProperty: events
* {<OpenLayers.Events>} Events instance for listeners and triggering * {<OpenLayers.Events>} Events instance for listeners and triggering
* control specific events. * control specific events.
@@ -166,7 +168,7 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
* *
* Supported event types (in addition to those from <OpenLayers.Control.events>): * Supported event types (in addition to those from <OpenLayers.Control.events>):
* beforegetfeatureinfo - Triggered before the request is sent. * beforegetfeatureinfo - Triggered before the request is sent.
* The event object has an *xy* property with the position of the * The event object has an *xy* property with the position of the
* mouse click or hover event that triggers the request. * mouse click or hover event that triggers the request.
* nogetfeatureinfo - no queryable layers were found. * nogetfeatureinfo - no queryable layers were found.
* getfeatureinfo - Triggered when a GetFeatureInfo response is received. * getfeatureinfo - Triggered when a GetFeatureInfo response is received.
@@ -184,20 +186,20 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
* Constructor: <OpenLayers.Control.WMSGetFeatureInfo> * Constructor: <OpenLayers.Control.WMSGetFeatureInfo>
* *
* Parameters: * Parameters:
* options - {Object} * options - {Object}
*/ */
initialize: function(options) { initialize: function(options) {
options = options || {}; options = options || {};
options.handlerOptions = options.handlerOptions || {}; options.handlerOptions = options.handlerOptions || {};
OpenLayers.Control.prototype.initialize.apply(this, [options]); OpenLayers.Control.prototype.initialize.apply(this, [options]);
if(!this.format) { if(!this.format) {
this.format = new OpenLayers.Format.WMSGetFeatureInfo( this.format = new OpenLayers.Format.WMSGetFeatureInfo(
options.formatOptions options.formatOptions
); );
} }
if(this.drillDown === true) { if(this.drillDown === true) {
this.hover = false; this.hover = false;
} }
@@ -220,11 +222,11 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
}, },
/** /**
* Method: getInfoForClick * Method: getInfoForClick
* Called on click * Called on click
* *
* Parameters: * Parameters:
* evt - {<OpenLayers.Event>} * evt - {<OpenLayers.Event>}
*/ */
getInfoForClick: function(evt) { getInfoForClick: function(evt) {
this.events.triggerEvent("beforegetfeatureinfo", {xy: evt.xy}); this.events.triggerEvent("beforegetfeatureinfo", {xy: evt.xy});
@@ -233,7 +235,7 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait"); OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait");
this.request(evt.xy, {}); this.request(evt.xy, {});
}, },
/** /**
* Method: getInfoForHover * Method: getInfoForHover
* Pause callback for the hover handler * Pause callback for the hover handler
@@ -284,7 +286,7 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
} }
return layers; return layers;
}, },
/** /**
* Method: urlMatches * Method: urlMatches
* Test to see if the provided url matches either the control <url> or one * Test to see if the provided url matches either the control <url> or one
@@ -383,7 +385,7 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
* Method: getStyleNames * Method: getStyleNames
* Gets the STYLES parameter for the layer. Make sure the STYLES parameter * Gets the STYLES parameter for the layer. Make sure the STYLES parameter
* matches the LAYERS parameter * matches the LAYERS parameter
* *
* Parameters: * Parameters:
* layer - {<OpenLayers.Layer.WMS>} * layer - {<OpenLayers.Layer.WMS>}
* *
@@ -411,12 +413,12 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
/** /**
* Method: request * Method: request
* Sends a GetFeatureInfo request to the WMS * Sends a GetFeatureInfo request to the WMS
* *
* Parameters: * Parameters:
* clickPosition - {<OpenLayers.Pixel>} The position on the map where the * clickPosition - {<OpenLayers.Pixel>} The position on the map where the
* mouse event occurred. * mouse event occurred.
* options - {Object} additional options for this method. * options - {Object} additional options for this method.
* *
* Valid options: * Valid options:
* - *hover* {Boolean} true if we do the request for the hover handler * - *hover* {Boolean} true if we do the request for the hover handler
*/ */
@@ -428,13 +430,13 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait"); OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
return; return;
} }
options = options || {}; options = options || {};
if(this.drillDown === false) { if(this.drillDown === false) {
var wmsOptions = this.buildWMSOptions(this.url, layers, var wmsOptions = this.buildWMSOptions(this.url, layers,
clickPosition, layers[0].params.FORMAT); clickPosition, layers[0].params.FORMAT);
var request = OpenLayers.Request.GET(wmsOptions); var request = OpenLayers.Request.GET(wmsOptions);
if (options.hover === true) { if (options.hover === true) {
this.hoverRequest = request; this.hoverRequest = request;
} }
@@ -458,9 +460,9 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
var layers; var layers;
for (var url in services) { for (var url in services) {
layers = services[url]; layers = services[url];
var wmsOptions = this.buildWMSOptions(url, layers, var wmsOptions = this.buildWMSOptions(url, layers,
clickPosition, layers[0].params.FORMAT); clickPosition, layers[0].params.FORMAT);
OpenLayers.Request.GET(wmsOptions); OpenLayers.Request.GET(wmsOptions);
} }
} }
}, },
@@ -488,11 +490,11 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
// Reset the cursor. // Reset the cursor.
OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait"); OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
}, },
/** /**
* Method: handleResponse * Method: handleResponse
* Handler for the GetFeatureInfo response. * Handler for the GetFeatureInfo response.
* *
* Parameters: * Parameters:
* xy - {<OpenLayers.Pixel>} The position on the map where the * xy - {<OpenLayers.Pixel>} The position on the map where the
* mouse event occurred. * mouse event occurred.
@@ -500,7 +502,7 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
* url - {String} The url which was used for this request. * url - {String} The url which was used for this request.
*/ */
handleResponse: function(xy, request, url) { handleResponse: function(xy, request, url) {
var doc = request.responseXML; var doc = request.responseXML;
if(!doc || !doc.documentElement) { if(!doc || !doc.documentElement) {
doc = request.responseText; doc = request.responseText;
@@ -518,7 +520,7 @@ OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
this._features = (this._features || []).concat(features); this._features = (this._features || []).concat(features);
} }
if (this._requestCount === this._numRequests) { if (this._requestCount === this._numRequests) {
this.triggerGetFeatureInfo(request, xy, this._features.concat()); this.triggerGetFeatureInfo(request, xy, this._features.concat());
delete this._features; delete this._features;
delete this._requestCount; delete this._requestCount;
delete this._numRequests; delete this._numRequests;

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -69,7 +69,8 @@ OpenLayers.Control.ZoomBox = OpenLayers.Class(OpenLayers.Control, {
*/ */
zoomBox: function (position) { zoomBox: function (position) {
if (position instanceof OpenLayers.Bounds) { if (position instanceof OpenLayers.Bounds) {
var bounds; var bounds,
targetCenterPx = position.getCenterPixel();
if (!this.out) { if (!this.out) {
var minXY = this.map.getLonLatFromPixel({ var minXY = this.map.getLonLatFromPixel({
x: position.left, x: position.left,
@@ -82,13 +83,12 @@ OpenLayers.Control.ZoomBox = OpenLayers.Class(OpenLayers.Control, {
bounds = new OpenLayers.Bounds(minXY.lon, minXY.lat, bounds = new OpenLayers.Bounds(minXY.lon, minXY.lat,
maxXY.lon, maxXY.lat); maxXY.lon, maxXY.lat);
} else { } else {
var pixWidth = Math.abs(position.right-position.left); var pixWidth = position.right - position.left;
var pixHeight = Math.abs(position.top-position.bottom); var pixHeight = position.bottom - position.top;
var zoomFactor = Math.min((this.map.size.h / pixHeight), var zoomFactor = Math.min((this.map.size.h / pixHeight),
(this.map.size.w / pixWidth)); (this.map.size.w / pixWidth));
var extent = this.map.getExtent(); var extent = this.map.getExtent();
var center = this.map.getLonLatFromPixel( var center = this.map.getLonLatFromPixel(targetCenterPx);
position.getCenterPixel());
var xmin = center.lon - (extent.getWidth()/2)*zoomFactor; var xmin = center.lon - (extent.getWidth()/2)*zoomFactor;
var xmax = center.lon + (extent.getWidth()/2)*zoomFactor; var xmax = center.lon + (extent.getWidth()/2)*zoomFactor;
var ymin = center.lat - (extent.getHeight()/2)*zoomFactor; var ymin = center.lat - (extent.getHeight()/2)*zoomFactor;
@@ -96,18 +96,27 @@ OpenLayers.Control.ZoomBox = OpenLayers.Class(OpenLayers.Control, {
bounds = new OpenLayers.Bounds(xmin, ymin, xmax, ymax); bounds = new OpenLayers.Bounds(xmin, ymin, xmax, ymax);
} }
// always zoom in/out // always zoom in/out
var lastZoom = this.map.getZoom(); var lastZoom = this.map.getZoom(),
this.map.zoomToExtent(bounds); size = this.map.getSize(),
centerPx = {x: size.w / 2, y: size.h / 2},
zoom = this.map.getZoomForExtent(bounds),
oldRes = this.map.getResolution(),
newRes = this.map.getResolutionForZoom(zoom),
zoomOriginPx = {
x: (oldRes * targetCenterPx.x - newRes * centerPx.x) /
(oldRes - newRes),
y: (oldRes * targetCenterPx.y - newRes * centerPx.y) /
(oldRes - newRes)
};
this.map.zoomTo(zoom, zoomOriginPx);
if (lastZoom == this.map.getZoom() && this.alwaysZoom == true){ if (lastZoom == this.map.getZoom() && this.alwaysZoom == true){
this.map.zoomTo(lastZoom + (this.out ? -1 : 1)); this.map.zoomTo(lastZoom + (this.out ? -1 : 1));
} }
} else if (this.zoomOnClick) { // it's a pixel } else if (this.zoomOnClick) { // it's a pixel
if (!this.out) { if (!this.out) {
this.map.setCenter(this.map.getLonLatFromPixel(position), this.map.zoomTo(this.map.getZoom() + 1, position);
this.map.getZoom() + 1);
} else { } else {
this.map.setCenter(this.map.getLonLatFromPixel(position), this.map.zoomTo(this.map.getZoom() - 1, position);
this.map.getZoom() - 1);
} }
} }
}, },

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -566,6 +566,7 @@ OpenLayers.Events = OpenLayers.Class({
this.listeners = {}; this.listeners = {};
this.extensions = {}; this.extensions = {};
this.extensionCount = {}; this.extensionCount = {};
this._msTouches = [];
// if a dom element is specified, add a listeners list // if a dom element is specified, add a listeners list
// for browser events on the element and register them // for browser events on the element and register them
@@ -632,11 +633,16 @@ OpenLayers.Events = OpenLayers.Class({
); );
} }
this.element = element; this.element = element;
var msTouch = !!window.navigator.msMaxTouchPoints;
var type;
for (var i = 0, len = this.BROWSER_EVENTS.length; i < len; i++) { for (var i = 0, len = this.BROWSER_EVENTS.length; i < len; i++) {
type = this.BROWSER_EVENTS[i];
// register the event cross-browser // register the event cross-browser
OpenLayers.Event.observe( OpenLayers.Event.observe(element, type, this.eventHandler
element, this.BROWSER_EVENTS[i], this.eventHandler
); );
if (msTouch && type.indexOf('touch') === 0) {
this.addMsTouchListener(element, type, this.eventHandler);
}
} }
// disable dragstart in IE so that mousedown/move/up works normally // disable dragstart in IE so that mousedown/move/up works normally
OpenLayers.Event.observe(element, "dragstart", OpenLayers.Event.stop); OpenLayers.Event.observe(element, "dragstart", OpenLayers.Event.stop);
@@ -1014,5 +1020,151 @@ OpenLayers.Events = OpenLayers.Class({
); );
}, },
/**
* Method: addMsTouchListener
*
* Parameters:
* element - {DOMElement} The DOM element to register the listener on
* type - {String} The event type
* handler - {Function} the handler
*/
addMsTouchListener: function (element, type, handler) {
var eventHandler = this.eventHandler;
var touches = this._msTouches;
function msHandler(evt) {
handler(OpenLayers.Util.applyDefaults({
stopPropagation: function() {
for (var i=touches.length-1; i>=0; --i) {
touches[i].stopPropagation();
}
},
preventDefault: function() {
for (var i=touches.length-1; i>=0; --i) {
touches[i].preventDefault();
}
},
type: type
}, evt));
}
switch (type) {
case 'touchstart':
return this.addMsTouchListenerStart(element, type, msHandler);
case 'touchend':
return this.addMsTouchListenerEnd(element, type, msHandler);
case 'touchmove':
return this.addMsTouchListenerMove(element, type, msHandler);
default:
throw 'Unknown touch event type';
}
},
/**
* Method: addMsTouchListenerStart
*
* Parameters:
* element - {DOMElement} The DOM element to register the listener on
* type - {String} The event type
* handler - {Function} the handler
*/
addMsTouchListenerStart: function(element, type, handler) {
var touches = this._msTouches;
var cb = function(e) {
var alreadyInArray = false;
for (var i=0, ii=touches.length; i<ii; ++i) {
if (touches[i].pointerId == e.pointerId) {
alreadyInArray = true;
break;
}
}
if (!alreadyInArray) {
touches.push(e);
}
e.touches = touches.slice();
handler(e);
};
OpenLayers.Event.observe(element, 'MSPointerDown', cb);
// Need to also listen for end events to keep the _msTouches list
// accurate
var internalCb = function(e) {
for (var i=0, ii=touches.length; i<ii; ++i) {
if (touches[i].pointerId == e.pointerId) {
touches.splice(i, 1);
break;
}
}
};
OpenLayers.Event.observe(element, 'MSPointerUp', internalCb);
},
/**
* Method: addMsTouchListenerMove
*
* Parameters:
* element - {DOMElement} The DOM element to register the listener on
* type - {String} The event type
* handler - {Function} the handler
*/
addMsTouchListenerMove: function (element, type, handler) {
var touches = this._msTouches;
var cb = function(e) {
//Don't fire touch moves when mouse isn't down
if (e.pointerType == e.MSPOINTER_TYPE_MOUSE && e.buttons == 0) {
return;
}
if (touches.length == 1 && touches[0].pageX == e.pageX &&
touches[0].pageY == e.pageY) {
// don't trigger event when pointer has not moved
return;
}
for (var i=0, ii=touches.length; i<ii; ++i) {
if (touches[i].pointerId == e.pointerId) {
touches[i] = e;
break;
}
}
e.touches = touches.slice();
handler(e);
};
OpenLayers.Event.observe(element, 'MSPointerMove', cb);
},
/**
* Method: addMsTouchListenerEnd
*
* Parameters:
* element - {DOMElement} The DOM element to register the listener on
* type - {String} The event type
* handler - {Function} the handler
*/
addMsTouchListenerEnd: function (element, type, handler) {
var touches = this._msTouches;
var cb = function(e) {
for (var i=0, ii=touches.length; i<ii; ++i) {
if (touches[i].pointerId == e.pointerId) {
touches.splice(i, 1);
break;
}
}
e.touches = touches.slice();
handler(e);
};
OpenLayers.Event.observe(element, 'MSPointerUp', cb);
},
CLASS_NAME: "OpenLayers.Events" CLASS_NAME: "OpenLayers.Events"
}); });

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -170,6 +170,12 @@ OpenLayers.Events.buttonclick = OpenLayers.Class({
} else if (this.startEvt) { } else if (this.startEvt) {
if (this.completeRegEx.test(evt.type)) { if (this.completeRegEx.test(evt.type)) {
var pos = OpenLayers.Util.pagePosition(button); var pos = OpenLayers.Util.pagePosition(button);
var viewportElement = OpenLayers.Util.getViewportElement();
var scrollTop = window.pageYOffset || viewportElement.scrollTop;
var scrollLeft = window.pageXOffset || viewportElement.scrollLeft;
pos[0] = pos[0] - scrollLeft;
pos[1] = pos[1] - scrollTop;
this.target.triggerEvent("buttonclick", { this.target.triggerEvent("buttonclick", {
buttonElement: button, buttonElement: button,
buttonXY: { buttonXY: {

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -422,7 +422,8 @@ OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
* labelSelect - {Boolean} If set to true, labels will be selectable using SelectFeature or similar controls. * labelSelect - {Boolean} If set to true, labels will be selectable using SelectFeature or similar controls.
* Default is false. * Default is false.
* labelOutlineColor - {String} The color of the label outline. Default is 'white'. Only supported by the canvas & SVG renderers. * labelOutlineColor - {String} The color of the label outline. Default is 'white'. Only supported by the canvas & SVG renderers.
* labelOutlineWidth - {Number} The width of the label outline. Default is 3, set to 0 or null to disable. Only supported by the canvas & SVG renderers. * labelOutlineWidth - {Number} The width of the label outline. Default is 3, set to 0 or null to disable. Only supported by the SVG renderers.
* labelOutlineOpacity - {Number} The opacity (0-1) of the label outline. Default is fontOpacity. Only supported by the canvas & SVG renderers.
* fontColor - {String} The font color for the label, to be provided like CSS. * fontColor - {String} The font color for the label, to be provided like CSS.
* fontOpacity - {Number} Opacity (0-1) for the label * fontOpacity - {Number} Opacity (0-1) for the label
* fontFamily - {String} The font family for the label, to be provided like in CSS. * fontFamily - {String} The font family for the label, to be provided like in CSS.

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -62,15 +62,16 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
else if (this.geometryType != "point" && this.geometryType != "polygon") else if (this.geometryType != "point" && this.geometryType != "polygon")
return null; return null;
var points = this.decode(encoded, 2); var flatPoints = this.decodeDeltas(encoded, 2);
var pointGeometries = new Array(); var flatPointsLength = flatPoints.length;
for (var i in points) {
var point = points[i]; var pointGeometries = [];
pointGeometries.push( for (var i = 0; i + 1 < flatPointsLength;) {
new OpenLayers.Geometry.Point(point[1] * 1e-5, point[0] * 1e-5) var y = flatPoints[i++], x = flatPoints[i++];
); pointGeometries.push(new OpenLayers.Geometry.Point(x, y));
} }
if (this.geometryType == "point") if (this.geometryType == "point")
return new OpenLayers.Feature.Vector( return new OpenLayers.Feature.Vector(
pointGeometries[0] pointGeometries[0]
@@ -102,29 +103,18 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
* coordinates. * coordinates.
*/ */
decode: function(encoded, dims) { decode: function(encoded, dims) {
var points = new Array(); var flatPoints = this.decodeDeltas(encoded, dims, 1);
var point = new Array(dims); var flatPointsLength = flatPoints.length;
// Reset the point array var points = [];
for (var i = 0; i < point.length; ++i) for (var i = 0; i + (dims - 1) < flatPointsLength;) {
point[i] = 0; var point = [];
for (var i = 0; i < encoded.length;) {
for (var dim = 0; dim < dims; ++dim) { for (var dim = 0; dim < dims; ++dim) {
var result = 0; point.push(flatPoints[i++])
var shift = 0;
var b;
do {
b = encoded.charCodeAt(i++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
point[dim] += ((result & 1) ? ~(result >> 1) : (result >> 1));
} }
points.push(point.slice(0)); points.push(point);
} }
return points; return points;
@@ -163,16 +153,16 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
else else
return null; return null;
var points = new Array(); var flatPoints = [];
for (var i in pointGeometries) {
var pointGeometriesLength = pointGeometries.length;
for (var i = 0; i < pointGeometriesLength; ++i) {
var pointGeometry = pointGeometries[i]; var pointGeometry = pointGeometries[i];
var point = [Math.round(pointGeometry.y * 1e5), flatPoints.push(pointGeometry.y);
Math.round(pointGeometry.x * 1e5)]; flatPoints.push(pointGeometry.x);
points.push(point);
} }
var result = this.encode(points, 2); return this.encodeDeltas(flatPoints, 2);
return result;
}, },
/** /**
@@ -188,66 +178,377 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
* {String} An encoded string * {String} An encoded string
*/ */
encode: function (points, dims) { encode: function (points, dims) {
var encoded_points = ""; var flatPoints = [];
var lastPoint = new Array(dims); var pointsLength = points.length;
for (var i = 0; i < lastPoint.length; ++i) for (var i = 0; i < pointsLength; ++i) {
lastPoint[i] = 0;
for (var i = 0; i < points.length; i++) {
var point = points[i]; var point = points[i];
for (var dim = 0; dim < lastPoint.length; ++dim) { for (var dim = 0; dim < dims; ++dim) {
var delta = point[dim] - lastPoint[dim]; flatPoints.push(point[dim]);
encoded_points += this.encodeSignedNumber(delta);
} }
lastPoint = point;
} }
return encoded_points;
return this.encodeDeltas(flatPoints, dims, 1);
}, },
/** /**
* Method: encodeSignedNumber * APIMethod: encodeDeltas
* Encode a list of n-dimensional points and return an encoded string
*
* Attention: This function will modify the passed array!
*
* Parameters:
* numbers - {Array.<number>} A list of n-dimensional points.
* dimension - {number} The dimension of the points in the list.
* opt_factor - {number=} The factor by which the numbers will be
* multiplied. The remaining decimal places will get rounded away.
*
* Returns:
* {string} The encoded string.
*/
encodeDeltas: function(numbers, dimension, opt_factor) {
var factor = opt_factor || 1e5;
var d;
var lastNumbers = new Array(dimension);
for (d = 0; d < dimension; ++d) {
lastNumbers[d] = 0;
}
var numbersLength = numbers.length;
for (var i = 0; i < numbersLength;) {
for (d = 0; d < dimension; ++d, ++i) {
var num = numbers[i];
var delta = num - lastNumbers[d];
lastNumbers[d] = num;
numbers[i] = delta;
}
}
return this.encodeFloats(numbers, factor);
},
/**
* APIMethod: decodeDeltas
* Decode a list of n-dimensional points from an encoded string
*
* Parameters:
* encoded - {string} An encoded string.
* dimension - {number} The dimension of the points in the encoded string.
* opt_factor - {number=} The factor by which the resulting numbers will
* be divided.
*
* Returns:
* {Array.<number>} A list of n-dimensional points.
*/
decodeDeltas: function(encoded, dimension, opt_factor) {
var factor = opt_factor || 1e5;
var d;
var lastNumbers = new Array(dimension);
for (d = 0; d < dimension; ++d) {
lastNumbers[d] = 0;
}
var numbers = this.decodeFloats(encoded, factor);
var numbersLength = numbers.length;
for (var i = 0; i < numbersLength;) {
for (d = 0; d < dimension; ++d, ++i) {
lastNumbers[d] += numbers[i];
numbers[i] = lastNumbers[d];
}
}
return numbers;
},
/**
* APIMethod: encodeFloats
* Encode a list of floating point numbers and return an encoded string
*
* Attention: This function will modify the passed array!
*
* Parameters:
* numbers - {Array.<number>} A list of floating point numbers.
* opt_factor - {number=} The factor by which the numbers will be
* multiplied. The remaining decimal places will get rounded away.
*
* Returns:
* {string} The encoded string.
*/
encodeFloats: function(numbers, opt_factor) {
var factor = opt_factor || 1e5;
var numbersLength = numbers.length;
for (var i = 0; i < numbersLength; ++i) {
numbers[i] = Math.round(numbers[i] * factor);
}
return this.encodeSignedIntegers(numbers);
},
/**
* APIMethod: decodeFloats
* Decode a list of floating point numbers from an encoded string
*
* Parameters:
* encoded - {string} An encoded string.
* opt_factor - {number=} The factor by which the result will be divided.
*
* Returns:
* {Array.<number>} A list of floating point numbers.
*/
decodeFloats: function(encoded, opt_factor) {
var factor = opt_factor || 1e5;
var numbers = this.decodeSignedIntegers(encoded);
var numbersLength = numbers.length;
for (var i = 0; i < numbersLength; ++i) {
numbers[i] /= factor;
}
return numbers;
},
/**
* APIMethod: encodeSignedIntegers
* Encode a list of signed integers and return an encoded string
*
* Attention: This function will modify the passed array!
*
* Parameters:
* numbers - {Array.<number>} A list of signed integers.
*
* Returns:
* {string} The encoded string.
*/
encodeSignedIntegers: function(numbers) {
var numbersLength = numbers.length;
for (var i = 0; i < numbersLength; ++i) {
var num = numbers[i];
var signedNum = num << 1;
if (num < 0) {
signedNum = ~(signedNum);
}
numbers[i] = signedNum;
}
return this.encodeUnsignedIntegers(numbers);
},
/**
* APIMethod: decodeSignedIntegers
* Decode a list of signed integers from an encoded string
*
* Parameters:
* encoded - {string} An encoded string.
*
* Returns:
* {Array.<number>} A list of signed integers.
*/
decodeSignedIntegers: function(encoded) {
var numbers = this.decodeUnsignedIntegers(encoded);
var numbersLength = numbers.length;
for (var i = 0; i < numbersLength; ++i) {
var num = numbers[i];
numbers[i] = (num & 1) ? ~(num >> 1) : (num >> 1);
}
return numbers;
},
/**
* APIMethod: encodeUnsignedIntegers
* Encode a list of unsigned integers and return an encoded string
*
* Parameters:
* numbers - {Array.<number>} A list of unsigned integers.
*
* Returns:
* {string} The encoded string.
*/
encodeUnsignedIntegers: function(numbers) {
var encoded = '';
var numbersLength = numbers.length;
for (var i = 0; i < numbersLength; ++i) {
encoded += this.encodeUnsignedInteger(numbers[i]);
}
return encoded;
},
/**
* APIMethod: decodeUnsignedIntegers
* Decode a list of unsigned integers from an encoded string
*
* Parameters:
* encoded - {string} An encoded string.
*
* Returns:
* {Array.<number>} A list of unsigned integers.
*/
decodeUnsignedIntegers: function(encoded) {
var numbers = [];
var current = 0;
var shift = 0;
var encodedLength = encoded.length;
for (var i = 0; i < encodedLength; ++i) {
var b = encoded.charCodeAt(i) - 63;
current |= (b & 0x1f) << shift;
if (b < 0x20) {
numbers.push(current);
current = 0;
shift = 0;
} else {
shift += 5;
}
}
return numbers;
},
/**
* Method: encodeFloat
* Encode one single floating point number and return an encoded string
*
* Parameters:
* num - {number} Floating point number that should be encoded.
* opt_factor - {number=} The factor by which num will be multiplied.
* The remaining decimal places will get rounded away.
*
* Returns:
* {string} The encoded string.
*/
encodeFloat: function(num, opt_factor) {
num = Math.round(num * (opt_factor || 1e5));
return this.encodeSignedInteger(num);
},
/**
* Method: decodeFloat
* Decode one single floating point number from an encoded string
*
* Parameters:
* encoded - {string} An encoded string.
* opt_factor - {number=} The factor by which the result will be divided.
*
* Returns:
* {number} The decoded floating point number.
*/
decodeFloat: function(encoded, opt_factor) {
var result = this.decodeSignedInteger(encoded);
return result / (opt_factor || 1e5);
},
/**
* Method: encodeSignedInteger
* Encode one single signed integer and return an encoded string * Encode one single signed integer and return an encoded string
* *
* Parameters: * Parameters:
* num - {int} A signed integer that should be encoded * num - {number} Signed integer that should be encoded.
* *
* Returns: * Returns:
* {String} An encoded string * {string} The encoded string.
*/ */
encodeSignedNumber: function (num) { encodeSignedInteger: function(num) {
var sgn_num = num << 1; var signedNum = num << 1;
if (num < 0) if (num < 0) {
sgn_num = ~(sgn_num); signedNum = ~(signedNum);
}
return this.encodeNumber(sgn_num); return this.encodeUnsignedInteger(signedNum);
}, },
/** /**
* Method: encodeNumber * Method: decodeSignedInteger
* Encode one single unsigned integer and return an encoded string * Decode one single signed integer from an encoded string
*
* encodeSignedNumber should be used instead of using this method directly!
* *
* Parameters: * Parameters:
* num - {int} An unsigned integer that should be encoded * encoded - {string} An encoded string.
* *
* Returns: * Returns:
* {String} An encoded string * {number} The decoded signed integer.
*/ */
encodeNumber: function (num) { decodeSignedInteger: function(encoded) {
var encodeString = ""; var result = this.decodeUnsignedInteger(encoded);
var value; return ((result & 1) ? ~(result >> 1) : (result >> 1));
while (num >= 0x20) { },
value = (0x20 | (num & 0x1f)) + 63;
encodeString += (String.fromCharCode(value));
num >>= 5; /**
} * Method: encodeUnsignedInteger
value = num + 63; * Encode one single unsigned integer and return an encoded string
encodeString += (String.fromCharCode(value)); *
return encodeString; * Parameters:
* num - {number} Unsigned integer that should be encoded.
*
* Returns:
* {string} The encoded string.
*/
encodeUnsignedInteger: function(num) {
var value, encoded = '';
while (num >= 0x20) {
value = (0x20 | (num & 0x1f)) + 63;
encoded += (String.fromCharCode(value));
num >>= 5;
}
value = num + 63;
encoded += (String.fromCharCode(value));
return encoded;
},
/**
* Method: decodeUnsignedInteger
* Decode one single unsigned integer from an encoded string
*
* Parameters:
* encoded - {string} An encoded string.
*
* Returns:
* {number} The decoded unsigned integer.
*/
decodeUnsignedInteger: function(encoded) {
var result = 0;
var shift = 0;
var encodedLength = encoded.length;
for (var i = 0; i < encodedLength; ++i) {
var b = encoded.charCodeAt(i) - 63;
result |= (b & 0x1f) << shift;
if (b < 0x20)
break;
shift += 5;
}
return result;
}, },
CLASS_NAME: "OpenLayers.Format.EncodedPolyline" CLASS_NAME: "OpenLayers.Format.EncodedPolyline"

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */
@@ -250,11 +250,11 @@ OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
*/ */
buildMetadataNode: function(metadata) { buildMetadataNode: function(metadata) {
var types = ['name', 'desc', 'author'], var types = ['name', 'desc', 'author'],
node = this.createElementNSPlus('gpx:metadata'); node = this.createElementNS(this.namespaces.gpx, 'metadata');
for (var i=0; i < types.length; i++) { for (var i=0; i < types.length; i++) {
var type = types[i]; var type = types[i];
if (metadata[type]) { if (metadata[type]) {
var n = this.createElementNSPlus("gpx:" + type); var n = this.createElementNS(this.namespaces.gpx, type);
n.appendChild(this.createTextNode(metadata[type])); n.appendChild(this.createTextNode(metadata[type]));
node.appendChild(n); node.appendChild(n);
} }
@@ -284,7 +284,7 @@ OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
this.appendAttributesNode(wpt, feature); this.appendAttributesNode(wpt, feature);
return wpt; return wpt;
} else { } else {
var trkNode = this.createElementNSPlus("gpx:trk"); var trkNode = this.createElementNS(this.namespaces.gpx, "trk");
this.appendAttributesNode(trkNode, feature); this.appendAttributesNode(trkNode, feature);
var trkSegNodes = this.buildTrkSegNode(geometry); var trkSegNodes = this.buildTrkSegNode(geometry);
trkSegNodes = OpenLayers.Util.isArray(trkSegNodes) ? trkSegNodes = OpenLayers.Util.isArray(trkSegNodes) ?
@@ -312,7 +312,7 @@ OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
nodes; nodes;
if (geometry.CLASS_NAME == "OpenLayers.Geometry.LineString" || if (geometry.CLASS_NAME == "OpenLayers.Geometry.LineString" ||
geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") { geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") {
node = this.createElementNSPlus("gpx:trkseg"); node = this.createElementNS(this.namespaces.gpx, "trkseg");
for (i = 0, len=geometry.components.length; i < len; i++) { for (i = 0, len=geometry.components.length; i < len; i++) {
point = geometry.components[i]; point = geometry.components[i];
node.appendChild(this.buildTrkPtNode(point)); node.appendChild(this.buildTrkPtNode(point));
@@ -338,7 +338,7 @@ OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
* {DOMElement} A trkpt node * {DOMElement} A trkpt node
*/ */
buildTrkPtNode: function(point) { buildTrkPtNode: function(point) {
var node = this.createElementNSPlus("gpx:trkpt"); var node = this.createElementNS(this.namespaces.gpx, "trkpt");
node.setAttribute("lon", point.x); node.setAttribute("lon", point.x);
node.setAttribute("lat", point.y); node.setAttribute("lat", point.y);
return node; return node;
@@ -355,7 +355,7 @@ OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
* {DOMElement} A wpt node * {DOMElement} A wpt node
*/ */
buildWptNode: function(geometry) { buildWptNode: function(geometry) {
var node = this.createElementNSPlus("gpx:wpt"); var node = this.createElementNS(this.namespaces.gpx, "wpt");
node.setAttribute("lon", geometry.x); node.setAttribute("lon", geometry.x);
node.setAttribute("lat", geometry.y); node.setAttribute("lat", geometry.y);
return node; return node;
@@ -370,11 +370,11 @@ OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
* feature - {<OpenLayers.Feature.Vector>} * feature - {<OpenLayers.Feature.Vector>}
*/ */
appendAttributesNode: function(node, feature) { appendAttributesNode: function(node, feature) {
var name = this.createElementNSPlus('gpx:name'); var name = this.createElementNS(this.namespaces.gpx, 'name');
name.appendChild(this.createTextNode( name.appendChild(this.createTextNode(
feature.attributes.name || feature.id)); feature.attributes.name || feature.id));
node.appendChild(name); node.appendChild(name);
var desc = this.createElementNSPlus('gpx:desc'); var desc = this.createElementNS(this.namespaces.gpx, 'desc');
desc.appendChild(this.createTextNode( desc.appendChild(this.createTextNode(
feature.attributes.description || this.defaultDesc)); feature.attributes.description || this.defaultDesc));
node.appendChild(desc); node.appendChild(desc);

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license. * full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the * See license.txt in the OpenLayers distribution or repository for the
* full text of the license. */ * full text of the license. */

Some files were not shown because too many files have changed in this diff Show More