предисловие
В разработке нам обычно нужен чистый трехмерный экземпляр земли, который будет представлен в этой статье.Cesium
Как инициализировать глобус, включая отображение и скрытие элементов управления картой и загрузку некоторых общих изображений и меток.
Cesium — 3D-глобус и карта мирового класса.JavaScript
продукт с открытым исходным кодом, который обеспечиваетJavaScript
Комплект языковой разработки удобен для пользователей, чтобы быстро создать веб-приложение виртуальной земли без подключаемых модулей, и гарантирует высокое качество производительности, точности, качества рендеринга, многоплатформенности и простоты использования.
Чтобы узнать больше о цезии, см. 👉Упростите трехмерную визуализацию ГИС — знакомство с цезием
Строительство окружающей среды
Эта статья и последующие статьи запускают среду на основеVue-CLI3.X+
используя мой собственныйCLI
плагинvue-cli-plugin-cesium
Сборка с нулевой конфигурациейCesium
окружающая обстановка
Видна конструкция конкретной среды 👉Упростите трехмерную визуализацию ГИС — интегрируйте цезий в проект Vue
Инициализация Земли
Подать заявку на токен
Перед официальной разработкой нам сначала нужно зарегистрироваться на бесплатнуюCesium ion
учетная запись
Действуйте следующим образом
Во-первых, откройтеcesium.com/ion/Затем зарегистрируйте новый аккаунт
После успешной регистрации авторизуйтесь и нажмитеAccess Token
, перенаправить наAccess Tokens pageстраница
Как показано выше, выберитеDefaultПо умолчаниюaccess token
скопировать в контент
Cesium.Ion.defaultAccessToken = '<YOUR ACCESS TOKEN HERE>'
Конечно, если вы просто пишете демо, не пишитеToken
также
инициализация по умолчанию
После того, как среда готова, мы можем инициализировать экземпляр Cesium, который должен загрузить землю.
<template>
<div class="map-box">
<div id="cesiumContainer"></div>
</div>
</template>
<script>
var viewer = null
export default {
name: "No01Init",
data() {
return {}
},
mounted() {
Cesium.Ion.defaultAccessToken = '<YOUR ACCESS TOKEN HERE>'
// viewer = new Cesium.CesiumWidget('cesiumContainer')
viewer = new Cesium.Viewer("cesiumContainer")
console.log(viewer)
},
}
</script>
<style scoped>
.map-box {
width: 100%;
height: 100%;
}
#cesiumContainer {
width: 100%;
height: 100%;
}
</style>
Как показано выше, мы можем использоватьnew Cesium.CesiumWidget
илиnew Cesium.Viewer
Его можно инициализировать способом , можно смонтировать в контейнер, а эффект после запуска проекта следующий
Может быть осторожные друзья заметили, что мы инициализировалиviewer
экземпляр не прописанdata
, потому что Vue будетdata
Выполняется захват атрибута данных.Если атрибут является объектом, захват данных будет выполняться рекурсивно.viewer
Количество свойств в этом экземпляре очень велико, если разместить егоdata
середина. . . Конец только один, браузер вылетает
Мы можем поместить прямое объявление в компонентviewer
переменная, вы также можете использоватьwindow.viewer
Пучокviewer
подняться наwindow
выше, этой проблемы можно избежать
существуетVue + Cesium
Данные, относящиеся к экземпляру во время разработки, не должны помещаться в данные, это необходимо отметить.
Элементы управления скрыты
Как мы видим выше, в дефолтной инициализации на странице много элементов управления, которые мы принципиально не используем при разработке, но давайте сначала представим функции этих элементов управления
при созданииCesium
пример,new Cesium.Viewer
Конструктор имеет два параметра
- Требуется элемент, установленный экземпляром
- параметры инициализируют объект конфигурации необязательно
существуетoptions
В объекте мы можем настроить отображение и скрытие некоторых инициализированных элементов управления и некоторых конфигураций рендеринга.Вот некоторые часто используемые конфигурации.
viewer = new Cesium.Viewer("cesiumContainer", {
animation: false, // 隐藏动画控件
baseLayerPicker: false, // 隐藏图层选择控件
fullscreenButton: false, // 隐藏全屏按钮
vrButton: false, // 隐藏VR按钮,默认false
geocoder: false, // 隐藏地名查找控件
homeButton: false, // 隐藏Home按钮
infoBox: false, // 隐藏点击要素之后显示的信息窗口
sceneModePicker: false, // 隐藏场景模式选择控件
selectionIndicator: true, // 显示实体对象选择框,默认true
timeline: false, // 隐藏时间线控件
navigationHelpButton: false, // 隐藏帮助按钮
scene3DOnly: true, // 每个几何实例将只在3D中呈现,以节省GPU内存
shouldAnimate: true, // 开启动画自动播放
sceneMode: 3, // 初始场景模式 1:2D 2:2D循环 3:3D,默认3
requestRenderMode: true, // 减少Cesium渲染新帧总时间并减少Cesium在应用程序中总体CPU使用率
// 如场景中的元素没有随仿真时间变化,请考虑将设置maximumRenderTimeChange为较高的值,例如Infinity
maximumRenderTimeChange: Infinity
})
Мы используем вышеперечисленноеoptions
Конфигурация, вы можете скрыть все элементы управления на странице, как показано на следующем рисунке.
Видно, что хотя элементов управления уже нет, все же естьCesium
изlogo
Информация, нам не нужно показывать
// 隐藏下方Cesium logo
viewer.cesiumWidget.creditContainer.style.display = "none"
Как показано выше, еще одна строка дополнительной конфигурации, чтобы скрытьlogo
информация, вы можете получить экземпляр чистой земли, окончательный рендеринг выглядит следующим образом
загрузить изображение
Cesium
Поддерживает загрузку и рендеринг высокоточных данных изображения (карты) из нескольких сервисных источников, слои поддерживают сортировку и прозрачное смешивание, яркость, контрастность, гамму, оттенок каждого слоя), насыщенность можно динамически изменять
Здесь мы игнорируем детали, сначала кратко представим несколько классов, связанных с изображениями, а затем непосредственно напишем код для добавления некоторых различных часто используемых слоев изображений.
PS: Cesium — это конструктор, и у этого конструктора есть бесчисленное множество статических свойств.Они также являются конструкторами с разными функциями.Согласно пониманию ООП, Cesium — это родительский класс, и у него есть много подклассов для выполнения разных задач
Класс Cesium.ImageryProvider
Говоря об этом фрагменте изображения, прежде всего, мы должны понятьimageryProvider
Этот класс,Imagery
Его можно перевести в образы и образы, которые в совокупности именуются здесь изображениями.
ImageryProvider
Класс и его подклассы инкапсулируют методы загрузки различных слоев изображения, среди которыхCesium.ImageryProvider
Класс является абстрактным классом, базовым классом или может пониматься как интерфейс, он не может быть создан напрямую
могуImageryProvider
Рассматриваемый как источник данных слоя изображения, мы используем соответствующие данные слоя изображения или сервис, который мы хотим использовать.ImageryProvider
тип для загрузки
ImageryProvider
тип, который содержит класс
- ArcGisMapServerImageryProvider
- Связанные сервисы ArcGIS Online и Server
- BinaMapsImageryProvider
- Изображение карты Bing, вы можете указать mapStyle, подробности см. в классе BingMapsStyle.
- GoogleEarthEnterpriselmageryProvider
- Корпоративный сервис
- GridImageryProvider
- Визуализируйте сетку внутри каждой плитки, чтобы понять детализацию каждой плитки.
- IonImageryProvider
- Служба изображений, предоставляемая Cesium ion REST API
- MapboxImageryProvider
- Сервис изображений Mapbox, укажите стиль карты в соответствии с mapId
- MapboxStyleImageryProvider
- Сервис изображений Mapbox, укажите стиль карты в соответствии с styleId
- createOpenStreetMapImageryProvider
- Сервис изображений, предоставляемый OpenStreetMap
- SingleTilelmageryProvider
- Служба изображений для одного изображения, подходящая для автономных данных или сценариев, не требующих больших данных изображения.
- TileCoordinatesImageryProvider
- Визуализация окружения каждой плитки для облегчения отладки
- TileMapServicelmageryProvider
- Согласно спецификации MapTiler, вы можете загружать листы и публиковать сервисы самостоятельно, аналогично процессу сервисов изображений ArcGIS.
- UrlTemplateImageryProvider
- Укажите шаблон формата URL-адреса, который удобен пользователям для реализации собственного провайдера, например отечественных сервисов изображений, таких как AutoNavi, Tencent и т. д. URL-адрес представляет собой фиксированную спецификацию, которую можно легко реализовать через провайдера. И OSM тоже реализуется через этот класс
- WebMapServiceImageryProvider
- Сервисы изображений, соответствующие спецификации WMS, могут быть инкапсулированы с помощью этого класса и реализованы путем указания определенных параметров.
- WebMapTileServicelmageryProvider
- Сервисы изображений, которые обслуживают спецификацию WMTS1.0.0, могут быть реализованы с помощью этого класса, например, внутренняя карта звездного неба.
Класс Cesium.ImageryLayer
Вы знаете, аGIS
Данные будут организованы в слои для символизации и рендеринга.Данные эквивалентны внутренней крови и внутренним органам, и информация богата, а слои эквивалентны внешнему меху и одежде, которые используются для представления снаружи. Мир.
Cesium
Также организуйте источник данных по слоям, символизируйте и визуализируйте,Cesium.ImageryLayer
класс используется для представленияCesium
Это эквивалентно меху, одежде и обертываниям источника данных.Он нуждается в источнике данных, чтобы предоставить ему обширную геопространственную информацию и атрибутивную информацию.
Класс Cesium.ImageryLayerCollection
Cesium.ImageryLayerCollection
классImageryLayer
Контейнер экземпляра, он может загружать, размещать несколькоImageryLayer
экземпляр, и он помещаетImageryLayer
Экземпляры заказаны
Cesium.Viewer
содержится в объекте классаimageryLayers
собственностьImageryLayerCollection
Экземпляр класса, он содержит текущийCesium
приложение всеImageryLayer
объект класса, то есть все слои изображения, загруженные в данный момент на землю
Зная базовую архитектуру слоя изображения, загрузка изображения проста, как мы видим выше.ImageryProvider
Существует много типов классов, и они перечислены, чтобы показать вам, какие изображения они могут загружать, но продемонстрировать их по одному нереально, поэтому давайте рассмотрим несколько распространенных загрузок изображений.
Загрузить пример изображения
Загрузить изображение карты неба
Согласно вышеизложенному, сначала нам нужно загрузить источник данных слоя изображения, по умолчанию загружается Cesium Earth.bing
изображение карты, поэтому сначала мы удалим это изображение по умолчанию из контейнера.
viewer.imageryLayers.remove(viewer.imageryLayers.get(0))
Затем мы загружаем источник данных для слоя изображения.
let tianditu = new Cesium.WebMapTileServiceImageryProvider({
url:"http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=ebf64362215c081f8317203220f133eb",
layer: "tdtBasicLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false,
})
url
в полеtk
Чтобы предоставить токен для Tiantu, перейдите на официальный сайт Tiantu, чтобы зарегистрироваться и подать заявку на его получение.
Затем мы добавляем источник данных вImageryLayer
Контейнер класса может быть символизирован и отображен
Добавить источник данных вImageryLayer
Есть два способа символизировать и отображать контейнеры классов, первый — инициализироватьviewer
примерoptions
конфигурации, вы можете напрямуюoptions
объектimageryProvider
Вы можете разместить источник данных в свойствах
new Cesium.Viewer("cesiumContainer",{
imageryProvider: tianditu
})
Второй способ, используяviewer
примерimageryLayers
атрибутaddImageryProvider
способ добавить
let imagery = viewer.imageryLayers.addImageryProvider(tianditu)
Предварительный просмотр карты неба выглядит следующим образом.
загрузить изображения гугла
Вышеперечисленные шаги уже известны, мы не будем описывать их по одному, просто посмотрите на код непосредственно ниже
viewer.imageryLayers.remove(viewer.imageryLayers.get(0))
let imagery = viewer.imageryLayers.addImageryProvider(
new Cesium.UrlTemplateImageryProvider({
url: "http://mt1.google.cn/vt/lyrs=s&hl=zh-CN&x={x}&y={y}&z={z}&s=Gali",
baseLayerPicker : false
})
)
Предварительный просмотр изображения Google ниже
Загрузить изображения ArcGIS
viewer.imageryLayers.remove(viewer.imageryLayers.get(0))
let imagery = viewer.imageryLayers.addImageryProvider(
new Cesium.ArcGisMapServerImageryProvider({
url:'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer',
baseLayerPicker : false
})
)
Предварительный просмотр изображения ArcGIS выглядит следующим образом.
Загрузить изображение AutoNavi
viewer.imageryLayers.remove(viewer.imageryLayers.get(0))
let imagery = viewer.imageryLayers.addImageryProvider(
new Cesium.UrlTemplateImageryProvider({
maximumLevel:18,//最大缩放级别
url : 'https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
style: "default",
format: "image/png",
tileMatrixSetID: "GoogleMapsCompatible"
})
)
Предварительный просмотр изображения Gaode выглядит следующим образом.
Загрузка меток карты звездного неба
Загрузка вышеприведенного изображения, видно, что на карте нет метки, нам нужно загрузить дополнительные столбцы, то же самое, это тоже слой
let label = viewer.imageryLayers.addImageryProvider(
new Cesium.WebMapTileServiceImageryProvider({
url: "http://t0.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg"+"&tk="+"19b72f6cde5c8b49cf21ea2bb4c5b21e",
layer: "tdtAnnoLayer",
style: "default",
maximumLevel: 18, //天地图的最大缩放级别
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false,
})
)
Точно так же, как и с изображением Tiantu, не забудьте заменитьtk
ой
Предварительный просмотр карты неба выглядит следующим образом.
Регулировка яркости изображения
Мы загружаем изображение, чтобы получить экземпляр изображенияimagery
После этого можноbrightness
Атрибут для регулировки яркости, значение0~1
, по умолчанию 1
imagery.brightness = 0.9
Резюме видео
Мы перечислили вышеImageryProvider
Класс поддерживает множество подклассов, и в приведенном выше примере
При загрузке сервиса изображений AutoNavi мы используем указанныйurl
изformat
шаблон для реализации собственногоProvider
, поэтому используяUrlTemplateImageryProvider
класс для загрузки источника данных
загрузкаArcGIS
использованное изображениеArcGIS Server
сопутствующие услуги, поэтому используйтеArcGisMapServerImageryProvider
класс для загрузки источника данных
При загрузке изображения столбца, так как мы загружаем службу фрагментов веб-карты, т.е.WMTS
сервис, поэтому мы используемWebMapTileServiceImageryProvider
Добрый
Эти простые небольшие примеры должны сказать нам, какой источник данных мы используем, мы используем соответствующийImageryProvider
загрузить
Так как загрузка изображения в основном описана в этой статье, то там только как загружать, а соответствующих знаний о сервисах данных нет.Чтобы получить новый навык, сначала используйте его.Следующий этап - вычесть некоторые детали, затем использовать его , а затем происходит расширение, и, наконец, изучается принцип, а затем концептуальные вещи будут медленно расширяться посредством некоторого использования.
наконец
Оглядываясь назад на эту статью, инициализация экземпляра Cesium вращается вокруг загрузки чистого экземпляра 3D-земли.В этой статье мы в основном представляем скрытие реальности элементов управления Cesium и загрузку изображений.Вообще говоря, для украшения интерфейса мы пишем собственные элементы управления или скрыть их напрямую. , конечно, если элемент управления инициализацией Cesium имеет то, что вам нужно, но вы чувствуете, что стиль пространства по умолчанию не очень красив, на самом деле, мы можем изменить стиль самостоятельно, потому что элемент управления просто обычный узел элемента, вы можете напрямую выбрать элемент в консоли, изменить стиль соответствующего элемента управления через имя класса, чтобы добиться желаемого эффекта, я думаю, это не сложно для фронтенда
Пока мы сделали только загрузку земли и загрузку изображения.Для Цезия это только начало,а дальше веселее.На самом деле над разработкой Цезия работают не только люди,но и Передовые студенты, чтобы узнать эти вещи.Некоторые полезные могут многое добавить к вашей странице или проекту.Я напишу серию цезия в будущем.
Существует очень мало отечественных учебных пособий по цезию, и документы также на английском языке, поэтому начать работу непросто, поэтому эта серия представляет собой простое введение и создание некоторых эффектов (говоря прямо, она знакомит с простым использованием и некоторыми развлечениями). примеры), каждая статья вводит точку, это очень сложно. Она включает в себя основные принципы Cesium, потому что я тоже учусь. Глядя на личную ситуацию обучения в более поздний период, я хочу узнать, думаю ли я, что это весело. . .
It is really difficult to accumulate basic knowledge of GIS without professional knowledge. This series is updated from time to time, so we will arrange so many for the time being, insert it from time to time, and update it from time to time, so Следите за обновлениями
конец
Нелегко быть оригинальным. Прочитав ее, поставьте лайк и сформируйте привычку. Эта статья включена в GitHub. Чтобы узнать больше, смотрите 👉isboyjc/blog/issues
Если есть ошибки, указывайте, учитесь друг у друга, заранее спасибо, фронтендCesium
Накопление и совместное использование процесса обучения, глубины самопознания недостаточно, если вам это не нравится, не распыляйтесь