Я ищу цезиевого гуру, который немного поможет мне найти то, что мне нужно. Я новичок в Cesium, но я работал с учебными пособиями и некоторым существующим кодом, который я унаследовал.
В моем приложении Cesium я ввожу свой адрес, и вид приближается к моей улице. Ура! Затем я увеличиваю масштаб, чтобы нарисовать многоугольник вокруг своего дома. Существующий код делает это очень хорошо. Однако когда я уменьшаю, а затем снова увеличиваю масштаб, мой многоугольник не соответствует положению моего дома по широте и долготе.
Содержит ли Cesium утилиту для масштабирования пикселей по координатам широты и долготы, или мне нужно использовать что-то вроде distanceToBoundingSphere (boundingSphere) и рассчитывать его самостоятельно? Мне нужны только координаты x, y; Меня вообще не волнует рост.
Я искал демонстрации и обучающие программы и до сих пор не нашел того, что, как мне кажется, ищу. Возможно, я нашел что-то близкое, но я еще не знаю достаточно, чтобы знать, нашел я это или нет. Помощь!
============================ КОД ================== ================
Сбор позиций для многоугольника:
SingleClick фиксирует только координаты этой точки и рисует ломаную линию, когда пользователь перетаскивает мышь к новой точке. Следовательно, набор полилиний и набор координат для каждой точки.
positionHandler.setInputAction(function (click) {
cartesian = scene.camera.pickEllipsoid(click.position, ellipsoid);
if (cartesian) {
var setCartographic = ellipsoid.cartesianToCartographic(cartesian);
asset.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) {
self.loggingMessage((lla.length / 2) + ' Points Added');
}
Cesium.sampleTerrain(terrainProvider, 11, [cartographic])
.then(function (updatedPositions) {
asset.latlonalt[2] = updatedPositions[0].height;
stage = 1;
});
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
Затем doubleClick берет координаты, записанные в функции singleClick, и вызывает self.createAsset ('add', asset) для создания многоугольника.
positionHandler.setInputAction(function (doubleClick){
if (asset.shape == 'Polygon') {
var len = asset.latlonalt.length;
if(len > 9) {
asset.rad = (len / 3);
console.log("Creating Asset");
self.loggingMessage("Creating Asset");
socket.emit('newElement', asset.cType, asset);
self.createAsset('add', asset);
viewer.entities.remove(entity);
viewer.entities.remove(newCircle);
viewer.entities.remove(newPolygon);
viewer.entities.remove(newOutline);
positionHandler = positionHandler && positionHandler.destroy();
}else{
console.log('3+ Positions Required');
loggingMessage('3+ Positions Required.');
}
}
}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)
Создание многоугольника:
var newPolygon = viewer.entities.add({
name : asset.id,
polygon : {
hierarchy : Cesium.Cartesian3.fromDegreesArray(vertices),
material : rgba[0],
outline : true,
outlineColor : rgba[1]
}
});
var newLabel = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(asset.latlonalt[1], asset.latlonalt[0], 1000),
name: asset.id,
label: {
text: asset.name,
font : '16px Helvetica'
}
});
var newPoint = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(asset.latlonalt[1], asset.latlonalt[0], 0),
name: asset.id,
point : {
pixelSize : 5,
color : Cesium.Color.RED,
outlineColor : Cesium.Color.RED,
outlineWidth : 2
}
});
self.currentGeometry[asset.id] = {shape: newPolygon, label: newLabel, point: newPoint};
Похоже, мы используем Terrain (я думаю).
Какие числа меня должны интересовать:
Когда координаты собираются, только первые z не нули:
Я беру это значение и заполняю другие значения z:
Теперь, когда я добавил значения z, в методе createAsset что-то не так. Мне нужно отследить эту проблему, чтобы увидеть результаты. Прямо сейчас это выглядит так:
ДЕЙСТВИТЕЛЬНО БОЛЬШОЙ, и очертания не удаляются.
sampleTerrain
, это что-то исправило? - person emackey   schedule 12.03.2016