Skip to content

Commit

Permalink
fix: account for different corner coordinates #16
Browse files Browse the repository at this point in the history
  • Loading branch information
hongfaqiu committed Aug 2, 2023
1 parent 65a8986 commit ed9e928
Show file tree
Hide file tree
Showing 7 changed files with 438 additions and 166 deletions.
2 changes: 1 addition & 1 deletion example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"@types/react-color": "^3.0.6",
"@types/react-dom": "18.0.9",
"ahooks": "^3.7.2",
"cesium": "^1.100.0",
"cesium": "^1.108.0",
"classnames": "^2.3.2",
"d3-scale-chromatic": "^3.0.0",
"eslint": "8.30.0",
Expand Down
10 changes: 4 additions & 6 deletions example/src/utils/CesiumMap/CesiumMap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,7 @@ export default class CesiumMap extends BaseMap {
});
break;
case 'arcgis':
imageryProvider = new Cesium.ArcGisMapServerImageryProvider({
url,
imageryProvider = await Cesium.ArcGisMapServerImageryProvider.fromUrl(url, {
maximumLevel,
tilingScheme,
enablePickFeatures: false
Expand Down Expand Up @@ -285,7 +284,7 @@ export default class CesiumMap extends BaseMap {
};

// 加载地形数据
addTerrain(layer: Layer.TerrainLayer) {
async addTerrain(layer: Layer.TerrainLayer) {
const { type, headers, queryParameters, options } = layer;
let terrainLayer:
| Cesium.CesiumTerrainProvider
Expand All @@ -298,15 +297,14 @@ export default class CesiumMap extends BaseMap {
});
switch (type) {
case 'cesium':
terrainLayer = Cesium.createWorldTerrain({
terrainLayer = await Cesium.CesiumTerrainProvider.fromIonAssetId(1, {
requestVertexNormals: true,
...options,
});
break;
case 'custom':
if (!newUrl) break;
terrainLayer = new Cesium.CesiumTerrainProvider({
url: newUrl,
terrainLayer = await Cesium.CesiumTerrainProvider.fromUrl(newUrl, {
requestVertexNormals: true,
});
break;
Expand Down
2 changes: 1 addition & 1 deletion packages/TIFFImageryProvider/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"@rollup/plugin-node-resolve": "^15.0.1",
"@rollup/plugin-typescript": "^11.0.0",
"@types/offscreencanvas": "^2019.7.0",
"cesium": "^1.99.0",
"cesium": "^1.108.0",
"rollup": "^3.12.0",
"rollup-plugin-web-worker-loader": "^1.6.1",
"tslib": "^2.5.0",
Expand Down
23 changes: 12 additions & 11 deletions packages/TIFFImageryProvider/src/TIFFImageryProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,34 +151,35 @@ export class TIFFImageryProvider {
credit: Credit;
errorEvent: Event;
readyPromise: Promise<boolean>;
private _destroyed = false;
_source!: GeoTIFF;
private _imageCount!: number;
_images: (GeoTIFFImage | null)[] = [];
_imagesCache: Record<string, {
time: number;
data: ImageBitmap | HTMLCanvasElement | HTMLImageElement;
}> = {};
bands: Record<number, {
min: number;
max: number;
}>;
noData: number;
hasAlphaChannel: boolean;
private _workerFarm: WorkerFarm | null;
private _cacheTime: number;
plot: plot;
renderOptions: TIFFImageryProviderRenderOptions;
readSamples: number[];
requestLevels: number[];
private _isTiled: boolean;
bbox: number[];
private _destroyed = false;
private _source!: GeoTIFF;
private _imageCount!: number;
private _images: (GeoTIFFImage | null)[] = [];
private _imagesCache: Record<string, {
time: number;
data: ImageBitmap | HTMLCanvasElement | HTMLImageElement;
}> = {};
private _workerFarm: WorkerFarm | null;
private _cacheTime: number;
private _isTiled: boolean;
private _proj?: {
/** projection function, convert [lon, lat] position to EPSG:4326 */
project: (pos: number[]) => number[];
/** unprojection function */
unproject: (pos: number[]) => number[];
};

constructor(private readonly options: TIFFImageryProviderOptions & {
/**
* Deprecated
Expand Down
89 changes: 59 additions & 30 deletions packages/TIFFImageryProvider/src/TIFFImageryProviderTilingScheme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ import {
Math as CMath,
Rectangle,
WebMercatorTilingScheme,
} from 'cesium';

import {
Cartesian3,
Ellipsoid,
} from 'cesium';
Expand All @@ -18,42 +15,74 @@ class TIFFImageryProviderTilingScheme extends WebMercatorTilingScheme {
numberOfLevelZeroTilesY?: number;
rectangleSouthwestInMeters?: Cartesian2;
rectangleNortheastInMeters?: Cartesian2;
project?: (pos: number[]) => number[];
unproject?: (pos: number[]) => number[];
project: (pos: number[]) => number[];
unproject: (pos: number[]) => number[];
}) {
super(options);

const { project, unproject } = options;
if (project) {
// @ts-ignore
this._projection.project = function (cartographic: Cartographic) {
const [x, y] = unproject([cartographic.longitude, cartographic.latitude].map(CMath.toDegrees))
// @ts-ignore
this._ellipsoid = options.ellipsoid ?? Ellipsoid.WGS84;

// @ts-ignore
this._projection = {
ellipsoid: this.ellipsoid,
project(cartographic: Cartographic, result?: Cartesian3): Cartesian3 {
const [x, y] = unproject(
[cartographic.longitude, cartographic.latitude].map(
CMath.toDegrees
)
);
const z = cartographic.height;
return new Cartesian3(x, y, z);
};
}
if (unproject) {
// @ts-ignore
this._projection.unproject = function (cartesian: Cartesian3) {
const [longitude, latitude] = project([cartesian.x, cartesian.y]).map(CMath.toRadians)
return Cartesian3.fromElements(x, y, z, result);
},
unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic {
const [longitude, latitude] = project([cartesian.x, cartesian.y]);
const height = cartesian.z;
return new Cartographic(longitude, latitude, height);
};
}

const southwest = this.projection.unproject(
options.rectangleSouthwestInMeters as any
);
const northeast = this.projection.unproject(
options.rectangleNortheastInMeters as any
);
return Cartographic.fromDegrees(longitude, latitude, height, result);
}
};

const swMeters = new Cartesian3();
options.rectangleSouthwestInMeters.clone(swMeters);
const neMeters = new Cartesian3();
options.rectangleNortheastInMeters.clone(neMeters);
const seMeters = new Cartesian3(neMeters.x, swMeters.y);
const nwMeters = new Cartesian3(swMeters.x, neMeters.y);

const southwest = this.projection.unproject(swMeters);
const southeast = this.projection.unproject(seMeters);
const northwest = this.projection.unproject(nwMeters);
const northeast = this.projection.unproject(neMeters);

// @ts-ignore
this._rectangle = new Rectangle(
southwest.longitude,
southwest.latitude,
northeast.longitude,
northeast.latitude
Math.min(
southwest.longitude,
southeast.longitude,
northwest.longitude,
northeast.longitude
),
Math.min(
southwest.latitude,
southeast.latitude,
northwest.latitude,
northeast.latitude
),
Math.max(
southwest.longitude,
southeast.longitude,
northwest.longitude,
northeast.longitude
),
Math.max(
southwest.latitude,
southeast.latitude,
northwest.latitude,
northeast.latitude
)
);

}
}

Expand Down
Loading

0 comments on commit ed9e928

Please sign in to comment.