| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- /**
- * @Author: Caven
- * @Date: 2021-01-31 19:22:04
- */
-
- import { Cesium } from '@dc-modules/namespace'
- import { CoordTransform } from '@dc-modules/transform'
- import BaiduMercatorProjection from '../projection/BaiduMercatorProjection'
-
- class BaiduMercatorTilingScheme extends Cesium.WebMercatorTilingScheme {
- constructor(options) {
- super(options)
- let projection = new BaiduMercatorProjection()
- this._projection.project = function(cartographic, result) {
- result = result || {}
- result = CoordTransform.WGS84ToGCJ02(
- Cesium.Math.toDegrees(cartographic.longitude),
- Cesium.Math.toDegrees(cartographic.latitude)
- )
- result = CoordTransform.GCJ02ToBD09(result[0], result[1])
- result[0] = Math.min(result[0], 180)
- result[0] = Math.max(result[0], -180)
- result[1] = Math.min(result[1], 74.000022)
- result[1] = Math.max(result[1], -71.988531)
- result = projection.lngLatToPoint({
- lng: result[0],
- lat: result[1]
- })
- return new Cesium.Cartesian2(result.x, result.y)
- }
- this._projection.unproject = function(cartesian, result) {
- result = result || {}
- result = projection.mercatorToLngLat({
- lng: cartesian.x,
- lat: cartesian.y
- })
- result = CoordTransform.BD09ToGCJ02(result.lng, result.lat)
- result = CoordTransform.GCJ02ToWGS84(result[0], result[1])
- return new Cesium.Cartographic(
- Cesium.Math.toRadians(result[0]),
- Cesium.Math.toRadians(result[1])
- )
- }
- this.resolutions = options.resolutions || []
- }
-
- /**
- *
- * @param x
- * @param y
- * @param level
- * @param result
- * @returns {module:cesium.Rectangle|*}
- */
- tileXYToNativeRectangle(x, y, level, result) {
- const tileWidth = this.resolutions[level]
- const west = x * tileWidth
- const east = (x + 1) * tileWidth
- const north = ((y = -y) + 1) * tileWidth
- const south = y * tileWidth
-
- if (!Cesium.defined(result)) {
- return new Cesium.Rectangle(west, south, east, north)
- }
-
- result.west = west
- result.south = south
- result.east = east
- result.north = north
- return result
- }
-
- /**
- *
- * @param position
- * @param level
- * @param result
- * @returns {undefined|*}
- */
- positionToTileXY(position, level, result) {
- const rectangle = this._rectangle
- if (!Cesium.Rectangle.contains(rectangle, position)) {
- return undefined
- }
- const projection = this._projection
- const webMercatorPosition = projection.project(position)
- if (!Cesium.defined(webMercatorPosition)) {
- return undefined
- }
- const tileWidth = this.resolutions[level]
- const xTileCoordinate = Math.floor(webMercatorPosition.x / tileWidth)
- const yTileCoordinate = -Math.floor(webMercatorPosition.y / tileWidth)
- if (!Cesium.defined(result)) {
- return new Cesium.Cartesian2(xTileCoordinate, yTileCoordinate)
- }
- result.x = xTileCoordinate
- result.y = yTileCoordinate
- return result
- }
- }
-
- export default BaiduMercatorTilingScheme
|