Cesium - 使用相机缩放多边形以匹配 Lat-Lon 位置,同时 zoom-in/zoom-out
Cesium - using camera to scale a polygon to match Lat-Lon positions while zoom-in/zoom-out
我正在努力使用相机功能(我认为)可以提供一种方法来强制我的多边形贴在我房子的顶部 缩小、放大, 和旋转(或相机移动)。
此问题跟在较早前 已解决的问题之后。现在我需要一些帮助来解决我的下一个问题。
我尝试遵循的示例代码位于 the gold standard that appears to be baked into the existing camera controller here。
pickGlobe 使用查看器参数、世界坐标中正确的 mousePosition 和结果参数执行,我现在不关心这些。 scene.pickPosition 取 c2position (Cartesian2) 并且应该 return scratchDepthIntersection (Cartesian3).相反,returned 值是 undefined.
这是我的代码:
function clickAction(click) {
var cartesian = scene.camera.pickEllipsoid(click.position, ellipsoid);
if (cartesian) {
var setCartographic = ellipsoid.cartesianToCartographic(cartesian);
collection.latlonalt.push(
Cesium.Math.toDegrees(setCartographic.latitude).toFixed(15),
Cesium.Math.toDegrees(setCartographic.longitude).toFixed(15),
Cesium.Math.toDegrees(setCartographic.height).toFixed(15)
);
lla.push(Cesium.Math.toDegrees(setCartographic.longitude), Cesium.Math.toDegrees(setCartographic.latitude));
if (lla.length >= 4) {
console.log((lla.length / 2) + ' Points Added');
}
enableDoubleClick();
enableDraw();
testMe(click.position); <--------------------- straight from the mouse click
}
}
var pickedPosition;
var scratchZoomPickRay = new Cesium.Ray();
var scratchPickCartesian = new Cesium.Cartesian3();
function testMe(c2MousePosition) { <--------------------- straight from the mouse click
if (Cesium.defined(scene.globe)) {
if(scene.mode !== Cesium.SceneMode.SCENE2D) {
pickedPosition = pickGlobe(viewer, c2MousePosition, scratchPickCartesian);
} else {
pickedPosition = camera.getPickRay(c2MousePosition, scratchZoomPickRay).origin;
}
}
}
var pickGlobeScratchRay = new Cesium.Ray();
var scratchRayIntersection = new Cesium.Cartesian3();
var c2position = new Cesium.Cartesian2();
function pickGlobe(viewer, c2MousePosition, result) { <--------------------- straight from the mouse click
c2position = c2MousePosition; <--------------------- setting to Cartesian2
var scratchDepthIntersection = new Cesium.Cartesian3();
if (scene.pickPositionSupported) {
scratchDepthIntersection = scene.pickPosition(c2MousePosition); <--------------------- neither works!
}
}
这是我的变量:
结果如下:
为了让这段代码正常工作,我提出以下问题:
1.为什么 scratchDepthIntersection 没有设置? c2position 是 Cartesian2,c2MousePosition 直接来自 mouse.click.position,scratchDepthIntersection 是新的 Cartesian3。
mousePosition
的正确值是包含 window 坐标的 Cartesian2
,而不是 Cartesian3
。这样的鼠标坐标通常来自 Cesium.ScreenSpaceEventHandler
的回调,但也可以从原生 JavaScript mouse/touch 事件构造。
如果您检查 mousePosition
的内容,您应该在 window 像素坐标中找到 x
和 y
值。
我看到你编辑了问题以包含 mousePosition
的内容,看起来鼠标坐标已经转换为椭圆体 Cartesian3
坐标,这将阻止此代码工作。您希望原始鼠标坐标直接进入 scene.pickPosition
才能正常工作。
我正在努力使用相机功能(我认为)可以提供一种方法来强制我的多边形贴在我房子的顶部 缩小、放大, 和旋转(或相机移动)。
此问题跟在较早前
我尝试遵循的示例代码位于 the gold standard that appears to be baked into the existing camera controller here。
pickGlobe 使用查看器参数、世界坐标中正确的 mousePosition 和结果参数执行,我现在不关心这些。 scene.pickPosition 取 c2position (Cartesian2) 并且应该 return scratchDepthIntersection (Cartesian3).相反,returned 值是 undefined.
这是我的代码:
function clickAction(click) {
var cartesian = scene.camera.pickEllipsoid(click.position, ellipsoid);
if (cartesian) {
var setCartographic = ellipsoid.cartesianToCartographic(cartesian);
collection.latlonalt.push(
Cesium.Math.toDegrees(setCartographic.latitude).toFixed(15),
Cesium.Math.toDegrees(setCartographic.longitude).toFixed(15),
Cesium.Math.toDegrees(setCartographic.height).toFixed(15)
);
lla.push(Cesium.Math.toDegrees(setCartographic.longitude), Cesium.Math.toDegrees(setCartographic.latitude));
if (lla.length >= 4) {
console.log((lla.length / 2) + ' Points Added');
}
enableDoubleClick();
enableDraw();
testMe(click.position); <--------------------- straight from the mouse click
}
}
var pickedPosition;
var scratchZoomPickRay = new Cesium.Ray();
var scratchPickCartesian = new Cesium.Cartesian3();
function testMe(c2MousePosition) { <--------------------- straight from the mouse click
if (Cesium.defined(scene.globe)) {
if(scene.mode !== Cesium.SceneMode.SCENE2D) {
pickedPosition = pickGlobe(viewer, c2MousePosition, scratchPickCartesian);
} else {
pickedPosition = camera.getPickRay(c2MousePosition, scratchZoomPickRay).origin;
}
}
}
var pickGlobeScratchRay = new Cesium.Ray();
var scratchRayIntersection = new Cesium.Cartesian3();
var c2position = new Cesium.Cartesian2();
function pickGlobe(viewer, c2MousePosition, result) { <--------------------- straight from the mouse click
c2position = c2MousePosition; <--------------------- setting to Cartesian2
var scratchDepthIntersection = new Cesium.Cartesian3();
if (scene.pickPositionSupported) {
scratchDepthIntersection = scene.pickPosition(c2MousePosition); <--------------------- neither works!
}
}
这是我的变量:
结果如下:
为了让这段代码正常工作,我提出以下问题:
1.为什么 scratchDepthIntersection 没有设置? c2position 是 Cartesian2,c2MousePosition 直接来自 mouse.click.position,scratchDepthIntersection 是新的 Cartesian3。
mousePosition
的正确值是包含 window 坐标的 Cartesian2
,而不是 Cartesian3
。这样的鼠标坐标通常来自 Cesium.ScreenSpaceEventHandler
的回调,但也可以从原生 JavaScript mouse/touch 事件构造。
如果您检查 mousePosition
的内容,您应该在 window 像素坐标中找到 x
和 y
值。
我看到你编辑了问题以包含 mousePosition
的内容,看起来鼠标坐标已经转换为椭圆体 Cartesian3
坐标,这将阻止此代码工作。您希望原始鼠标坐标直接进入 scene.pickPosition
才能正常工作。