OpenLayers学习--加载指定等级指定范围的高德地图数据

在使用高德地图数据的时候,我们通常不需要加载世界地图,只需要指定项目片区地图数据即可;同样,我们也不需要所有等级的数据,只需要指定等级数据即可。

按照《OpenLayers学习--Layer体系(一)》中的方法,直接使用XYZ图层类来加载,显然无法实现该功能。主要原因有以下两点:

1.没有指定地图的分辨率

OpenLayers的机制就是,当你没有给Layer指定分辨率,也没有给Map指定分辨率,则直接将地图的最大范围的左上角点作为切图原点,并且按照18级来计算切图分辨率,分辨率是以1/2向下递减。

以900913投影为例,maxExtent为(至于不知道为什么是这个值的,请自己百度其原理):

maxExtent: new OpenLayers.Bounds(-20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892)

那么第0级的分辨率为:

(maxExtent.right - maxExtent.left)/256;

即:res[0] = 156543.033928040625。

由此:res[z] = res[0]/Math.pow(2,z);

而对于XYZ图层,说白了就是计算切片的行列号,直接构造网址,将图片填充到图层的DIV里面。

由此明白,假设只是给Map中指定resolutions来限定地图的显示等级,会导致Map中的Z 之和实际Z对应的resolution不匹配,导致构造出来的网址不正确。

2.没有指定地图的最大范围

假设强行给Map指定一个maxExtent,上面说过,没有给分辨率的时候Layer的分辨率的计算是直接使用Map的Extent来计算,这样显然会导致我们的XYZ同时都计算错误。

因此得出结论,要使用OpenLayers加载高德地图的指定比例尺和指定范围下的地图,就必须要给出正确的计算地图切片所在服务器的地址。

下面给出一种解决办法

1.构造高德地图数据源图层

        OpenLayers.Layer.GaodeCache = OpenLayers.Class(OpenLayers.Layer.TMS, {

            tileOriginCorner: 'tl',

            type: 'png',

            myResolutions: [
                            156543.0339,
                            78271.516953125,
                            39135.7584765625,
                            19567.87923828125,
                            9783.939619140625,
                            4891.9698095703125,
                            2445.9849047851562,
                            1222.9924523925781,
                            611.4962261962891,
                            305.74811309814453,
                            152.87405654907226,
                            76.43702827453613,
                            38.218514137268066,
                            19.109257068634033,
                            9.554628534317016,
                            4.777314267158508,
                            2.388657133579254,
                            1.194328566789627,
                            0.5971642833948135,
            ],

            tileOrigin: new OpenLayers.LonLat(-20037508.3427892, 20037508.3427892),

            initialize: function (name, url, options) {

                OpenLayers.Layer.TMS.prototype.initialize.apply(this, [name, url, options]);
            },

            getURL: function (bounds) {
                var res = this.map.getResolution();
                var x = parseInt((bounds.getCenterLonLat().lon - this.tileOrigin.lon) / (256 * res));
                var y = parseInt((this.tileOrigin.lat - bounds.getCenterLonLat().lat) / (256 * res));
                var z = this.map.getZoom();
                if (Math.abs(this.myResolutions[z] - res) > 0.0000000000000000001) {
                    for (var i = 0; i < this.myResolutions.length; i++) {
                        if (Math.abs(this.myResolutions[i] - res) <= 0.0000000000000000001) {
                            z = i;
                            break;
                        }
                    }
                }

                if (OpenLayers.Util.isArray(this.url)) {
                    var serverNo = parseInt( Math.random(0, this.url.length));
                    return this.url[serverNo] + "&z="+z + '&y=' + y + '&x=' + x;
                }else{
                    return this.url + "&z="+z + '&y=' + y + '&x=' + x;
                }
            },

        });

2.使用示例

初始化Layer,指定高德服务器的地址,主要是提供拼接URL的baseURL。

        var layer = new OpenLayers.Layer.GaodeCache("Gaode", [
                        "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7",
                        "http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7",
                        "http://webrd03.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7",
                        "http://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7"]
                        );

初始化Map,给出显示地图范围,以及分辨率,需要显示那几级地图就保留那几级分辨率,其他的删掉即可。

请留意这里的分辨率是和服务器切图的分辨率严格保持一致的。

如果不想保持一致的话,请自己重写Layer中getURL方法中的获取分辨率部分的代码。

