С помощью чего лучше cделать Глобус+карту на веб странице?
1,00
р.
р.
Стоит задача: Вращающийся 3d глобус, с отмеченными на нем метками в виде точек с подписями(например Москва, Англия и т.д.). Они должны подгружаться из списка в файле cities. При клике на него (Глобус) он должен трансформироваться в 2d карту с такими же метками, но именно в этой проекции при наведении на метку будет появляться подпись метки (в виде например количество населения и краткого списка архитектурных особенностей). Так же при клике на метку или же на имя города чтоб перенаправляло на нужную страницу. С помощью чего это лучше делать? SVG Canvas Ни с Canvas, ни с SVG ранее не работал. Начал изучать canvas но столкнулся с тем что он не сможет обеспечить все что мне нужно. Примеров с глобусом нашел великое множество но нормальной документации не нашел (на нее тоже пните пожалуйста).
Ответ Есть много open source глобусов/карт для WEB, сделанных разными компаниями для разных целей. Перечислю те, с которыми приходилось работать, а вы уж выбирайте:
Cesium Очень большой по количеству исходного кода и абстракций глобус, он больше ориентирован на realtime rendering. Очень много чего умеет из коробки, но без знаний компьютерной графики с ним может оказаться сложновато. Часто используется и можно найти много примеров про него. Хорошо утилизирует ресурсы процессора и видеокарты, в следствие чего его производительность на высоте.
2d/3d var extent = Cesium.Rectangle.fromDegrees(20.3,50,40.3,70) Cesium.Camera.DEFAULT_VIEW_RECTANGLE = extent Cesium.Camera.DEFAULT_VIEW_FACTOR = 0 var viewer = new Cesium.CesiumWidget('cesiumContainer',{ imageryProvider : Cesium.createOpenStreetMapImageryProvider({ url: 'https://a.tile.openstreetmap.org/' }), }) var scene = viewer.scene var billboards = scene.primitives.add(new Cesium.BillboardCollection()) var canvas = document.createElement('canvas') canvas.width = 16 canvas.height = 16 var ctx = canvas.getContext('2d') ctx.beginPath() ctx.arc(5, 5, 5, 0, Cesium.Math.TWO_PI, true) ctx.closePath() ctx.fillStyle = 'red' ctx.fill() billboards.add({ image: canvas, position: Cesium.Cartesian3.fromDegrees(30.3,60) }) var labels = new Cesium.LabelCollection() labels.add({ position: Cesium.Cartesian3.fromDegrees(30.3,60), text: 'Saint-Petersburg', font: '15px Helvetica', fillColor: new Cesium.Color(0, 0, 0), }) scene.primitives.add(labels) let is2d document.querySelector('button').onclick = () => { scene.mode = (is2d = !is2d) ? Cesium.SceneMode.SCENE2D : Cesium.SceneMode.SCENE3D }
Web World Wind Тоже глобус, намного проще внутри, помедленнее работает, чем Cesium, меньше реализованных фишек, легче поддаётся пониманию и кастомизации. Работает в один поток, вычисления на видеокарте не ускоряет, почти не использует шейдеры.
let c = document.getElementById('canvasOne') c.width = window.innerWidth c.height = window.innerHeight var wwd = new WorldWind.WorldWindow("canvasOne") wwd.addLayer(new WorldWind.AtmosphereLayer()) wwd.addLayer(new WorldWind.BingAerialWithLabelsLayer()) var markers = new WorldWind.RenderableLayer("Markers") wwd.addLayer(markers) var attributes = new WorldWind.PlacemarkAttributes() var position = new WorldWind.Location(60, 30) var placemark = new WorldWind.Placemark(position, /*eyeDistanceScaling*/true, attributes) attributes.imageOffset = new WorldWind.Offset( WorldWind.OFFSET_FRACTION, 0.3, WorldWind.OFFSET_FRACTION, 0.0) attributes.labelAttributes.color = WorldWind.Color.YELLOW attributes.labelAttributes.offset = new WorldWind.Offset( WorldWind.OFFSET_FRACTION, 0.5, WorldWind.OFFSET_FRACTION, 1.0) placemark.label = "Saint-Petersburg" placemark.altitudeMode = WorldWind.CLAMP_TO_GROUND placemark.eyeDistanceScalingThreshold = 2500000 attributes.imageSource = WorldWind.configuration.baseUrl + "images/pushpins/plain-red.png" markers.addRenderable(placemark) body { margin:0 overflow:hidden }
D3.js Очень мощная штука, больше подходит для SVG, но и по-другому можно отрендерить, содержит математику для множества географических проекций и их расширения, отлично подходит для создания 2D карт и карт во всяких экстравагантных проекциях, отличных от mercator/wgs84, которые используются почти во всех других картографических движках.