热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js修改本地json文件_mapboxgl本地化实践

很多时候,我们不能将我们的数据托管到mapbox的在线服务。我们希望使用mapboxstudio定制完地图样式后,将样式文件导出,然后将数

很多时候,我们不能将我们的数据托管到mapbox的在线服务。我们希望使用mapbox studio定制完地图样式后,将样式文件导出,然后将数据服务改成geoserver发布的矢量瓦片服务。实现这个目标,需要解决:

1、图标等静态资源的本地化。

2、字体文件本地化。

2、数据服务的本地化。

一、使用geoserver发布矢量瓦片服务

上一篇文章已经介绍了如何使用geoserver发布矢量瓦片服务(数据源使用的是wgs84坐标),前端使用mapbox-gl来绘制矢量瓦片服务。在这次测试实验中,我发布了包括建筑、路网、湖泊水系,公交站点等七个图层,并将这七个图层放在一个图层组里面。

57d3911ecd8f4bbdae51b30807a2e7db.png
矢量瓦片服务图层组(sz_shp)

二、使用mapbox studio定制地图样式

使用mapbox studio制作自定义地图可以到看一下这篇文章,这里我不写详细制作过程来,可以看看官网给出的文档。如果,你不想将你的所有数据上传到mapbox地图定制的在线平台,事实上mapbox会对上传数据存储空间的大小是有限制,你可以上传测试数据来定制地图样式。

3d38cf75cfc33758e641351efd532cb9.png
mapbox studio定制地图样式

为了测试需要,我添加了公交站点和路网的标注图层、公交站点图标图层。mapbox-gl要在前端绘制标注,需要获取所需要的字体文件;同样,在绘制图标的使用,也要从服务端获取静态的图标资源。

制作完成后如果你想发布在线的地图样式,可以点击右上角发布地图样式。拷贝样式地址至mapbox-gl示例中就可以了。

下载制作的样式文件可以点击【share】-->【下载】

ee15e5c863dcd5c0439cc01f07617cee.png
下载定制的地图样式
b4583dfd19bdbfd3baca378fc90bd627.png
定制地图样式文件

icons中图标(svg格式)是我在制作地图时上传的。style.json是我们的地图样式配置文件。这里需要知道的是,Mapbox 样式文件定义的是地图所呈现的视觉外观,包括:需要绘制哪些数据、绘制的顺序、以及绘制数据时如何进行符号化。样式文档是以json对象中的属性字段进行组织的。

三、静态资源(图标)的本地化

先来看一下,mapbox-gl在线示例是如何加载静态的图标资源等。打开下载的样式文件style.json可以看到静态文件在线配置到地址。

8ae3a123adfcc06fb4a43024ed06ad37.png
静态资源(图标)在线访问地址
1206ae7de0211f432af4f179f9e12dab.png
mapbox-gl访问在线图标资源

mapbox通过使用精灵图来减少网络请求次数。sprite.png记录合并后图片资源,sprite.json是索引文件,通过索引文件可以访问具体一个图标的位置。

可以尝试将sprite设置为相对地址,如"./xxx/",我这里测试貌似不行,mapbox源码中好像用正则表达式验证如果设置相对路径会出错,这里把我们定制地图的sprite.png和sprie.json下载下来,放在本地。将样式配置文件中的sprite设置为服务器上绝对位置,就可以了。如下图配置。

d88c5f4278655949808be8f1cb74ce2b.png
静态图片资源本地化

sprite.json和sprite.png是从定制好的地图样式,在预览时直接下载下来的。也可以通过工具根据图标集合生城,这里我们有测试,可以看看这里。

四、字体文件的本地化处理

前端绘制示例瓦片时,如果绘制标注的话需要提供字体,英文字体文件相对较小,如果是中文字体的少则都十几兆。mapbox使用pbf格式分段的请求方式来请求字体文件。因此需要根据配置文件中使用到的字体来生成pbf格式字体文件。

be7920ccc1dfa3bd6e52e4c93633f80e.png
字体文件在线配置地址
6e2447d115c36fb509b6dea9dc22d09e.png
字体文件在线请求地址

Mapbox开源了一个工具node-fontnik,可以将ttf和otf格式字体转换成Mapbox GL渲染需要的字体。可以编写字体转换代码,将ttf和otf格式到字体转换为pbf格式。下图,转换结果。

var fontnik = require('fontnik');
var fs = require('fs');
var path = require('path');var convert = function (fileName, outputDir) {var font = fs.readFileSync(path.resolve(__dirname + "/" + fileName));output2pbf(font, 0, 255, outputDir);
}function output2pbf(font, start, end, outputDir) {if (start > 65535) {console.log("done!");return;}fontnik.range({font: font,start: start,end: end}, function (err, res) {var outputFilePath = path.resolve(__dirname + "/" + outputDir + start + "-" + end + ".pbf");fs.writeFile(outputFilePath, res, function (err) {if (err) {console.error(err);} else {output2pbf(font, end + 1, end + 1 + 255, outputDir);}});});
}
convert("./fonts/ARIALUNI.ttf", "./fonts/pbf/ARIALUNI/");

989092524fa0927d4387f5a26f9fb702.png
字体转换结果

可以将转换后的字体文件夹拷贝到本地的工程目录中,然后修改glyphs的配置地址。占位符{fontstack}是字体类型,{range}是字体范围。下图,字体文件本地化配置。

34c76887be61187b181499d960c9c856.png
字体文件本地化配置

这里面有个问题,mapbox studio在定制地图的时候,设置标注字体会给出一个fallback字体,当主要字体缺少字形时,文本将以后备字体当样式呈现。网络请求多个字体时,字体文件名用逗号隔开。但是当字体服务本地化时候,样式配置文件中text-font如果设置多个字体时,将无法根据地址找到字体文件。这里面猜测是否可以将字体合并,然后转换成pbf格式,但这样感觉不合理,没测试,知道当可以告知一下。我这里直接将后备字体注释掉了。

a18651f6afd954b76f9941173a869f12.png
mapbox studio设置字体
f9f8238e25b4381ee559ff784d9d56fe.png
多字体文件无法访问地址

四、数据服务的本地化配置

可以看出上一篇文章。这里给出完整代码。style如果设置style.json的相对路径可能会出错,因为style的类型是一个对象。这里定义了一个style变量,存储我们的地图配置。完整代码看这里。

d6d3ad572c7c1efb2bf30ff7c2a0c78f.png
本地工程目录结构
b1825a8ba6c4c02926b86ef8fd607855.png
本地化结果





推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
author-avatar
书友76086805
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有