map = new OpenLayers.Map('map', {
                projection: "EPSG:900913",
                displayProjection: "EPSG:4326",
                controls: [],
                maxExtent: new OpenLayers.Bounds(12139249.47917,2440079.81851,12157670.80299,2450494.36362),
                resolutions: [
                                //156543.0339,
                                //78271.516953125,
                                //39135.7584765625,
                                //19567.87923828125,
                                //9783.939619140625,
                                //4891.9698095703125,
                                //2445.9849047851562,
                                //1222.9924523925781,
                                //611.4962261962891,
                                //305.74811309814453,
                                //152.87405654907226,
                                76.43702827453613,
                                38.218514137268066,
                                19.109257068634033,
                                9.554628534317016,
                                4.777314267158508,
                                2.388657133579254,
                                1.194328566789627,
                                0.5971642833948135,
                ],
            });

同时,留意maxExtent给定的是900913投影的坐标,如果不知道该坐标怎么来,可以通过Proj4js库来转换获取。

时间: 2025-01-11 03:13:05

OpenLayers学习--加载指定等级指定范围的高德地图数据的相关文章

torchvision的理解和学习 加载常用数据集,对主流模型的调用.md

torchvision的理解和学习 加载常用数据集,对主流模型的调用 https://blog.csdn.net/tsq292978891/article/details/79403617 加载常用数据集,对主流模型的调用 原文地址:https://www.cnblogs.com/lishikai/p/12364671.html

asp.net动态加载程序集创建指定类的实例及调用指定方法

以下类中有三个方法: LoadAssembly:加载指定路径的程序集 GetInstance:根据Type动态获取实例,用泛型接到返回的类型 ExecuteMothod:执行实例中的指定方法 /// <summary> /// 继承自MarshalByRefObject表示允许跨域通信 /// </summary> public class RemoteLoader : MarshalByRefObject { private Assembly _assembly; public

ShellExecuteA加载exe文件指定工作目录找不到文件的问题

使用ShellExecuteA调用exe文件时,指定工作目录需要注意 函数原型为: HINSTANCE ShellExecuteA( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); MSDN中对lpDirectory是这样说明的: [in] A pointer to a null-terminated string that spe

OpenLayers 3加载本地Google切片地图

OpenLayers  提供了ol.source.XYZ 接口用以加载切片地图. 本地切片地图是用地图切片下载器下载的Google道路图层,由于软件未激活,所以每张切片地图上都有软件作者的联系方式,请忽略. 下载下来的切片地图通过Windows自带的iis发布,这样就可以通过网络地址来访问切片数据. 首先,根据ol3的接口创建了一个js方法,这个方法会根据传来的参数创建一个类型为ol.layer.Tile的图层. var TileLayer = function (options) { var

Arcgis for js,Openlayers中加载GeoJSON

概述: 在前文中,讲述了在JAVA环境下如何将shp转换为GeoJSON,在本文,分别讲述在Arcgis for js,Openlayers2和Openlayers3中加载展示GeoJSON. 实现: 1.Openlayers2中加载GeoJSON 在OL2中,可以直接调用OL2的借口实现GeoJSON的加载,代码示例: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT

OpenLayers自定义投影,转换OpenLayers中加载的OSM的默认投影坐标

giser都会遇到一个问题就是数据与底图坐标系不符合导致偏移的产生. Openlayers中应该只包含EPSG:3857和EPSG:4326,其中EPSG:3857更是作为默认的OSM底图的坐标.(这是根据官方文档以及查到资料,猜的..此处放出官网文档截图) 可是手上的数据是EPSG:4549的呀,,,于是只能辛苦自定义并转换.根据官网所说,如果用proj4.js,那么要加proj4.defs();...算了     不解释了   直接上代码(小声bb,因为作者英语不好,实在是装不了这个X,另外

openlayers 3加载百度、高德、google瓦片地图

1.加载高德地图 //高德地图 var AMapLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}' }) }); 2.google地图 //google地图 var googleMapLayer = new ol.la

ArcGIS API for JavaScript3.x 学习笔记[5] 加载底图(四)【高德在线地图】

/** * Created by WanderGIS on 2015/7/15. */ define(["dojo/_base/declare", "esri/geometry/Extent", "esri/SpatialReference", "esri/geometry/Point", "esri/layers/TileInfo", "esri/layers/TiledMapServiceLa

java学习-加载.properties工具类

javaWeb项目,要加载xxx.properties或其它如.txt, .md后缀的文本文件 文本内容有两种格式 key:value或者key=value 诸如Spring框架,Jfinal框架,都是使用java.util.Properties类来加载文本配置文件 Poperties类是按行读取key和value,所以我们写配置文件时,只能一行一个key/value键值对 这些配置文件一般会在编译时打包到WEB-INF/classes/文件夹下 我们要加载时就要通过使用下面方法获取InputS