项目从http升级到https,出了不少奇怪的小问题,天地图请求就是其中之一。
https项目是不能完成http请求的。
请求天地图服务有两方面:
arcgis
arcgis在构造WebTileLayer时会指定url,这里之前加载矢量底图是用的https://{subDomain}.tianditu.gov.cn/vec_c/wmts
,但是后来有切换矢量和影像的需求,所以加了影像的请求——http://{subDomain}.tianditu.com/DataServer?T=img_c
,因为不是一个人写的,所以地址不太对,改成https://{subDomain}.tianditu.gov.cn/DataServer?T=img_c
就好了。
leaflet
leaflet也有直接请求url的写法,不过项目里用的是leaflet插件——chinatmsproviders,调用的方法是L.tileLayer.chinaProvider,这个请求失败的状态码为
301 Moved Permanently
查了一下没得到有用的解决方法,chinaProvider的源码也没带协议类型,应该是有自动判断的处理;最后对比请求地址发现,域名后缀不同,换了之后就好使了
(地形的因为没用到,所以没改)
在浏览器中输入请求url发现:
- .com的请求最终都会转成http协议;复制https的url跳转后,再复制新地址,得到的是http请求
- .gov.cn的请求不会变;跳转前和跳转后的地址是一致的
天地图官网地址是https://www.tianditu.gov.cn/
,请求http://www.tianditu.com/
会跳转到官网地址。所以应该是.com是老版地址,chinatmsproviders插件的版本比较老,请求的也是老版的天地图服务地址。
2021-5-13更新
超图
一般情况下,超图加载天地图是构造Cesium.TiandituImageryProvider实例实现的,但是这个类的请求方法里没有对location的协议进行判断,也就造成只会发出http请求,且无法通过改源码实现。
替代方法是使用Cesium.UrlTemplateImageryProvider类,这个类是自定义url请求,有较高的自由度,也意味着较多的代码。另外,这个类的配置有些需要注意的:
- keywords
url template keywords,每种地图引擎设置的都不一样,超图的与L.tileLayer.chinaProvider比较类似,具体可以参考API文档 - subdomains
默认是'abc',天地图是从't0'到't7'的数组。