OpenStreetMapImageryProvider.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import Credit from '../Core/Credit.js';
  2. import defaultValue from '../Core/defaultValue.js';
  3. import defined from '../Core/defined.js';
  4. import DeveloperError from '../Core/DeveloperError.js';
  5. import Rectangle from '../Core/Rectangle.js';
  6. import Resource from '../Core/Resource.js';
  7. import WebMercatorTilingScheme from '../Core/WebMercatorTilingScheme.js';
  8. import UrlTemplateImageryProvider from './UrlTemplateImageryProvider.js';
  9. var defaultCredit = new Credit('MapQuest, Open Street Map and contributors, CC-BY-SA');
  10. /**
  11. * An imagery provider that provides tiled imagery hosted by OpenStreetMap
  12. * or another provider of Slippy tiles. The default url connects to OpenStreetMap's volunteer-run
  13. * servers, so you must conform to their
  14. * {@link http://wiki.openstreetmap.org/wiki/Tile_usage_policy|Tile Usage Policy}.
  15. *
  16. * @alias OpenStreetMapImageryProvider
  17. * @constructor
  18. *
  19. * @param {Object} [options] Object with the following properties:
  20. * @param {String} [options.url='https://a.tile.openstreetmap.org'] The OpenStreetMap server url.
  21. * @param {String} [options.fileExtension='png'] The file extension for images on the server.
  22. * @param {Rectangle} [options.rectangle=Rectangle.MAX_VALUE] The rectangle of the layer.
  23. * @param {Number} [options.minimumLevel=0] The minimum level-of-detail supported by the imagery provider.
  24. * @param {Number} [options.maximumLevel] The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit.
  25. * @param {Ellipsoid} [options.ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used.
  26. * @param {Credit|String} [options.credit='MapQuest, Open Street Map and contributors, CC-BY-SA'] A credit for the data source, which is displayed on the canvas.
  27. * @returns {UrlTemplateImageryProvider} The imagery provider.
  28. *
  29. * @exception {DeveloperError} The rectangle and minimumLevel indicate that there are more than four tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported.
  30. *
  31. * @see ArcGisMapServerImageryProvider
  32. * @see BingMapsImageryProvider
  33. * @see GoogleEarthEnterpriseMapsProvider
  34. * @see SingleTileImageryProvider
  35. * @see TileMapServiceImageryProvider
  36. * @see WebMapServiceImageryProvider
  37. * @see WebMapTileServiceImageryProvider
  38. * @see UrlTemplateImageryProvider
  39. *
  40. *
  41. * @example
  42. * var osm = new Cesium.OpenStreetMapImageryProvider({
  43. * url : 'https://a.tile.openstreetmap.org/'
  44. * });
  45. *
  46. * @see {@link http://wiki.openstreetmap.org/wiki/Main_Page|OpenStreetMap Wiki}
  47. * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
  48. */
  49. function OpenStreetMapImageryProvider(options) {
  50. options = defaultValue(options, defaultValue.EMPTY_OBJECT);
  51. var resource = Resource.createIfNeeded(defaultValue(options.url, 'https://a.tile.openstreetmap.org/'));
  52. resource.appendForwardSlash();
  53. resource.url += '{z}/{x}/{y}.' + defaultValue(options.fileExtension, 'png');
  54. var tilingScheme = new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid });
  55. var tileWidth = 256;
  56. var tileHeight = 256;
  57. var minimumLevel = defaultValue(options.minimumLevel, 0);
  58. var maximumLevel = options.maximumLevel;
  59. var rectangle = defaultValue(options.rectangle, tilingScheme.rectangle);
  60. // Check the number of tiles at the minimum level. If it's more than four,
  61. // throw an exception, because starting at the higher minimum
  62. // level will cause too many tiles to be downloaded and rendered.
  63. var swTile = tilingScheme.positionToTileXY(Rectangle.southwest(rectangle), minimumLevel);
  64. var neTile = tilingScheme.positionToTileXY(Rectangle.northeast(rectangle), minimumLevel);
  65. var tileCount = (Math.abs(neTile.x - swTile.x) + 1) * (Math.abs(neTile.y - swTile.y) + 1);
  66. //>>includeStart('debug', pragmas.debug);
  67. if (tileCount > 4) {
  68. throw new DeveloperError('The rectangle and minimumLevel indicate that there are ' + tileCount + ' tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported.');
  69. }
  70. //>>includeEnd('debug');
  71. var credit = defaultValue(options.credit, defaultCredit);
  72. if (typeof credit === 'string') {
  73. credit = new Credit(credit);
  74. }
  75. UrlTemplateImageryProvider.call(this, {
  76. url: resource,
  77. credit: credit,
  78. tilingScheme: tilingScheme,
  79. tileWidth: tileWidth,
  80. tileHeight: tileHeight,
  81. minimumLevel: minimumLevel,
  82. maximumLevel: maximumLevel,
  83. rectangle: rectangle
  84. });
  85. }
  86. if (defined(Object.create)) {
  87. OpenStreetMapImageryProvider.prototype = Object.create(UrlTemplateImageryProvider.prototype);
  88. OpenStreetMapImageryProvider.prototype.constructor = OpenStreetMapImageryProvider;
  89. }
  90. export default OpenStreetMapImageryProvider;