Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // A simple demo of 3D Tiles feature picking with hover and select behavior
- // Building data courtesy of NYC OpenData portal: http://www1.nyc.gov/site/doitt/initiatives/3d-building.page
- const viewer = new Cesium.Viewer("cesiumContainer", {
- terrainProvider: Cesium.createWorldTerrain(),
- });
- // HTML overlay for showing feature name on mouseover
- const nameOverlay = document.createElement("div");
- viewer.container.appendChild(nameOverlay);
- nameOverlay.className = "backdrop";
- nameOverlay.style.display = "none";
- nameOverlay.style.position = "absolute";
- nameOverlay.style.bottom = "0";
- nameOverlay.style.left = "0";
- nameOverlay.style["pointer-events"] = "none";
- nameOverlay.style.padding = "4px";
- nameOverlay.style.backgroundColor = "black";
- let entity;
- let entity2;
- //положение entity
- const height=0;
- const position = Cesium.Cartesian3.fromDegrees(
- -123.0744619,
- 44.0503706,
- height,
- );
- //положение entity2
- const position2 = Cesium.Cartesian3.fromDegrees(
- -123.0745145,
- 44.05027029,
- height,
- );
- const heading = Cesium.Math.toRadians(135);
- const pitch = 0;
- const roll = 0;
- const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
- const orientation = Cesium.Transforms.headingPitchRollQuaternion(position,hpr);
- //entities
- entity = viewer.entities.add({
- position: position,
- orientation: orientation,
- model: {
- uri: "../SampleData/models/GroundVehicle/GroundVehicle.glb",
- maximumScale: 20000,
- },
- });
- entity2 = viewer.entities.add({
- position: position2,
- orientation: orientation,
- model: {
- uri: "../SampleData/models/GroundVehicle/GroundVehicle.glb",
- maximumScale: 20000,
- },
- });
- //buttons
- //move to entity
- Sandcastle.addToggleButton("entity", viewer.zoomTo(viewer.entities), function (
- checked
- ) {
- viewer.zoomTo(viewer.entities);
- });
- //move to entity2
- Sandcastle.addToggleButton("entity2", viewer.zoomTo(entity2), function (
- checked
- ) {
- viewer.zoomTo(entity2);
- });
- viewer.trackedEntity = entity;
- // Information about the currently selected feature
- const selected = {
- feature: undefined,
- originalColor: new Cesium.Color(),
- };
- // An entity object which will hold info about the currently selected feature for infobox display
- const selectedEntity = new Cesium.Entity();
- // Get default left click handler for when a feature is not picked on left click
- const clickHandler = viewer.screenSpaceEventHandler.getInputAction(
- Cesium.ScreenSpaceEventType.LEFT_CLICK
- );
- // If silhouettes are supported, silhouette features in blue on mouse over and silhouette green on mouse click.
- // If silhouettes are not supported, change the feature color to yellow on mouse over and green on mouse click.
- if (
- Cesium.PostProcessStageLibrary.isSilhouetteSupported(viewer.scene)
- ) {
- // Silhouettes are supported
- const silhouetteBlue = Cesium.PostProcessStageLibrary.createEdgeDetectionStage();
- silhouetteBlue.uniforms.color = Cesium.Color.BLUE;
- silhouetteBlue.uniforms.length = 0.01;
- silhouetteBlue.selected = [];
- const silhouetteGreen = Cesium.PostProcessStageLibrary.createEdgeDetectionStage();
- silhouetteGreen.uniforms.color = Cesium.Color.LIME;
- silhouetteGreen.uniforms.length = 0.01;
- silhouetteGreen.selected = [];
- viewer.scene.postProcessStages.add(
- Cesium.PostProcessStageLibrary.createSilhouetteStage([
- silhouetteBlue,
- silhouetteGreen,
- ])
- );
- // Silhouette a feature blue on hover.
- viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(
- movement
- ) {
- // If a feature was previously highlighted, undo the highlight
- silhouetteBlue.selected = [];
- // Pick a new feature
- const pickedFeature = viewer.scene.pick(movement.endPosition);
- if (!Cesium.defined(pickedFeature)) {
- nameOverlay.style.display = "none";
- return;
- }
- // A feature was picked, so show it's overlay content
- nameOverlay.style.display = "block";
- nameOverlay.style.bottom = `${
- viewer.canvas.clientHeight - movement.endPosition.y
- }px`;
- nameOverlay.style.left = `${movement.endPosition.x}px`;
- if (!Cesium.defined(pickedFeature) || !(pickedFeature instanceof Cesium.Cesium3DTileFeature)) {
- nameOverlay.style.display = 'none';
- return;
- }
- const name = pickedFeature.getProperty("BIN");
- nameOverlay.textContent = name;
- // Highlight the feature if it's not already selected.
- if (pickedFeature !== selected.feature) {
- silhouetteBlue.selected = [pickedFeature];
- }
- },
- Cesium.ScreenSpaceEventType.MOUSE_MOVE);
- // Silhouette a feature on selection and show metadata in the InfoBox.
- viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(
- movement
- ) {
- // If a feature was previously selected, undo the highlight
- silhouetteGreen.selected = [];
- // Pick a new feature
- const pickedFeature = viewer.scene.pick(movement.position);
- if (!Cesium.defined(pickedFeature)) {
- clickHandler(movement);
- return;
- }
- // Select the feature if it's not already selected
- if (silhouetteGreen.selected[0] === pickedFeature) {
- return;
- }
- // Save the selected feature's original color
- const highlightedFeature = silhouetteBlue.selected[0];
- if (pickedFeature === highlightedFeature) {
- silhouetteBlue.selected = [];
- }
- // Highlight newly selected feature
- silhouetteGreen.selected = [pickedFeature];
- // Set feature infobox description
- if (!Cesium.defined(pickedFeature) || !(pickedFeature instanceof Cesium.Cesium3DTileFeature)) {
- nameOverlay.style.display = 'none';
- return;
- }
- const featureName = pickedFeature.getProperty("name");
- selectedEntity.name = featureName;
- selectedEntity.description =
- 'Loading <div class="cesium-infoBox-loading"></div>';
- viewer.selectedEntity = selectedEntity;
- selectedEntity.description =
- `${
- '<table class="cesium-infoBox-defaultTable"><tbody>' +
- "<tr><th>BIN</th><td>"
- }${pickedFeature.getProperty("BIN")}</td></tr>` +
- `<tr><th>DOITT ID</th><td>${pickedFeature.getProperty(
- "DOITT_ID"
- )}</td></tr>` +
- `<tr><th>SOURCE ID</th><td>${pickedFeature.getProperty(
- "SOURCE_ID"
- )}</td></tr>` +
- `</tbody></table>`;
- },
- Cesium.ScreenSpaceEventType.LEFT_CLICK);
- } else {
- // Silhouettes are not supported. Instead, change the feature color.
- // Information about the currently highlighted feature
- const highlighted = {
- feature: undefined,
- originalColor: new Cesium.Color(),
- };
- // Color a feature yellow on hover.
- viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(
- movement
- ) {
- // If a feature was previously highlighted, undo the highlight
- if (Cesium.defined(highlighted.feature)) {
- highlighted.feature.color = highlighted.originalColor;
- highlighted.feature = undefined;
- }
- // Pick a new feature
- const pickedFeature = viewer.scene.pick(movement.endPosition);
- if (!Cesium.defined(pickedFeature)) {
- nameOverlay.style.display = "none";
- return;
- }
- // A feature was picked, so show it's overlay content
- nameOverlay.style.display = "block";
- nameOverlay.style.bottom = `${
- viewer.canvas.clientHeight - movement.endPosition.y
- }px`;
- nameOverlay.style.left = `${movement.endPosition.x}px`;
- let name = pickedFeature.getProperty("name");
- if (!Cesium.defined(name)) {
- name = pickedFeature.getProperty("id");
- }
- nameOverlay.textContent = name;
- // Highlight the feature if it's not already selected.
- if (pickedFeature !== selected.feature) {
- highlighted.feature = pickedFeature;
- Cesium.Color.clone(
- pickedFeature.color,
- highlighted.originalColor
- );
- pickedFeature.color = Cesium.Color.YELLOW;
- }
- },
- Cesium.ScreenSpaceEventType.MOUSE_MOVE);
- // Color a feature on selection and show metadata in the InfoBox.
- viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(
- movement
- ) {
- // If a feature was previously selected, undo the highlight
- if (Cesium.defined(selected.feature)) {
- selected.feature.color = selected.originalColor;
- selected.feature = undefined;
- }
- // Pick a new feature
- const pickedFeature = viewer.scene.pick(movement.position);
- if (!Cesium.defined(pickedFeature)) {
- clickHandler(movement);
- return;
- }
- // Select the feature if it's not already selected
- if (selected.feature === pickedFeature) {
- return;
- }
- selected.feature = pickedFeature;
- // Save the selected feature's original color
- if (pickedFeature === highlighted.feature) {
- Cesium.Color.clone(
- highlighted.originalColor,
- selected.originalColor
- );
- highlighted.feature = undefined;
- } else {
- Cesium.Color.clone(pickedFeature.color, selected.originalColor);
- }
- // Highlight newly selected feature
- pickedFeature.color = Cesium.Color.LIME;
- // Set feature infobox description
- const featureName = pickedFeature.getProperty("name");
- selectedEntity.name = featureName;
- selectedEntity.description =
- 'Loading <div class="cesium-infoBox-loading"></div>';
- viewer.selectedEntity = selectedEntity;
- selectedEntity.description =
- `${
- '<table class="cesium-infoBox-defaultTable"><tbody>' +
- "<tr><th>BIN</th><td>"
- }${pickedFeature.getProperty("BIN")}</td></tr>` +
- `<tr><th>DOITT ID</th><td>${pickedFeature.getProperty(
- "DOITT_ID"
- )}</td></tr>` +
- `<tr><th>SOURCE ID</th><td>${pickedFeature.getProperty(
- "SOURCE_ID"
- )}</td></tr>` +
- `<tr><th>Longitude</th><td>${pickedFeature.getProperty(
- "longitude"
- )}</td></tr>` +
- `<tr><th>Latitude</th><td>${pickedFeature.getProperty(
- "latitude"
- )}</td></tr>` +
- `<tr><th>Height</th><td>${pickedFeature.getProperty(
- "height"
- )}</td></tr>` +
- `<tr><th>Terrain Height (Ellipsoid)</th><td>${pickedFeature.getProperty(
- "TerrainHeight"
- )}</td></tr>` +
- `</tbody></table>`;
- },
- Cesium.ScreenSpaceEventType.LEFT_CLICK);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement