GIS中常用地图及其特点

标签: 无 分类: 未分类 创建时间:2021-03-16 01:28:45 更新时间:2024-11-15 10:49:43

前言

在进行WebGIS开发的时候,最基本的就是加载底图,底图因为数据量大,要素较多,往往通过人工绘制,所以成本都会很高,所以一般的公司都不会自己去建立自己的底图库,当然,现在也有一些自动化测图技术,这一方面我倒是没有研究过,有机会可以仔细的研究下相关的技术。

1.天地图

因为我曾经在浙江一家生产天地图数据的单位里工作,所以用的最多的,使用时间最久的也是天地图,特别是浙江天地图。刚开始,浙江天地图都是免费的,但是后来改革之后,再次引用变得非常的麻烦,要进行申请,以公司的名义到浙江省地理信息公共服务平台进行申请,而且申请的入口非常的难找,当然数据也是相较于国家天地图来说要更加的精细,因为国家天地图只到18级,而浙江天地图可以达到20级。国家天地图可以到国家天地图官网上申请,需要一个tk参数。

天地图的WMTS加载方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var TDU_Key = "" //天地图申请的密钥
//在线天地图影像服务地址(墨卡托投影)
var TDT_IMG_W = "http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
"&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
"&style=default&format=tiles&tk=" + TDU_Key;
//在线天地图矢量地图服务(墨卡托投影)
var TDT_VEC_W = "http://{s}.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
"&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
"&style=default&format=tiles&tk=" + TDU_Key;
//在线天地图影像中文标记服务(墨卡托投影)
var TDT_CIA_W = "http://{s}.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
"&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
"&style=default.jpg&tk=" + TDU_Key
//在线天地图矢量中文标记服务(墨卡托投影)
var TDT_CVA_W = "http://{s}.tianditu.gov.cn/cva_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
"&LAYER=cva&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
"&style=default.jpg&tk=" + TDU_Key;
参考文章:
1.天地图服务地址
2.openlayers加载天地图
3.openlayers加载百度地图和天地图在线地图 这个和我以前的加载方式有点不同,现在的地址,变成了统一的 DataServer 服务了,不再是使用wmts服务加载了。
4.天地图默认为卫星图包括地名标记方法,天地图添加各类注记或图层方法 这里有各个图层的名称介绍

问题

(1) 请求跨域问题
当我请求 :https://t1.tianditu.com/DataServer?T=cva_w&x=0&y=0&l=1&tk=633ab2a001dcfa85f77d445dd7e873c2 天地图注记的时候,出现了跨域问题。

【解决方法】
我花了很长的时间解决这个问题,尝试了各种方法,使用了nginx进行代理,但是最后还是没有成功,简直崩溃了,最后的解决方法,竟然是将 t1.tianditu.com 换成 t0.tianditu.gov.cn 就可以了,简直吐血。

关键的问题是,我以前的请求都是用的gov.cn,不知道在这个程序中,怎么写成了com域名,简直操蛋,白瞎了我一个下午的研究。

(2) 设置负载均衡问题
在使用天地图的底图的时候,竟然出现了跨域问题,这让我不得不设置代理才可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 负载均衡
upstream tianditu_server {
server t0.tianditu.com weight=1 max_fails=2 fail_timeout=30s;
server t1.tianditu.com weight=1 max_fails=2 fail_timeout=30s;
server t2.tianditu.com weight=1 max_fails=2 fail_timeout=30s;
server t3.tianditu.com weight=1 max_fails=2 fail_timeout=30s;
server t4.tianditu.com weight=1 max_fails=2 fail_timeout=30s;
server t5.tianditu.com weight=1 max_fails=2 fail_timeout=30s;
server t6.tianditu.com weight=1 max_fails=2 fail_timeout=30s;
}

## 请求配置
location /tdt/ {

proxy_pass http://tianditu_server/;

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept,openid,unionid,token";

if ($request_method = 'OPTIONS') {
return 204;
}
}

当我如上配置的时候,我请求:”/tdt/DataServer?T=vec_w&x=13&y=5&l=4&tk=63”,总是会出现 404 错误:

但是我配置了 具体的域名,之后就可以请求成功了,我始终找不出问题所在的原因,明明逻辑上就没有问题啊,参考文章中,也是类似设置的,但是最后还是错误。

1
2
3
location /tdt/ {
proxy_pass http://t0.tianditu.com/;
}

【问题一】
后来我尝试加上了 proxy_set_header Host ,就算是加上了 http://t0.tianditu.com/ 也会出现 404页面,只有不加proxy_set_header Host,并且proxy_pass 为 t0.tianditu.com/ 某一个具体的域名的时候,才不会出现404错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location /tdt/ {

