问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Mapbox源码分析(2)url解析

发布网友 发布时间:2022-11-19 14:59

我来回答

1个回答

热心网友 时间:2024-11-20 11:41

通过源码,我们来一步步分析Mapbox地图引擎如何进行指定字符串变量解析成url地址加载的,这里是基于5.3.0的版本.

在官方demo中,我们不仅可以加载本地样式文件,已定义样式文件和网络在线文件,它们的格式分别是

1. "asset://test.json"

2 . "https://www.mapbox.com/android-docs/files/mapbox-raster-v8.json"

3 . "mapbox://styles/mapbox/streets-v10"

这些格式,那么Mapbox如果解析这些字符串去获取到需要的样式数据呢?我们从 Mapbox源码分析(1)样式加载 这篇的loadURL()方法开始看起

我们在这里看到,样式的数据是通过fileSource.request进行请求加载的,通过调试我们发现这个fileSource是FileSource的子类DefaultFileSource,那么我们先看看这个DefaultFileSource是什么时候传进来的

我们在这里看到,是在构造方法时对fileSource变量进行初始化的,那么我们只需要看到Style::Impl对象什么时候构造的,便知道了fileSource的来源,继续往回找

在这里我们发现Impl对象的fileSource是Style对象构造时传进来的,那么我们继续往回找

这里我们看到Style对象是通过map.cpp里的getStyle对象获取的,而style对象是在Map::Impl::Impl构造方法时初始化的,继续往回找

这里我们其实也能大概猜出来Map::Impl对象是在Map构造方法时初始化的,那么map对象又是什么时候初始化的,是不是觉得很绕,马上就快到了,我们找到native_map_view.cpp文件,发现在NativeMapView构造方法中构造了map对象

到这里我们已经基本清楚fileSource的来源了,是JAVA层NativeMapView对象初始化的时候传下来的,我们继续看到开头,既然我们已经知道fileSource对象是DefaultFileSource,那么它调用的request方法,也就是调用的DefaultFileSource的request方法,这里我们看到default_file_source.cpp文件

这里我们看到它转到了它的实现类的request方法

这里我们可以看到根据url的不同,和加载方法的不同,将请求分别转给了assetFileSource,localFileSource,onlineFileSource等的request方法,这里我们看onlineFileSource的request方法

看到这里我们看到根据请求的类型不同,去处理不同的url,在这些参数里我们看下apiBaseURL这个变量,这是一个base url,指定了服务器地址,我们在constants.hpp文件中找到了它

constexpr const char* API_BASE_URL = "https://api.mapbox.com";

继续往下看,我们选normalizeStyleURL()方法往下看

这里我们看到它先验证了一下url,然后将url字符串包装成URL对象,然后进行一个拼接成tpl变量,最后再通过transformURL函数进行一个转换,这里我们先看它如何包装这个URL对象的

这里我们看到它将字符串分解成query,scheme,domain,path四个变量进行存储,我们再看看transformURL()函数

这里我们看到根据url的不同变量值进行了再次字符串拼接,甚至根据路径的不同,继续拆分成Path对象,最后将拼接结果返回,到这里有关url解析拼接的过程就讲完了.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 基于Mapbox GL JS 而建的实时地图,就是麻瓜世界的活点地图呀! 五分钟学GIS _ 快速认识 MapBox GL 六千左右的游戏本推荐 适合新手的美瞳品牌有哪些推荐?求好用的美瞳推荐? 灵芝的切法 怎么把灵芝磨碎 灵芝怎么切碎啊? applewatch选了其他表带默认会送吗 云计算是云数贸吗? 飞利浦5000几节电池 电脑进不了江铃陆风x8安全气囊系统是怎么回事 江铃陆风x8安全气囊灯怎么用电脑清除 陆风X8有几个安全气囊?是什么车身? 陆风X8柴油有几个安全气囊啊?安装在哪? 江铃陆风x8柴油版气囊灯亮怎么办 陆风x8安全气囊插头在哪插着 陆风X8柴油有几个安全气囊啊 陆风x8新款有几个安全气囊啊? 陆风X8有几个安全气囊? 电饭锅和电热锅那个煮饭更省电 喵驾链接热点没有密码输入 汽车没有喵驾系统如何安装 佳能ts3400 故障代码3 佳能ts3400能连几部手机 TS3400怎么突然不能打印 台式机用的无线网卡多少钱? 台式机网卡坏了去换一个多少钱? 选c系还是n系九号 16V900安时锂电池多少钱一块? 热水器关了还不断的漏水? 热水器关了还滴水 phone美图手机多少钱 科密牌考勤机怎么在考勤机里修改打卡时间? ...BA-T500打印机,不停打印乱码。重装驱动好了,过一段时间又不行了... ai怎么设计动漫人物的背影 如何在 C/C++中使用64位整数类型 long long 可以支持多少位的数 什么是64位整数 c语言中如何定义64位整数,希望路过的神牛指点 编写64位精度的整数类型,判断两数乘积是否溢出