diff options
Diffstat (limited to 'misc/openlayers/tests/Layer/ArcGISCache.html')
-rw-r--r-- | misc/openlayers/tests/Layer/ArcGISCache.html | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/misc/openlayers/tests/Layer/ArcGISCache.html b/misc/openlayers/tests/Layer/ArcGISCache.html new file mode 100644 index 0000000..b5ed5d5 --- /dev/null +++ b/misc/openlayers/tests/Layer/ArcGISCache.html @@ -0,0 +1,256 @@ +<html> +<head> + <script src="../../lib/OpenLayers.js"></script> + <script src="../../lib/OpenLayers/Layer/ArcGISCache.js" type="text/javascript"></script> + <script src="ArcGISCache.json" type="text/javascript"></script> + <script type="text/javascript"> + var isMozilla = (navigator.userAgent.indexOf("compatible") == -1); + var layer; + + var name = 'Test Layer'; + var url = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"; + var options = { }; + + function test_Layer_ARCGISCACHE_constructor (t) { + t.plan( 1 ); + + var layer = new OpenLayers.Layer.ArcGISCache(name, url, options); + t.ok( layer instanceof OpenLayers.Layer.ArcGISCache, "returns OpenLayers.Layer.ArcGISCache object" ); + } + + function test_Layer_ARCGISCACHE_autoConfigure (t) { + t.plan( 5 ); + var layerInfo = capabilitiesObject; + + //initialize the layer using the JSON object from an arcgis server + //SEE: ArcGISCache.json + var layer = new OpenLayers.Layer.ArcGISCache(name, url, { + layerInfo: layerInfo + }); + t.ok( layer instanceof OpenLayers.Layer.ArcGISCache, "returns OpenLayers.Layer.ArcGISCache object" ); + t.ok( layer.projection = 'EPSG:' + layerInfo.spatialReference.wkid, "projection is set correctly"); + t.ok( layer.units = 'm', "map units are set correctly"); + t.ok( layer.resolutions && layer.resolutions.length == 20, "resolutions are initialized from LOD objects properly"); + + if (layerInfo.tileInfo) { + if (layerInfo.tileInfo.width && layerInfo.tileInfo.height) { + var tileSize = new OpenLayers.Size(layerInfo.tileInfo.width, layerInfo.tileInfo.height); + t.ok((layer.tileSize.width == tileSize.width) && (layer.tileSize.height == tileSize.height), "tile size is set properly"); + } + else { + var tileSize = new OpenLayers.Size(layerInfo.tileInfo.cols, layerInfo.tileInfo.rows); + t.ok((layer.tileSize.width == tileSize.width) && (layer.tileSize.height == tileSize.height), "tile size is set properly"); + } + } + } + + /** + * lets make sure we're getting the correct urls back with a basic auto-configure setup + */ + function test_Layer_ARCGISCACHE_autoConfigure_URLS(t) { + var layerInfo = capabilitiesObject; + + //initialize the layer using the JSON object from an arcgis server + //SEE: ArcGISCache.json + var layer = new OpenLayers.Layer.ArcGISCache(name, url, { + layerInfo: layerInfo, + params: {foo: "bar"} + }); + var map = new OpenLayers.Map('map', { + maxExtent: layer.maxExtent, + units: layer.units, + resolutions: layer.resolutions, + numZoomLevels: layer.numZoomLevels, + tileSize: layer.tileSize, + projection: layer.displayProjection, + StartBounds: layer.initialExtent + }); + map.addLayers([layer]); + + //this set represents a few edge cases, and some more specific cases, it is by no means exhaustive, + var urlSets = [ + { + bounds: new OpenLayers.Bounds(-36787612.973083,-22463925.368666, 43362420.398053,17611091.316902), + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/0/0/0" + }, + { + bounds: new OpenLayers.Bounds(-31793889.951914,4589319.785415, 8281126.733654,24626828.128199), + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/1/0/0" + }, + { + bounds: new OpenLayers.Bounds(-24639873.181971,12676071.933457, -4602364.839187,22694826.104849), + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/2/0/0" + }, + { + bounds: new OpenLayers.Bounds(-15521241.455665,11580270.695961, 4516266.887119,21599024.867353), + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/2/0/1" + }, + { + bounds: new OpenLayers.Bounds(-9265879.5435993,2870892.9335638, -8639707.4078873,3183979.0014198) , + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/7/54/35" + }, + { + bounds: new OpenLayers.Bounds(-10741909.131798,4684560.1640365, -10585366.09787,4762831.6810005), + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/9/195/119" + }, + { + bounds: new OpenLayers.Bounds(-13668958.106938,4456961.2611504, -13512415.07301,4535232.7781144), + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/9/198/82" + } + ]; + + t.plan( urlSets.length ); + for(var i=0;i<urlSets.length;i++) + { + var o = urlSets[i]; + map.zoomToExtent(o.bounds, true); + + var resultUrl = layer.getURL(o.bounds); + t.ok( resultUrl == o.url + "?foo=bar", "correct tile returned for " + o.bounds); + } + } + + /** + * Test the formatting for the 'direct' urls, especially when not auto-configuring the layer + */ + function test_Layer_ARCGISCACHE_direct(t) { + var roadsUrl = 'http://serverx.esri.com/arcgiscache/DG_County_roads_yesA_backgroundDark/Layers/_alllayers'; + var urlSets = [ + { + bounds: new OpenLayers.Bounds(289244.67443386,4317153.7421985, 306178.04163392,4325620.4257985), + url: roadsUrl + "/L00/R0000029e/C0000027f.png" + }, + { + bounds: new OpenLayers.Bounds(308658.51534463,4303230.0164352, 325591.88254469,4311696.7000352), + url: roadsUrl + "/L00/R000002a0/C00000282.png" + }, + { + bounds: new OpenLayers.Bounds(311136.39626998,4318933.8711555, 311678.26402038,4319204.8050307) , + url: roadsUrl + "/L05/R000051e0/C00004e52.png" + } + ]; + t.plan( urlSets.length ); + + + //perform the exact setup from the arcgiscache_direct example + + // First 4 variables extracted from conf.xml file + // Tile layers & map MUST have same projection + var proj='EPSG:26915'; + + // Layer can also accept serverResolutions array + // to deal with situation in which layer resolution array & map resolution + // array are out of sync + var mapResolutions = [33.0729828126323,16.9333672000677,8.46668360003387,4.23334180001693,2.11667090000847,1.05833545000423]; + + // For this example this next line is not really needed, 256x256 is default. + // However, you would need to change this if your layer had different tile sizes + var tileSize = new OpenLayers.Size(256,256); + + // Tile Origin is required unless it is the same as the implicit map origin + // which can be effected by several variables including maxExtent for map or base layer + var agsTileOrigin = new OpenLayers.LonLat(-5120900,9998100); + + // This can really be any valid bounds that the map would reasonably be within + var mapExtent = new OpenLayers.Bounds(289310.8204,4300021.937,314710.8712,4325421.988); + + + var map = new OpenLayers.Map('map', { + maxExtent:mapExtent, + controls: [ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.LayerSwitcher(), + new OpenLayers.Control.PanZoomBar(), + new OpenLayers.Control.MousePosition()] + }); + + var layer = new OpenLayers.Layer.ArcGISCache('Roads', roadsUrl, { + tileOrigin: agsTileOrigin, + resolutions: mapResolutions, + sphericalMercator: true, + maxExtent: mapExtent, + useArcGISServer: false, + isBaseLayer: true, + projection: proj + }); + + map.addLayers([layer]); + map.zoomToExtent(new OpenLayers.Bounds(-8341644, 4711236, -8339198, 4712459)); + + for(var i=0;i<urlSets.length;i++) + { + var o = urlSets[i]; + map.zoomToExtent(o.bounds, true); + var resultUrl = layer.getURL(o.bounds); + t.ok( resultUrl == o.url, "correct tile returned for " + o.bounds); + } + } + + /** + * Check the utility function for generating tile indexes against a file cache + * This is already tested in BaseTypes test, but these are specific, + * common conversions that this class will rely on, so the tests are retained + */ + function test_Layer_ARCGISCACHE_zeroPad(t) { + t.plan(4); + + var layer = new OpenLayers.Layer.ArcGISCache('test', null, { }); + + //some tile examples + t.ok('00000001' == OpenLayers.Number.zeroPad(1, 8, 16), 'zeroPad should generate tile indexes properly '); + t.ok('00000020' == OpenLayers.Number.zeroPad(32, 8, 16), 'zeroPad should generate tile indexes properly '); + t.ok('00000100' == OpenLayers.Number.zeroPad(256, 8, 16), 'zeroPad should generate tile indexes properly '); + t.ok('00001000' == OpenLayers.Number.zeroPad(4096, 8, 16), 'zeroPad should generate tile indexes properly '); + } + + /** + * Check to ensure our LOD calculation will correctly avoid returning tile indexes less than zero + * (see http://trac.osgeo.org/openlayers/ticket/3169) + */ + function test_Layer_ARCGISCACHE_tileBounds(t) { + t.plan(1); + + var layer = new OpenLayers.Layer.ArcGISCache('test', null, { }); + var res = 264.583862501058; + layer.tileOrigin = new OpenLayers.LonLat(0.0, 650000.0); + layer.tileSize = new OpenLayers.Size(512, 512); + + // pick a point off the left of our tile origin (would be a negative tile index) + var point = new OpenLayers.Geometry.Point(-123308.94829, 393128.85817); + + var tile = layer.getContainingTileCoords(point, res); + t.ok((tile.x >= 0 && tile.y >= 0), 'layer should not generate negative tile ranges for level of detail'); + } + + /* + * Test that messing up the Array.prototype does not mess up the lods of the layer. + * This messes up zooming when resolutions are very small/scales are very large/zoomed way in. + */ + function test_Layer_ARCGISCACHE_lods (t) { + t.plan( 2 ); + var layerInfo = capabilitiesObject; + + lods = layerInfo.tileInfo.lods.length; + + // mess up the Array prototype + Array.prototype.foo = function() { }; + + t.ok( lods == layerInfo.tileInfo.lods.length, 'proper number of "Levels of Detail" before initialization' ); + + // initialize the layer using the JSON object from an arcgis server + // see: ArcGISCache.json + var layer = new OpenLayers.Layer.ArcGISCache(name, url, { + layerInfo: layerInfo + }); + + t.ok( lods == layer.lods.length, 'proper number of "Levels of Detail" after initialization.' ); + // restore the Array prototype + delete Array.prototype.foo; + } + + </script> +</head> +<body> +<div id="map" style="width:500px;height:550px;"></div> +</body> +</html> |