git-svn-id: http://svn.openlayers.org/trunk/openlayers@12270 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
254 lines
11 KiB
HTML
254 lines
11 KiB
HTML
<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
|
|
});
|
|
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, "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 our utility function for generating tile indexes against a file cache
|
|
*/
|
|
function test_Layer_ARCGISCACHE_zeroPad(t) {
|
|
t.plan(4);
|
|
|
|
var layer = new OpenLayers.Layer.ArcGISCache('test', null, { });
|
|
|
|
//some tile examples
|
|
t.ok('00000001' == layer.zeroPad(1, 8, 16), 'zeroPad should generate tile indexes properly ');
|
|
t.ok('00000020' == layer.zeroPad(32, 8, 16), 'zeroPad should generate tile indexes properly ');
|
|
t.ok('00000100' == layer.zeroPad(256, 8, 16), 'zeroPad should generate tile indexes properly ');
|
|
t.ok('00001000' == layer.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>
|