proxy_pass http://tianditu_server/;

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_redirect default;
proxy_buffer_size 512k;
proxy_buffers 6 512k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
client_max_body_size 100m;
}

【问题二】
当我配置为: proxy_set_header Host $proxy_host; 时,可以正常的请求。

2.ArcGIS

ArcGIS也提供了一些可用的底图,比如暗夜底图,这个比较常用于一个大屏数据展示类的应用中,虽然只有一个全球的,但是配上一些酷炫的闪动,也还是不错的,下面的就是使用openlayer加载的arcgis的暗色系底图

1
2
3
4
5
new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}'
})
}),

参考文章
1.基于OpenLayers的萤火图效果 (这个作者很牛的,虽然不知道多大了,但是对ArcGIS、postgis、openlayers等应该非常的了解和熟悉)
2.openlayers6地图全图以及框选截图导出功能(附源码下载) (这个是在暗色系的底图上实现了截图导出的功能)
3.ChinaOnlineStreetGray (MapServer)

3.OpenStreetMap

OpenStreetMap是一个免费的地图服务,矢量地图在中国区域,精细程度,我觉得还可以,速度上也还是蛮不错的。基于OpenStreetMap可以做很多的事情,比如:maperitive,可以对OpenStreetMap的数据样式进行自定义。

参考文章:
1.openstreetmap
2.GeoServer发布OSM地图
3.openmaptiles OpenMapTiles 是一个基于 OpenStreetMap 的可扩展和开放的瓦片模式。该项目用于为在线可缩放地图生成矢量切片。 OpenMapTiles 是关于使用包含地形信息的通用图层创建漂亮的底图。

4.智图地图

这是一个商业地图公司,提供了相应的地图产品,根据地图的地址来看,其实也就是做了一个Esri地图的在发布罢了。

1
2
3
4
5
6
Map: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}",
Color: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetColor/MapServer/tile/{z}/{y}/{x}",
PurplishBlue: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
Gray: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}",
Warm: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}",
Cold: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetCold/MapServer/tile/{z}/{y}/{x}"
参考文章:
1.智图数据产品地图
2.leafLet入门教程兼leafLet API中文文档参考 (从这里知道了有Geoq这种地图)

4.Mapbox地图

mapbox除了提供 mapbox-gl-js 的地图引擎之外,其实也自带了地图。

5.Carto

Use a quality basemap for your maps & applications, visualizing vector & raster data with clarity & precision. Take your cartography to new levels.为您的地图和应用程序使用优质底图,以清晰和精确的方式可视化矢量和栅格数据。将您的制图提升到新的水平.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import 'ol/ol.css';
import Map from 'ol/Map';
import TileLayer from 'ol/layer/Tile';
import View from 'ol/View';
import XYZ from 'ol/source/XYZ';

const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new XYZ({
url:'http://{a-d}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
}),
}),
],
view: new View({
center: [-472202, 7530279],
zoom: 12,
}),
});

6.maptiler

maptiler提供了矢量服务,可以自定义地图的样式。

1
https://api.maptiler.com/maps/basic/style.json?key=pSHUA9sSkNny3iqoWG4P
参考文章:
1.maptiler
2.Open Map Styles

7.谷歌地图

图片请求路径,我在一个群里搜集的。

1
2
3
4
https://gac-geo.googlecnapps.cn/maps/vt?lyrs=s&x={x}&y={y}&z={z}

// gcj02的坐标系
https://gac-geo.googlecnapps.cn/maps/vt/lyrs=s&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}&s=

8.stamen

stamen For over a decade, Stamen has been exploring cartography with our clients and in research. These maps are presented here for your enjoyment and use wherever you display OpenStreetMap data.

9.高德地图

1
2
3
4
5
6
http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7 为矢量图(含路网、含注记)
http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=2&style=7 为矢量图(含路网,不含注记)
http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=6 为影像底图(不含路网,不含注记)
http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=2&style=6 为影像底图(不含路网、不含注记)
http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=8 为影像路图(含路网,含注记)
http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=2&style=8 为影像路网(含路网,不含注记)

10.遥感影像

参考文章:
1.卫星遥感影像数据免费下载网站整理 1.综合遥感数据。2.雷达遥感数据。3.夜光遥感数据。4.海洋卫星数据。
2.全国5M分辨率卫星遥感影像免费下载方法(附最新下载地址)
3. 免费遥感影像数据下载网址汇总-2022年6月更新 1.地理空间数据云。2.中国资源卫星数据服务网。3.风云卫星遥感数据服务网。4.对地观测数据共享服务网。5.综合性免费数据下载网站。6.Sentinel系列数据共享网站。7.MODIS数据。8.ASAR数据下载。9.全球SRTM地形数据下载网。10.ALOS World 3D。11.DMSP数据下载网站
4.如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。