function YZWMS(options) {
|
options = Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT);
|
var mapServerUrl = options.url;
|
|
var resourceUrl =
|
mapServerUrl + "/WMTS?request=GetTile&Version=1.0.0&Service=WMTS";
|
var resource = Cesium.Resource.createIfNeeded(resourceUrl);
|
resource.appendForwardSlash();
|
|
this._resource = resource;
|
this._tileWidth = Cesium.defaultValue(options.tileWidth, 256);
|
this._tileHeight = Cesium.defaultValue(options.tileHeight, 256);
|
this._maximumLevel = 20;
|
this._tilingScheme = Cesium.defaultValue(
|
options.tilingScheme,
|
new Cesium.GeographicTilingScheme({ ellipsoid: options.ellipsoid })
|
);
|
this._rectangle = Cesium.defaultValue(
|
options.rectangle,
|
this._tilingScheme.rectangle
|
);
|
this._layer = options.layer;
|
this._style = options.style;
|
this._format = "image/png";
|
this.enablePickFeatures = Cesium.defaultValue(
|
options.enablePickFeatures,
|
true
|
);
|
this._ready = false;
|
this._readyPromise = Cesium.when.defer();
|
}
|
|
function pixels2Meters(p, zoom) {
|
return Double(p) * resolution(zoom) - originShift;
|
}
|
function titleBoundsBy(x, y, zoom) {
|
let minX = pixels2Meters(x * titleSize, zoom);
|
let maxY = -pixels2Meters(y * titleSize, zoom);
|
let maxX = pixels2Meters((x + 1) * titleSize, zoom);
|
let minY = -pixels2Meters((y + 1) * titleSize, zoom);
|
|
return "(minX),(minY),(maxX),(maxY)";
|
}
|
function resolution(zoom) {
|
return (2 * Math.PI * 6378137) / 256 / Math.pow(2.0, zoom);
|
}
|
function resolutionPoint(width, height, z) {
|
var s = (2 * Math.PI * 6378137) / 256 / Math.pow(2, z);
|
return [
|
width * s - (2 * Math.PI * 6378137) / 2,
|
height * s - (2 * Math.PI * 6378137) / 2
|
];
|
}
|
function requestImage(imageryProvider, col, row, level, request, interval) {
|
|
var labels = imageryProvider._tileMatrixLabels;
|
var tileMatrix = Cesium.defined(labels) ? labels[level] : level.toString();
|
var subdomains = imageryProvider._subdomains;
|
var staticDimensions = imageryProvider._dimensions;
|
var dynamicIntervalData = Cesium.defined(interval)
|
? interval.data
|
: undefined;
|
|
var resource;
|
|
var x = col;
|
var y = row;
|
var z = level;
|
y = Math.pow(2, z) - y - 1;
|
var minPoint = resolutionPoint(x * 256, y * 256, z);
|
var maxPoint = resolutionPoint((x + 1) * 256, (y + 1) * 256, z);
|
var bbox =
|
minPoint[0] + "," + minPoint[1] + "," + maxPoint[0] + "," + maxPoint[1];
|
|
// build KVP request
|
var query = {};
|
// query.tilematrix = tileMatrix;
|
// query.tilerow = row;
|
// query.tilecol = col;
|
query.bbox = bbox;
|
query.layer = imageryProvider._layer;
|
query.style = imageryProvider._style;
|
query.format = imageryProvider._format;
|
|
if (Cesium.defined(staticDimensions)) {
|
query = Cesium.combine(query, staticDimensions);
|
}
|
|
if (Cesium.defined(dynamicIntervalData)) {
|
query = Cesium.combine(query, dynamicIntervalData);
|
}
|
resource = imageryProvider._resource.getDerivedResource({
|
queryParameters: query,
|
request: request
|
});
|
|
return Cesium.ImageryProvider.loadImage(imageryProvider, resource);
|
}
|
function YZWMS_buildImageResource(imageryProvider, x, y, level, request) {
|
var resource;
|
if (imageryProvider._useTiles) {
|
resource = imageryProvider._resource.getDerivedResource({
|
url: "tile/" + level + "/" + y + "/" + x,
|
request: request
|
});
|
} else {
|
var nativeRectangle = imageryProvider._tilingScheme.tileXYToNativeRectangle(
|
x,
|
y,
|
level
|
);
|
var bbox =
|
nativeRectangle.west +
|
"," +
|
nativeRectangle.south +
|
"," +
|
nativeRectangle.east +
|
"," +
|
nativeRectangle.north;
|
|
var query = {
|
bbox: bbox,
|
size: imageryProvider._tileWidth + "," + imageryProvider._tileHeight,
|
format: "png32",
|
transparent: true,
|
f: "image"
|
};
|
|
query.bboxSR = 4326;
|
query.imageSR = 4326;
|
|
if (imageryProvider.layers) {
|
query.layers = "show:" + imageryProvider.layers;
|
}
|
|
resource = imageryProvider._resource.getDerivedResource({
|
url: "export",
|
request: request,
|
queryParameters: query
|
});
|
}
|
|
return resource;
|
}
|
Object.defineProperties(YZWMS.prototype, {
|
tileWidth: {
|
get: function() {
|
return this._tileWidth;
|
}
|
},
|
tileHeight: {
|
get: function() {
|
return this._tileHeight;
|
}
|
},
|
defaultAlpha: {
|
get: function() {
|
return 1;
|
}
|
},
|
hasAlphaChannel: {
|
get: function() {
|
return true;
|
}
|
},
|
maximumLevel: {
|
get: function() {
|
return this._maximumLevel;
|
}
|
},
|
minimumLevel: {
|
get: function() {
|
return this._minimumLevel;
|
}
|
},
|
tilingScheme: {
|
get: function() {
|
return this._tilingScheme;
|
}
|
},
|
rectangle: {
|
get: function() {
|
return this._rectangle;
|
}
|
},
|
ready: {
|
get: function() {
|
return true;
|
}
|
},
|
usingPrecachedTiles: {
|
get: function() {
|
return this._useTiles;
|
}
|
},
|
readyPromise: {
|
get: function() {
|
return this._readyPromise.promise;
|
}
|
},
|
minimumTerrainLevel: {
|
get: function() {
|
return 0;
|
}
|
},
|
maximumTerrainLevel: {
|
get: function() {
|
return 17;
|
}
|
}
|
});
|
YZWMS.prototype.requestImage = function(x, y, level, request) {
|
if (!this._ready) {
|
}
|
|
var result;
|
var currentInterval;
|
|
// Couldn't load from cache
|
if (!Cesium.defined(result)) {
|
result = requestImage(this, x, y, level, request, currentInterval);
|
}
|
|
return result;
|
};
|
|
YZWMS.prototype.pickFeatures = function(x, y, level, longitude, latitude) {
|
if (!this._ready) {
|
}
|
|
if (!this.enablePickFeatures) {
|
return undefined;
|
}
|
|
var rectangle = this._tilingScheme.tileXYToNativeRectangle(x, y, level);
|
|
var horizontal;
|
var vertical;
|
var sr;
|
if (this._tilingScheme.projection instanceof GeographicProjection) {
|
horizontal = CesiumMath.toDegrees(longitude);
|
vertical = CesiumMath.toDegrees(latitude);
|
sr = "4326";
|
} else {
|
var projected = this._tilingScheme.projection.project(
|
new Cartographic(longitude, latitude, 0.0)
|
);
|
horizontal = projected.x;
|
vertical = projected.y;
|
sr = "3857";
|
}
|
|
var layers = "visible";
|
if (defined(this._layer)) {
|
layers += ":" + this._layer;
|
}
|
|
var query = {
|
f: "json",
|
tolerance: 2,
|
geometryType: "esriGeometryPoint",
|
geometry: horizontal + "," + vertical,
|
mapExtent:
|
rectangle.west +
|
"," +
|
rectangle.south +
|
"," +
|
rectangle.east +
|
"," +
|
rectangle.north,
|
imageDisplay: this._tileWidth + "," + this._tileHeight + ",96",
|
sr: sr,
|
layers: layers
|
};
|
|
var resource = this._resource.getDerivedResource({
|
url: "identify",
|
queryParameters: query
|
});
|
|
return resource.fetchJson().then(function(json) {
|
var result = [];
|
|
var features = json.results;
|
if (!defined(features)) {
|
return result;
|
}
|
|
for (var i = 0; i < features.length; ++i) {
|
var feature = features[i];
|
|
var featureInfo = new ImageryLayerFeatureInfo();
|
featureInfo.data = feature;
|
featureInfo.name = feature.value;
|
featureInfo.properties = feature.attributes;
|
featureInfo.configureDescriptionFromProperties(feature.attributes);
|
|
// If this is a point feature, use the coordinates of the point.
|
if (feature.geometryType === "esriGeometryPoint" && feature.geometry) {
|
var wkid =
|
feature.geometry.spatialReference &&
|
feature.geometry.spatialReference.wkid
|
? feature.geometry.spatialReference.wkid
|
: 4326;
|
if (wkid === 4326 || wkid === 4283) {
|
featureInfo.position = Cartographic.fromDegrees(
|
feature.geometry.x,
|
feature.geometry.y,
|
feature.geometry.z
|
);
|
} else if (wkid === 102100 || wkid === 900913 || wkid === 3857) {
|
var projection = new WebMercatorProjection();
|
featureInfo.position = projection.unproject(
|
new Cartesian3(
|
feature.geometry.x,
|
feature.geometry.y,
|
feature.geometry.z
|
)
|
);
|
}
|
}
|
|
result.push(featureInfo);
|
}
|
|
return result;
|
});
|
};
|