首页 / 浏览问题 / WebGIS / 问题详情
在3857坐标系下,如何添加4490坐标系的iserever瓦片?
2EXP 2023年01月18日
TileSuperMapRest 类默认支持3857和4326的瓦片, 现在有个iserver提供4490的瓦片,我应该用什么去加载到3857投影的天地图上?

1个回答

您好,您的4490的瓦片是rest地图还是发布的瓦片服务?如果是rest地图服务,可以使用动态投影转换,叠加到3857的地图上;如果是发布的瓦片服务,就不能进行动态投影,可以在桌面产品中将数据进行投影转换和配准,将地图坐标系转为3857,再切瓦片后发布服务。

931EXP 2023年01月18日

你好, rest地图还是发布的瓦片服务?如果是rest地图服务, 这个怎么判断? 对方给的一个链接地址,删除后面的坐标、缩放倍数等参数就可以定位到这个页面。


我看到你的贴图是 leaflet,  我天地图加载使用的是 openlayers, 对应使用TileSuperMapRest 这个类添加瓦片, 但看源码只支持3857 和 4326。 

默认是3857和4326,但是可以自定义坐标系,这样您就可以加载4490的天地图,不用考虑地图动态投影。自定义坐标系可以参考我们的博客:https://blog.csdn.net/supermapsupport/article/details/101348811

demo 中是 leaflet

L.Proj.CRS("EPSG:4490",{})

openlayers 应该使用哪个api 做同样的事情?

您好,OpenLayers的demo可以参考这一篇博客:https://blog.csdn.net/supermapsupport/article/details/88967390 ,其中resolutions也可以使用SuperMap iClient for OpenLayers中封装的方法getResolutionFromScale获得。

proj4.defs("EPSG:4490", "+proj=longlat +ellps=GRS80 +no_defs +type=crs");

return import('@supermap/iclient-common').then(({ CommonUtil }) => {
  let resolutions = CommonUtil.getResolutionFromScale(3.461454994642238E-6, 'degrees')
  // import * as olProj from 'ol/proj';
  const projection = olProj.get('EPSG:4490');
  console.log(resolutions, 'resolutions是计算出的某个值');
  console.log(projection, 'projection值一直是null?');
  // setExtent([这里的区间值从哪里获取?])
  projection.setExtent([8374565.292377971, 1866182.1613285837, 1.4947981223720774E7, 7070412.849097984]);

有几个疑问点:
1. proj4.defs() 定义的在后文没有用过; 
【 这里看了源码确实是需要提前定义的,可能是个异步加载吧?

* Additional projection definitions can be registered with `proj4.defs()` any

* time. Just make sure to call `register(proj4)` again; for example, with user-supplied data where you don't

* know in advance what projections are needed, you can initially load minimal

* support and then load whichever are requested.

2. olProj.get('EPSG:4490') 返回值是null

解决方案: import * as olProjections from 'ol/proj/projections';
const projection = new olProj.Projection({ code: 'EPSG:4490' });
olProjections.add('EPSG:4490', projection)
这样再调用get 返回的就是  projection 实例

3. projection.setExtent([])  后面的参数从哪里获取?

4. 通过TileSuperMapRest构建的 layer, 添加到地图上会, TileSuperMapRest 内的 tileUrlFunction  就会死循环执行。不知道为啥?

projection.setExtent([]) 中的extent参数,可以在地图服务下“全幅范围”,也可以设置为3857坐标系最大范围:[-2.0037508342789244E7, -2.0037508342789244E7], [2.0037508342789244E7, 2.0037508342789244E7]
...