网站上那些轮播图视频怎么做的前端和网站建设的区别
网站上那些轮播图视频怎么做的,前端和网站建设的区别,在哪个网站可以免费制作简历,云浮 网站建设1. 为什么你需要多源地图服务#xff1f;
如果你刚开始接触Cesium#xff0c;可能会觉得用默认的Bing Maps或者Cesium Ion的底图就挺好#xff0c;简单省事。但做过几个实际项目后#xff0c;我敢说#xff0c;你一定会遇到需要集成其他地图服务的场景。比如#xff0c;你…1. 为什么你需要多源地图服务如果你刚开始接触Cesium可能会觉得用默认的Bing Maps或者Cesium Ion的底图就挺好简单省事。但做过几个实际项目后我敢说你一定会遇到需要集成其他地图服务的场景。比如你的项目要求使用国内合规的、高精度的地图数据或者你需要一个完全免费且全球覆盖的底图又或者你的用户习惯了谷歌地图的样式。这时候只依赖单一地图源就显得捉襟见肘了。我自己在做一个智慧城市项目时就踩过坑。最初只用了一种底图结果在某个偏远区域数据更新不及时道路信息都是错的差点误导了客户。后来我学会了在Cesium里“混搭”不同的地图服务就像给地图应用装上了“多核引擎”哪里数据好用哪里灵活性和可靠性都大大提升。今天要聊的天地图、OSMOpenStreetMap和谷歌底图就是三种最主流、也最具代表性的选择。简单来说天地图是国内官方、权威的地理信息服务数据准确合规特别适合国内项目。OSM是全球志愿者协作的免费开源地图社区活跃细节丰富尤其在欧洲和城市区域表现很棒。谷歌底图则以其优秀的渲染效果、流畅的体验和丰富的图层类型如卫星、地形、混合模式著称是全球用户最熟悉的样式。把这三种服务集成到你的Cesium应用中基本上就能覆盖99%的业务需求了。接下来的内容我会手把手带你搞定这三种地图的加载从最基础的API调用到性能调优的“骚操作”再到实际项目中如何选择和切换。保证你跟着做一遍就能在自己的项目里用起来。2. 集成前的准备工作环境与密钥在开始写代码之前有几件“小事”必须准备好。磨刀不误砍柴工这些准备工作能让你后续的集成过程顺畅无比。2.1 搭建你的Cesium开发环境首先你得有一个能跑起来的Cesium项目。如果你已经有一个了可以跳过这步。对于新手我最推荐的方式是使用Cesium官方提供的cesium-starter模板用Vite或Webpack快速搭建。这里以Vite为例打开终端依次执行npm create vitelatest my-cesium-app -- --template vanilla cd my-cesium-app npm install cesium npm install安装完成后你需要把Cesium的静态资源拷贝到项目的public目录下或者配置构建工具来引用node_modules里的Cesium。更简单的方法是直接在HTML文件中通过CDN引入Cesium这对于快速原型开发特别方便!DOCTYPE html html langzh head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title我的多源地图Cesium应用/title script srchttps://cesium.com/downloads/cesiumjs/releases/1.107/Build/Cesium/Cesium.js/script link hrefhttps://cesium.com/downloads/cesiumjs/releases/1.107/Build/Cesium/Widgets/widgets.css relstylesheet style html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } /style /head body div idcesiumContainer/div script src./main.js/script /body /html然后在你的main.js里初始化ViewerCesium.Ion.defaultAccessToken 你的Ion默认令牌; // 如果要用Cesium Ion的资产需要这个 const viewer new Cesium.Viewer(cesiumContainer, { terrainProvider: Cesium.createWorldTerrain(), // 使用全球地形 baseLayerPicker: false, // 我们先关掉默认的底图选择器用自己的 animation: false, // 根据需求关闭动画控件 timeline: false // 根据需求关闭时间线 }); console.log(Cesium Viewer初始化成功, viewer);2.2 申请必要的服务密钥Key接下来是重头戏申请地图服务的访问密钥。这三家中天地图和谷歌地图通常需要密钥而OSM是免费的。天地图密钥申请访问“国家地理信息公共服务平台”官方网站通常搜索“天地图开放平台”即可找到。注册并完成实名认证个人或企业认证国内项目必需。在控制台创建一个“应用”你会获得一个唯一的tktoken参数。这个密钥需要放在你请求天地图服务的URL中。非常重要请妥善保管你的密钥并注意其调用次数和频率限制避免在代码中公开泄露。谷歌地图密钥申请访问Google Cloud Platform控制台。创建一个新项目或选择现有项目。启用“Maps JavaScript API”和“Maps Static API”根据你的使用方式。在“凭据”页面创建API密钥。安全警告务必在Google Cloud控制台中为你的API密钥设置HTTP引用限制如限定你的域名否则密钥被盗用会导致巨额账单。谷歌地图的付费模式比较复杂有免费额度超出后按请求量计费集成前务必了解清楚定价。OSM无需密钥。这是OSM最大的优势之一完全免费开放。但请注意虽然不需要认证但使用其瓦片服务时应遵守其“合理使用”政策避免过高频率的请求并按照要求添加版权归属credit。把申请好的天地图和谷歌的密钥保存在项目安全的地方比如环境变量.env文件或你的后端配置中千万不要硬编码在前端代码里提交到公开仓库。3. 实战加载天地图两种方法详解天地图作为国内项目的地图基石其集成是必须掌握的技能。原始文章提到了两种加载方式我这里会展开讲讲它们的区别、适用场景以及你可能遇到的坑。3.1 方法一使用 WebMapTileServiceImageryProvider这是更符合OGC开放地理空间联盟WMTS标准的方式。WMTS是一种标准的瓦片地图服务协议如果你的GIS后台也是WMTS服务那么用这个类会非常一致。// 假设你的天地图密钥已从安全配置中读取 const TIANDITU_TOKEN 你的天地图密钥; const tdtVecProvider new Cesium.WebMapTileServiceImageryProvider({ // WMTS服务的入口URL注意是wmts结尾 url: http://t0.tianditu.gov.cn/vec_w/wmts?tk${TIANDITU_TOKEN}, // 图层名对应矢量底图 layer: vec, // 样式通常为default style: default, // 瓦片格式通常为tiles format: tiles, // 瓦片矩阵集IDWeb墨卡托投影通常为w tileMatrixSetID: w, // 子域名用于负载均衡避免请求被限制 subdomains: [t0, t1, t2, t3, t4, t5, t6, t7], // 最小和最大缩放级别控制显示范围 minimumLevel: 0, maximumLevel: 18, // 版权信息必须显示 credit: new Cesium.Credit(天地图, true) }); viewer.imageryLayers.addImageryProvider(tdtVecProvider);关键点解析与踩坑记录url参数这里的vec_w代表“矢量-Web墨卡托”。如果你想加载影像底图就换成img_w加载影像注记用cia_w矢量注记用cva_w。一定要去天地图服务官网查看最新的服务地址和参数有时会有更新。subdomains这个非常重要它指定了多个子域名t0到t7。浏览器对同一域名的并发请求数有限制使用多个子域名可以并行下载更多瓦片显著提升地图加载速度。这是提升性能的一个小技巧。credit使用new Cesium.Credit()并设置第二个参数为true可以确保版权信息一直显示在屏幕上这是遵守服务条款的必要之举。HTTP vs HTTPS注意示例中使用的是http。在实际生产环境中如果你的网站是HTTPS的必须确保所有资源也通过HTTPS加载否则浏览器会阻止Mixed Content错误。天地图也提供HTTPS服务只需将协议头改为https即可例如https://t0.tianditu.gov.cn/...。3.2 方法二使用 UrlTemplateImageryProvider这是一种更通用、更灵活的方式它直接通过一个URL模板来请求瓦片。很多非标准或自定义的瓦片服务都采用这种方式。const tdtVecProvider2 new Cesium.UrlTemplateImageryProvider({ // URL模板{z}/{x}/{y} 分别代表级别、列号、行号 url: http://t{0-7}.tianditu.com/DataServer?Tvec_wx{x}y{y}l{z}tk${TIANDITU_TOKEN}, // 子域名这里用了更简洁的写法Cesium会自动替换{0-7}为t0到t7 subdomains: [0,1,2,3,4,5,6,7], // 指定瓦片方案为Web墨卡托 tilingScheme: new Cesium.WebMercatorTilingScheme(), maximumLevel: 18, credit: new Cesium.Credit(天地图, true) }); viewer.imageryLayers.addImageryProvider(tdtVecProvider2);两种方法如何选择WebMapTileServiceImageryProvider更适合对接标准的WMTS服务参数规范与GIS后台兼容性好。如果你需要动态切换不同图层如矢量、影像、注记通过修改layer参数即可逻辑清晰。UrlTemplateImageryProvider更灵活几乎可以加载任何符合{z}/{x}/{y}或{x}/{y}/{z}格式的瓦片服务。如果你还需要加载其他非标准的第三方瓦片比如一些气象云图、自定义发布的底图用这个类会更方便。在实际项目中我通常优先使用WebMapTileServiceImageryProvider来加载天地图因为感觉更“正统”。但如果你发现某个服务地址用WMTS方式调不通不妨试试URL模板方式有时会有奇效。4. 集成OpenStreetMap免费与多样化的选择OSM是我个人非常喜欢的地图源尤其是在做跨国项目或者预算有限的时候。它不仅是免费的而且由于是社区驱动很多小路、新建的公园、店铺信息更新得非常快。4.1 加载标准OSM街道图最基本的加载方式就是使用其标准的瓦片服务。这里我们同样使用UrlTemplateImageryProvider。const osmProvider new Cesium.UrlTemplateImageryProvider({ // OSM标准的瓦片URL模板 url: https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png, // 子域名OSM通常提供a、b、c三个 subdomains: [a, b, c], tilingScheme: new Cesium.WebMercatorTilingScheme(), minimumLevel: 0, maximumLevel: 19, // OSM的级别可以到19细节更丰富 // 版权信息必须清晰标注 credit: new Cesium.Credit(© OpenStreetMap contributors, true) }); viewer.imageryLayers.addImageryProvider(osmProvider);实测下来OSM的全球加载速度非常稳定。但有一点需要注意由于其服务器在国外国内直接访问有时可能会有延迟。对于国内用户为主的项目你可能需要考虑使用OSM的国内镜像服务或者将瓦片数据缓存到自己的CDN上。4.2 探索更多OSM风格CartoDB的宝藏如果你觉得标准的OSM样式有点“朴素”那么你一定要试试基于OSM数据、由CartoDB现为CARTO提供的一系列精美地图样式。它们同样是免费的并且提供了多种配色方案。Voyager航海家这是我最常用的样式色彩鲜明道路清晰在保持专业的同时又很有现代感。const cartoVoyagerProvider new Cesium.UrlTemplateImageryProvider({ url: https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png, subdomains: [a, b, c, d], tilingScheme: new Cesium.WebMercatorTilingScheme(), maximumLevel: 19, credit: new Cesium.Credit(© CARTO © OpenStreetMap, true) });Positron正电子一种浅色、简约的风格非常适合作为数据可视化的背景底图不会喧宾夺主。const cartoPositronProvider new Cesium.UrlTemplateImageryProvider({ url: https://{s}.basemaps.cartocdn.com/rastertiles/light_all/{z}/{x}/{y}{r}.png, // 参数同上... });Dark Matter暗物质深色主题适合夜间模式或需要突出亮色前景元素如轨迹、热点的应用非常酷炫。const cartoDarkProvider new Cesium.UrlTemplateImageryProvider({ url: https://{s}.basemaps.cartocdn.com/rastertiles/dark_all/{z}/{x}/{y}{r}.png, // 参数同上... });小技巧你可以轻松地在你的应用里做一个底图切换按钮让用户在这几种OSM风格间选择几乎零成本就能提升应用的专业感和用户体验。只需要动态移除旧的ImageryLayer然后添加新的ImageryProvider即可。5. 接入谷歌底图高性能与丰富图层谷歌地图的瓦片服务以其出色的渲染质量、流畅的动画和极高的可用性著称。虽然涉及商业使用和付费但在许多对地图体验要求极高的项目中它仍然是首选。5.1 加载谷歌道路图谷歌地图的URL模板有其特定的参数格式。lyrs参数用于指定图层类型。// 注意此处URL仅为示例格式实际使用需要有效的谷歌地图API密钥并遵守其服务条款。 const googleRoadProvider new Cesium.UrlTemplateImageryProvider({ // m 代表道路图 (roadmap) url: https://mt1.google.com/vt/lyrsmx{x}y{y}z{z}key${YOUR_GOOGLE_API_KEY}, tilingScheme: new Cesium.WebMercatorTilingScheme(), maximumLevel: 20, // 谷歌地图支持很高的级别 credit: new Cesium.Credit(© Google, true) });5.2 加载谷歌卫星与混合图除了道路图卫星图及其与道路的混合图也非常常用。卫星图Satellitelyrssconst googleSatelliteProvider new Cesium.UrlTemplateImageryProvider({ url: https://mt1.google.com/vt/lyrssx{x}y{y}z{z}key${YOUR_GOOGLE_API_KEY}, // ... 其他参数 });混合图Hybridlyrsy。这是卫星影像上叠加了道路、地名等标签的图层信息最全。const googleHybridProvider new Cesium.UrlTemplateImageryProvider({ url: https://mt1.google.com/vt/lyrsyx{x}y{y}z{z}key${YOUR_GOOGLE_API_KEY}, // ... 其他参数 });重要警告与性能考量合规与付费谷歌地图API是严格的商业服务。集成前务必阅读最新的服务条款申请API密钥并设置好配额和预算警报。未经授权使用或超出免费额度可能导致服务中断或产生费用。域名与密钥限制在Google Cloud控制台严格限制你的API密钥只能从你的应用域名调用这是最重要的安全措施。mt{0-3}子域名和天地图一样谷歌也使用mt0,mt1,mt2,mt3等子域名进行负载均衡。在UrlTemplateImageryProvider中你可以通过{s}占位符和subdomains参数来利用这一点提升加载并发性。例如url: https://mt{s}.google.com/...配合subdomains: [0,1,2,3]。缓存策略由于谷歌瓦片访问可能涉及网络延迟和成本强烈建议在前端或通过自己的代理服务器实现瓦片缓存避免重复请求相同的瓦片。6. 高级技巧与性能优化实战把地图加载出来只是第一步要让它在各种网络环境和复杂场景下都流畅运行还需要一些“内功”。下面分享几个我实战中总结出来的优化技巧。6.1 实现智能底图切换与图层管理一个成熟的应用不应该只有一层底图。我们可以创建一个底图切换器让用户自由选择。// 定义一个底图提供者集合 const baseLayers { 天地图矢量: tdtVecProvider, 天地图影像: tdtImgProvider, // 需要提前定义 OSM标准: osmProvider, OSM航海家: cartoVoyagerProvider, 谷歌道路: googleRoadProvider, 谷歌卫星: googleSatelliteProvider, }; // 当前激活的底图图层 let activeBaseLayer; function switchBaseLayer(layerName) { // 移除当前的底图 if (activeBaseLayer) { viewer.imageryLayers.remove(activeBaseLayer); } // 添加新的底图并添加到最底层 const newProvider baseLayers[layerName]; if (newProvider) { activeBaseLayer viewer.imageryLayers.addImageryProvider(newProvider, 0); // 0表示最底层 console.log(已切换底图至: ${layerName}); } } // 示例切换到天地图矢量 switchBaseLayer(天地图矢量);你可以在界面上放一组按钮点击按钮调用switchBaseLayer函数。更高级的做法是可以根据用户的地理位置自动选择最优底图例如国内用户默认用天地图国外用户默认用OSM。6.2 性能调优缓存、重试与错误处理地图加载慢或者出现“灰色格子”瓦片加载失败是很影响体验的。我们可以通过配置ImageryProvider的参数和监听事件来优化。const optimizedProvider new Cesium.UrlTemplateImageryProvider({ url: ..., // 启用内置缓存减少重复请求 enablePickFeatures: false, // 如果不需点击获取要素信息就关掉以提升性能 // 设置重试次数网络不好时自动重试 maximumRetries: 3, // 重试之间的延迟毫秒 retryAttempts: 250, // 设置瓦片缓存大小单位MBCesium会缓存最近使用的瓦片在内存中 tileCacheSize: 128, }); // 监听瓦片加载错误事件 viewer.scene.imageryLayers.layerAdded.addEventListener(function(layer) { layer.imageryProvider.errorEvent.addEventListener(function(error) { console.warn(瓦片加载失败:, error); // 这里可以做一些UI提示比如显示一个加载失败的图标 }); });对于WebMapTileServiceImageryProvider同样可以设置maximumRetries等参数。此外考虑使用服务端代理是一个更彻底的方案。对于需要密钥的服务如天地图、谷歌你可以让自己的后端服务器去请求瓦片然后前端从你的服务器获取。这样做有几个好处隐藏了真实密钥可以统一添加缓存逻辑如Redis可以合并请求优化速度。6.3 坐标系与显示范围的匹配问题这是一个深坑不同的地图服务可能使用不同的坐标系如WGS84经纬度、Web墨卡托。Cesium内部使用WGS84椭球体。幸运的是我们常用的天地图Web墨卡托、OSMWeb墨卡托、谷歌地图Web墨卡托都使用EPSG:3857Web墨卡托投影而Cesium的WebMercatorTilingScheme正是为此设计的。所以我们在创建UrlTemplateImageryProvider时指定tilingScheme: new Cesium.WebMercatorTilingScheme()就能完美匹配。但如果你遇到某些特殊的老旧地图服务使用的是EPSG:4326WGS84经纬度你就需要使用GeographicTilingScheme。关键是要确保你的瓦片服务的坐标系和Cesium中ImageryProvider设置的tilingScheme一致否则地图会错位或无法显示。另一个常见问题是maximumLevel。不同地图服务支持的最大缩放级别不同。比如天地图可能到18级OSM到19级谷歌到20级。如果你设置的maximumLevel超过了服务实际提供的级别在高级别缩放时就会加载失败。所以最好查阅官方文档设置正确的级别范围。7. 项目实战构建一个多源地图切换应用理论说再多不如动手做一个。我们来构想一个简单的智慧园区管理系统它需要满足以下需求1. 默认使用高精度的天地图影像2. 管理员可以切换到OSM查看更丰富的POI信息3. 在展示全局概览时使用谷歌卫星图增强视觉效果。第一步初始化并加载默认底图天地图影像const viewer new Cesium.Viewer(cesiumContainer, { terrainProvider: Cesium.createWorldTerrain(), baseLayerPicker: false, }); // 加载天地图影像假设已申请密钥并存储在变量中 const defaultLayer viewer.imageryLayers.addImageryProvider( new Cesium.WebMapTileServiceImageryProvider({ url: https://t0.tianditu.gov.cn/img_w/wmts?tk${TIANDITU_TOKEN}, layer: img, style: default, format: tiles, tileMatrixSetID: w, subdomains: [t0, t1, t2, t3, t4, t5, t6, t7], maximumLevel: 18, credit: new Cesium.Credit(天地图, true) }) , 0); // 放在最底层第二步在UI上添加底图切换控件我们不在Cesium自带的控件里做而是自己在HTML里添加一组按钮这样样式和逻辑更可控。div idmapToolbar styleposition: absolute; top: 10px; left: 10px; z-index: 1000; background: white; padding: 10px; border-radius: 5px; strong底图切换/strong button onclickswitchTo(TiandituImg)天地图影像/button button onclickswitchTo(TiandituVec)天地图矢量/button button onclickswitchTo(OSM)OSM标准/button button onclickswitchTo(GoogleSatellite)谷歌卫星/button /div第三步实现切换函数我们需要预定义好各个提供者并在切换时管理好图层顺序。// 预先创建好所有提供者这里省略了重复的new代码 const providers { TiandituImg: tdtImgProvider, TiandituVec: tdtVecProvider, OSM: osmProvider, GoogleSatellite: googleSatelliteProvider // 注意谷歌需处理密钥和网络问题 }; let currentBaseLayer; function switchTo(providerKey) { if (currentBaseLayer) { viewer.imageryLayers.remove(currentBaseLayer); } const newProvider providers[providerKey]; if (newProvider) { // 将新底图添加到最底层索引0 currentBaseLayer viewer.imageryLayers.addImageryProvider(newProvider, 0); } }第四步处理网络与兼容性问题在实际部署时谷歌地图服务在国内可能无法直接访问。这就需要更复杂的策略例如条件加载检测用户网络或区域如果判断为国内用户则不显示或禁用谷歌地图选项。服务端代理如前所述搭建一个代理服务来转发谷歌瓦片请求同时解决网络和密钥安全问题。优雅降级当首选底图加载超时或失败时自动降级到备用的OSM或天地图。通过这样一个完整的小项目你就能把多源地图集成、切换、优化的知识串联起来。记住地图服务的选择没有绝对的最好只有最适合你当前项目场景的。多尝试多测试根据数据精度、更新频率、渲染效果、访问速度、成本合规这五个维度来权衡你一定能找到最完美的地图方案组合。