summaryrefslogtreecommitdiff
path: root/misc/openlayers/examples/ordering.html
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/examples/ordering.html')
-rw-r--r--misc/openlayers/examples/ordering.html221
1 files changed, 221 insertions, 0 deletions
diff --git a/misc/openlayers/examples/ordering.html b/misc/openlayers/examples/ordering.html
new file mode 100644
index 0000000..cb15d8e
--- /dev/null
+++ b/misc/openlayers/examples/ordering.html
@@ -0,0 +1,221 @@
+<!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>OpenLayers: Z-Ordering and Y-Ordering of Vector Features</title>
+ <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+ <link rel="stylesheet" href="style.css" type="text/css">
+ <style type="text/css">
+ .smallmap {
+ width: 300px;
+ }
+
+ .docs {
+ padding: 0px 5px;
+ }
+
+ td {
+ vertical-align: top;
+ }
+
+ </style>
+ <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+ <script type="text/javascript">
+
+ var GOLD_Z_INDEX = 15;
+ var FIRST_RED_Z_INDEX = 10;
+ var SECOND_RED_Z_INDEX = 11;
+
+ var RADIUS_FROM_CENTER = 40;
+ var POINT_DISTANCE = 10;
+
+ function initYOrderMap() {
+ var map = new OpenLayers.Map("yorder");
+
+ // allow testing of specific renderers via "?renderer=Canvas", etc
+ var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
+ renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
+
+ var layer = new OpenLayers.Layer.Vector(
+ "Y-Order",
+ {
+ styleMap: new OpenLayers.StyleMap({
+ externalGraphic: "../img/marker-gold.png",
+ pointRadius: 10,
+ graphicZIndex: GOLD_Z_INDEX
+ }),
+ isBaseLayer: true,
+ rendererOptions: {yOrdering: true},
+ renderers: renderer
+ }
+ );
+
+ map.addLayers([layer]);
+ map.zoomToMaxExtent();
+
+ // Add features to the layers to show off z-index/y-ordering.
+ // We do this after adding the layer so we can work in pixels.
+ var center = map.getViewPortPxFromLonLat(map.getCenter());
+
+ var top = new OpenLayers.Pixel(center.x, center.y - RADIUS_FROM_CENTER);
+ var bottom = new OpenLayers.Pixel(center.x, center.y + RADIUS_FROM_CENTER);
+ var left = new OpenLayers.Pixel(center.x - RADIUS_FROM_CENTER, center.y - POINT_DISTANCE / 2);
+ var right = new OpenLayers.Pixel(center.x + RADIUS_FROM_CENTER, center.y - POINT_DISTANCE / 2);
+
+ // Add the ordering features. These are the gold ones that all have the same z-index
+ // and succomb to y-ordering.
+ var orderingFeatures = [];
+ // Note: We use > here on purpose (instead of >= ), as well as subtracting the
+ // the POINT_DISTANCE in the beginning of the loop (as opposed to the end).
+ // This is purely for symmetry. Also note that the gold features are drawn
+ // from bottom to top so as to quickly signal whether or not y-ordering is working.
+ while (bottom.y > top.y) {
+ bottom.y -= POINT_DISTANCE;
+ var lonLat = map.getLonLatFromPixel(bottom);
+ orderingFeatures.push(
+ new OpenLayers.Feature.Vector(
+ new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat)
+ )
+ );
+ }
+
+ layer.addFeatures(orderingFeatures);
+
+ // Add the z-index features. Technically, these features succomb to y-ordering
+ // as well; however, since they have different z-indexes, the z-indexes take
+ // precedence.
+ var indexFeatures = [];
+ var useFirst = true;
+ while (left.x <= right.x) {
+ var lonLat = map.getLonLatFromPixel(left);
+ var point = new OpenLayers.Feature.Vector(
+ new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat)
+ );
+
+ // This is where the magic happens. We override the style on the layer
+ // to give our own style with alternativing z-indexes.
+ point.style = {
+ graphicZIndex: useFirst ? FIRST_RED_Z_INDEX : SECOND_RED_Z_INDEX,
+ externalGraphic: "../img/marker.png",
+ pointRadius: 10
+ };
+
+ indexFeatures.push(
+ point
+ );
+
+ left.x += POINT_DISTANCE;
+ useFirst = !useFirst;
+ }
+
+ layer.addFeatures(indexFeatures);
+ }
+
+ function initDrawingOrderMap() {
+ var map = new OpenLayers.Map("drawingorder");
+
+ var layer = new OpenLayers.Layer.Vector(
+ "Drawing Order",
+ {
+ // The zIndex is taken from the zIndex attribute of the features
+ styleMap: new OpenLayers.StyleMap({
+ graphicZIndex: "${zIndex}",
+ externalGraphic: "../img/marker-green.png",
+ pointRadius: 10
+ }),
+ isBaseLayer: true,
+ // enable the indexer by setting zIndexing to true
+ rendererOptions: {zIndexing: true}
+ }
+ );
+
+ map.addLayers([layer]);
+ map.zoomToMaxExtent();
+
+ // Add features to the layers to show off z-index/y-ordering.
+ // We do this after adding the layer so we can work in pixels.
+ var center = map.getViewPortPxFromLonLat(map.getCenter());
+
+ var top = new OpenLayers.Pixel(center.x, center.y - RADIUS_FROM_CENTER);
+ var bottom = new OpenLayers.Pixel(center.x, center.y + RADIUS_FROM_CENTER);
+ var left = new OpenLayers.Pixel(center.x - RADIUS_FROM_CENTER, center.y);
+ var right = new OpenLayers.Pixel(center.x + RADIUS_FROM_CENTER, center.y);
+
+ // Add the ordering features. These are the gold ones that all have the same z-index
+ // and succomb to y-ordering.
+ var orderingFeatures = [];
+ while (bottom.y > top.y && left.x < right.x) {
+ var bottomLonLat = map.getLonLatFromPixel(bottom);
+ var leftLonLat = map.getLonLatFromPixel(left);
+ orderingFeatures.push(
+ new OpenLayers.Feature.Vector(
+ new OpenLayers.Geometry.Point(leftLonLat.lon, bottomLonLat.lat),
+ // Set the zIndex attribute of all features to 0.
+ // This attribute will be assigned to the graphicZIndex symbolizer property by the layer's styleMap
+ {zIndex: 0}
+ )
+ );
+ bottom.y -= POINT_DISTANCE / 2; // Divide by 2 for better visual.
+ left.x += POINT_DISTANCE / 2;
+ }
+ // only the first feature gets a zIndex attribute of 1
+ orderingFeatures[0].attributes.zIndex = 1;
+
+ layer.addFeatures(orderingFeatures);
+ }
+
+ function init(){
+ initYOrderMap();
+ initDrawingOrderMap();
+ };
+
+ </script>
+ </head>
+ <body onload="init()">
+ <h1 id="title">Z-Index/Y-Order Example</h1>
+
+ <div id="tags">
+ stack, stacking, zindex, ordering, light
+ </div>
+
+ <p id="shortdesc">
+ This example shows the use of z-indexing and y-ordering of external graphics. Zoom in and out to see this behavior.
+ </p>
+
+ <h3>Z-Index (with Y-Ordering enabled)</h3>
+ <table>
+ <tr>
+ <td>
+ <div id="yorder" class="smallmap"></div>
+ </td>
+ <td>
+ <div class="docs">
+ In this map, the gold features all have the same z-index, and the red features have alternating z-indeces. The gold features' z-index is greater than the red features' z-indeces, which is why gold features look to be drawn on top of the red features. Since each gold feature has the same z-index, gold features succomb to y-ordering: this is where features that seem closest to the viewer (lower lattitude) show up above those that seem farther away (higher lattitude).
+ <br><br>
+ You can enable y-ordering by passing the parameter <i>yOrdering: true</i> in the vector layer's options hash. For all configurations (with yOrdering or zIndexing set to true), if features have the same z-index -- and if y-ordering is enabled: the same latitude -- those features will succomb to drawing order, where the last feature to be drawn will appear above the rest.
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <h3>Z-Index and Drawing Order (Z-Indexes set, and Y-Ordering disabled)</h3>
+ <table>
+ <tr>
+ <td>
+ <div id="drawingorder" class="smallmap"></div>
+ </td>
+ <td>
+ <div class="docs">
+ In this map, <i>zIndexing</i> is set to true. All features are given the same z-index (0), except for the first feature which has a z-index of 1. The layer's <i>yOrdering</i> parameter is set to the default (false). This configuration makes features succomb to z-index and drawing order (for the features with the same z-index), instead of y-order.
+ <br><br>
+ The features in this map were drawn from left to right and bottom to top, diagonally, to show that y-ordering is not enabled. Only the lower-left corner feature is drawn on top of the others, because it has a higher z-index (1 instead of 0).
+ </div>
+ </td>
+ </tr>
+ </table>
+
+
+ </body>
+</html>