精华内容
下载资源
问答
  • IOS 高德地图 API 加载 WMS 服务本文主要介绍通过自定义高德地图 MATileOverlay 接口,添加 WMS 服务到地图上。废话少说,先贴代码。代码自定义类 WMSTileOverlayUtil,继承自高德地图接口 MATileOverlay,主要重载...

    IOS 高德地图 API 加载 WMS 服务

    本文主要介绍通过自定义高德地图 MATileOverlay 接口,添加 WMS 服务到地图上。废话少说,先贴代码。

    代码

    自定义类 WMSTileOverlayUtil,继承自高德地图接口 MATileOverlay,主要重载函数:

    - (NSURL *)URLForTilePath:(MATileOverlayPath)path;

    - (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result;,见代码注释。

    #import

    #import

    @interface WMSTileOverlayUtil : MATileOverlay

    - (id)initWithRootURL:(NSString *)rootRUL;

    /**

    * @brief 以tile path生成URL。用于加载tile,此方法默认填充URLTemplate

    * @param path tile path

    * @return 以tile path生成tileOverlay

    */

    - (NSURL *)URLForTilePath:(MATileOverlayPath)path;

    @end

    #import "WMSTileOverlayUtil.h"

    #import

    #import

    #import

    #import "Api.h"

    @implementation WMSTileOverlayUtil

    {

    NSString * rootURL;

    NSInteger titleSize; // = 256

    double initialResolution; // = 156543.03392804062;//2*Math.PI*6378137/titleSize;

    double originShift; // = 20037508.342789244;//2*Math.PI*6378137/2.0; 周长的一半

    double HALF_PI; // = Math.PI / 2.0;

    double RAD_PER_DEGREE; // = Math.PI / 180.0;

    double METER_PER_DEGREE; // = originShift / 180.0;//一度多少米

    double DEGREE_PER_METER; // = 180.0 / originShift;//一米多少度

    }

    - (id)initWithRootURL:(NSString *)rootRUL {

    self = [super init];

    if (self) {

    rootURL = rootRUL;

    titleSize = 256;

    initialResolution = 156543.03392804062;

    originShift = 20037508.342789244;

    HALF_PI = M_PI_2;

    RAD_PER_DEGREE = M_PI / 180.0;

    METER_PER_DEGREE = originShift / 180.0;

    DEGREE_PER_METER = 180.0 / originShift;

    }

    return self;

    }

    /**

    * @brief 以tile path生成URL。用于加载tile,此方法默认填充URLTemplate

    * @param path tile path

    * @return 以tile path生成tileOverlay

    */

    - (NSURL *)URLForTilePath:(MATileOverlayPath)path {

    NSString * strURL = [[NSString alloc] initWithFormat:@"%@%@", rootURL, [self titleBoundsByX:path.x

    Y:path.y

    Z:path.z]];

    NSURL * url = [NSURL URLWithString:strURL];

    return url;

    }

    /**

    * @brief 加载被请求的tile,并以tile数据或加载tile失败error访问回调block;默认实现为首先用URLForTilePath去获取URL,然后用异步NSURLConnection加载tile

    * @param path tile path

    * @param result 用来传入tile数据或加载tile失败的error访问的回调block

    */

    - (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result {

    if (path.z < 8) return;

    NSURL * url = [self URLForTilePath:path];

    NSString * strURL = url.absoluteString;

    SuccessCallback successCallback = ^(id responseObject) {

    UIImage * image = [UIImage imageWithData:responseObject];

    NSData * data = UIImagePNGRepresentation(image);

    result(data, nil);

    };

    FailureCallBack failureCallBack = ^(NSError *error) {

    result(nil, error);

    };

    [Api GETWMSWith:strURL successCallback:successCallback failureCallBack:failureCallBack];

    }

    /**

    * @brief 取消请求瓦片,当地图显示区域发生变化时,会取消显示区域外的瓦片的下载, 当disableOffScreenTileLoading=YES时会被调用。since 5.3.0

    * @param path tile path

    */

    - (void)cancelLoadOfTileAtPath:(MATileOverlayPath)path {

    [super cancelLoadOfTileAtPath:path];

    }

    /**

    * 根据瓦片的x/y等级返回瓦片范围

    *

    * @param tx x

    * @param ty y

    * @param zoom z

    * @return url

    */

    - (NSString *)titleBoundsByX:(NSInteger)tx Y:(NSInteger)ty Z:(NSInteger)zoom {

    double minX = [self pixels2Meters:(tx * titleSize) zoom:zoom];

    double maxY = -[self pixels2Meters:(ty * titleSize) zoom:zoom];

    double maxX = [self pixels2Meters:((tx + 1) * titleSize) zoom:zoom];

    double minY = -[self pixels2Meters:((ty + 1) * titleSize) zoom:zoom];

    // 转换成经纬度 高德坐标系经纬度

    minX = [self meters2Lon:minX];

    minY = [self meters2Lat:minY];

    maxX = [self meters2Lon:maxX];

    maxY = [self meters2Lat:maxY];

    // 转换成 gps 坐标系经纬度

    CLLocationCoordinate2D gps_min = [LocationUtil GCJ02ToWGS84:CLLocationCoordinate2DMake(minY, minX)];

    CLLocationCoordinate2D gps_max = [LocationUtil GCJ02ToWGS84:CLLocationCoordinate2DMake(maxY, maxX)];

    minY = gps_min.latitude;

    minX = gps_min.longitude;

    maxY = gps_max.latitude;

    maxX = gps_max.longitude;

    NSString * result = [[NSString alloc] initWithFormat:@"%f,%f,%f,%f&width=256&height=256", minX, minY, maxX, maxY];

    return result;

    }

    /**

    * 根据像素、等级算出坐标

    *

    * @param p p

    * @param zoom z

    * @return double

    */

    - (double)pixels2Meters:(NSInteger)p zoom:(NSInteger)zoom {

    return p * [self resolution:zoom] - originShift;

    }

    /**

    * 计算分辨率

    *

    * @param zoom z

    * @return double

    */

    - (double)resolution:(NSInteger)zoom {

    return initialResolution / (pow(2, zoom));

    }

    /**

    * X米转经纬度

    */

    - (double)meters2Lon:(double)mx {

    double lon = mx * DEGREE_PER_METER;

    return lon;

    }

    /**

    * Y米转经纬度

    */

    - (double)meters2Lat:(double)my {

    double lat = my * DEGREE_PER_METER;

    lat = 180.0 / M_PI * (2 * atan(exp(lat * RAD_PER_DEGREE)) - HALF_PI);

    return lat;

    }

    @end

    其中,- (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result; 函数中,使用自己写的 网络访问层去请求 wms 服务,并通过 result 函数贴到地图上。你也可以 改写成自己的网络访问层。

    有关 gcj02 转 gps 请查看 请随手点赞

    问题

    为啥要重载 - (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result; 函数,因为只是从载 - (NSURL *)URLForTilePath:(MATileOverlayPath)path; 生成 NSURL 后,loadTileAtPath 函数会去通过网络请求加载 wms 服务,然而,这一步网络请求会报错:NSURLConnection -errorcode -1004,且一个星期没有解决为啥报错,所以只得重写,如果有熟悉高德地图 api 的小伙伴能够给予解答,不胜感激。

    注意

    如果使用 AFNetworking 要注意修改支持的类型:

    AFHTTPSessionManager * manager = [[AFHTTPSessionManager alloc] init];

    AFHTTPResponseSerializer *serializer=[AFHTTPResponseSerializer serializer];

    serializer.acceptableContentTypes = [NSSet setWithObject:@"image/png"];

    manager.responseSerializer = serializer;

    转载自:https://blog.csdn.net/Bear_861110453/article/details/81564605

    展开全文
  • 高德地图加载WMS服务

    千次阅读 2019-03-06 10:24:05
    高德加载 WMS < / title > < style > html , body , #container { margin : 0 ; padding : 0 ; width : 100 % ; height : 100 % ; } < / style > < / head > < body > < div ...

    页面展示

    高德加载WMS

    代码如下

    <!doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
        <title>高德加载WMS</title>
        <style>
            html,
            body,
            #container {
                margin: 0;
                padding: 0;
                width: 100%;
                height: 100%;
            }
        </style>
    </head>
    <body>
    <div id="container"></div>
    <script src="//webapi.amap.com/maps?v=1.4.12&key=1a37a5cfea9cc8e1dd23cdb521ef1510"></script>
    <script>
        var map = new AMap.Map('container', {
            resizeEnable: true,
            zoom: 11,
            center: [113.52448,34.71817]
        });
    
        var wms = new AMap.TileLayer.WMS({
            url: 'http://127.0.0.1:2010/geoserver/grid_map/wms',
            blend: true,
            tileSize: 256,
            params: {
                Layer: '0',
                Version: '1.0.0',
                Format: 'image/png',
                TileMatrixSet: 'EPSG:3857'
            }
        });
    
        wms.setMap(map);
    </script>
    </body>
    </html>
    
    展开全文
  • geowebcache发布arcgis切片地图wms服务,通过高德地图api调用,地图始终显示不出来。 <script> var map = new AMap.Map('container', { resizeEnable: true, zoom: 6, center: [108.8723600000, 34...

    geowebcache发布arcgis切片地图wms服务,通过高德地图api调用,地图始终显示不出来。

    <script>
        var map = new AMap.Map('container', {
            resizeEnable: true,
            zoom: 6,
            center: [108.8723600000, 34.1683880000]
        });
    
    var wms  = new AMap.TileLayer.WMS({
            url:'http://127.0.0.1:6080/geowebcache/service/wms',
            blend:true,
            zooms:[0,8],
            tileSize:256,
            params:{'LAYERS': 'chinamap',FORMAT:'image/png',Version: '1.3.0','SRS':'EPSG:3857'}
        })
    
        wms.setMap(map);
    
    </script>

    注意:红色标识地方为必填,否则地图不显示。

    高德api说明:OGC标准的WMS地图服务的GetMap接口的参数,包括VERSIONLAYERSSTYLESFORMATTRANSPARENT等,CRS、BBOX、REQUEST、WIDTH、HEIGHT等参数请勿添加

    其它wms服务不清除,但是geowebcache的,SRS参数必填,否则不显示。

     

    转载于:https://www.cnblogs.com/starpnd/p/11158905.html

    展开全文
  • Android高德地图加载WMS服务应用实践

    千次阅读 热门讨论 2017-12-14 13:48:57
    需求:在Android高德地图上需要加载wms服务,用于显示自己绘制的瓦片地图。 由于需要在指定的位置添加一小块瓦片地图,所以在制作瓦片地图时需要参照高德地图底图作为参照进行图形绘制,但是因为网上没有找到具体...

    效果图(灰色两块为自定义瓦片):


    需求:在Android高德地图上需要加载wms服务,用于显示自己绘制的瓦片地图

    由于需要在指定的位置添加一小块瓦片地图,所以在制作瓦片地图时需要参照高德地图底图作为参照进行图形绘制,但是因为网上没有找到具体可以参考的高德地图底图,本文采用天地图作为参照地图进行绘制,绘制后再通过经纬度坐标转换为高德地图对应的经纬度(网上有对应的转换代码)。

    1、在ArcGis10.2中绘制瓦片地图保存为shapefile文件格式

    本文采用ArcGis10.2进行瓦片地图的绘制,绘制前需要设置投影坐标系为EPSG:3857即墨卡托投影坐标系(900913),高德地图也正是采用此坐标系统,本地采用 “聚合天地图DOM瓦片地图服务http://www.scgis.net.cn/imap/iMapServer/defaultRest/services/newtianditudom/WMS”作为底图在其上进行绘制并导出shapefile文件。

    绘制后的图形如下:




    2、通过GeoServer加载shapefile文件并发布wms服务。

    关于部署GeoServer.war这个步骤请自行百度,图中展示了发布wms的几个关键步骤:


    完成上面几个步骤后就发布好了wms服务,地址为:http://localhost:8088/geoserver/hbgeo/wms?service=WMS&version=1.1.0&request=GetMap&layers=hbgeo:New_Shapefile2&

    styles=&bbox=1.0842895202208204E7,4378002.325541817,1.1215106468992202E7,4638208.485151819

    &width=768&height=536&srs=EPSG:3857&format=application/openlayers

    注意此处地址对于android开发我们只需要精简一下参数就可以了,bbox的值去掉(投影范围有专门的计算方法往文章后面看),format需要改为image%2Fpng(即瓦片.png图片格式),width/height默认为256也可以去掉,最后得到的地址为:

    http://192.168.58.226:8088/geoserver/hbgeo/wms?LAYERS=hbgeo:New_Shapefile2&FORMAT=image%2Fpng

    &TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1

    &REQUEST=GetMap&STYLES=&SRS=EPSG:3857&BBOX=

    到此为止wms服务地址已经准备好了,接下来只需要调用高德地图SDK中加载瓦片地图的方法即可,其中涉及到投影坐标的范围即bbox计算。

    3、调用高德地图sdk加载瓦片地址

    对于坐标系及瓦片地图加载原理可以参看里面的章节:http://weilin.me/ol3-primer/ch05/05-03.html

    bbox覆盖范围求解:

    请参考https://github.com/yxj1990/eye/wiki/%E5%85%B3%E4%BA%8E%E9%AB%98%E5%BE%B7API%

    E5%8A%A0%E8%BD%BDwms%E5%9C%B0%E5%9B%BE%E6%9C%8D%E5%8A%A1%E5%9D%90%E6%A0%87

    %E5%81%8F%E7%A7%BB%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88

    思路: (1)在墨卡托投影系中先根据行列号求出瓦片的范围(米); (2)将瓦片范围转换为度; (3)利用高德api转换工具求出正常坐标和高德坐标的差; (4)在(2)的坐标加上差值得到正确坐标,即可获取到正确的瓦片。


    调用高德地图sdk加载WMS服务地址核心片段:

    TileOverlay scopeTileOverlay;
        int titleSize = 256;
        double initialResolution = 156543.03392804062;//2*Math.PI*6378137/titleSize;//
        double originShift = 20037508.342789244;//2*Math.PI*6378137/2.0;//
        String url = "";
    
        /**
         * 添加wms图层
         */
        protected void addScope() {
            url = "http://192.168.58.226:8088/geoserver/hbgeo/wms?LAYERS=hbgeo:New_Shapefile2&FORMAT=image%2Fpng&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG:3857&BBOX=";
            TileProvider tileProvider = new UrlTileProvider(256, 256) {
                @Override
                public URL getTileUrl(int x, int y, int zoom) {
                    try {
                        System.out.println(x + "/" + y + "/" + zoom + "=====>" + url + TitleBounds(x, y, zoom));
                        return new URL(url + TitleBounds(x, y, zoom));
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            };
            if (tileProvider != null) {
                scopeTileOverlay = aMap.addTileOverlay(new TileOverlayOptions()
                        .tileProvider(tileProvider)
                        .diskCacheDir("/storage/amap/cache").diskCacheEnabled(true)
                        .diskCacheSize(100));
            }
        }
    
        /**
         * 根据像素、等级算出坐标
         *
         * @param p
         * @param zoom
         * @return
         */
        private double Pixels2Meters(int p, int zoom) {
            return p * Resolution(zoom) - originShift;
        }
    
        /**
         * 根据瓦片的x/y等级返回瓦片范围
         *
         * @param tx
         * @param ty
         * @param zoom
         * @return
         */
        private String TitleBounds(int tx, int ty, int zoom) {
            double minX = Pixels2Meters(tx * titleSize, zoom);
            double maxY = -Pixels2Meters(ty * titleSize, zoom);
            double maxX = Pixels2Meters((tx + 1) * titleSize, zoom);
            double minY = -Pixels2Meters((ty + 1) * titleSize, zoom);
    
            //转换成经纬度
            minX = Meters2Lon(minX);
            minY = Meters2Lat(minY);
            maxX = Meters2Lon(maxX);
            maxY = Meters2Lat(maxY);
            //经纬度转换米
            //        minX=Lon2Meter(minX);
            //        minY=Lat2Meter(minY);
            //        maxX=Lon2Meter(maxX);
            //        maxY=Lat2Meter(maxY);
            //坐标转换工具类构造方法 GPS( WGS-84) 转 为高德地图需要的坐标
            CoordinateConverter converter = new CoordinateConverter(this);
            converter.from(CoordinateConverter.CoordType.GPS);
            converter.coord(new LatLng(minY, minX));
            LatLng min = converter.convert();
            converter.coord(new LatLng(maxY, maxX));
            LatLng max = converter.convert();
            minX = Lon2Meter(-min.longitude + 2 * minX);
            minY = Lat2Meter(-min.latitude + 2 * minY);
            maxX = Lon2Meter(-max.longitude + 2 * maxX);
            maxY = Lat2Meter(-max.latitude + 2 * maxY);
            return Double.toString(minX) + "," + Double.toString(minY) + "," + Double.toString(maxX) + "," + Double.toString(maxY) + "&WIDTH=256&HEIGHT=256";
        }
    
        /**
         * 计算分辨率
         *
         * @param zoom
         * @return
         */
        private double Resolution(int zoom) {
            return initialResolution / (Math.pow(2, zoom));
        }
    
        /**
         * X米转经纬度
         */
        private double Meters2Lon(double mx) {
            double lon = (mx / originShift) * 180.0;
            return lon;
        }
    
        /**
         * Y米转经纬度
         */
        private double Meters2Lat(double my) {
            double lat = (my / originShift) * 180.0;
            lat = 180.0 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - Math.PI / 2.0);
            return lat;
        }
    
        /**
         * X经纬度转米
         */
        private double Lon2Meter(double lon) {
            double mx = lon * originShift / 180.0;
            return mx;
        }
    
        /**
         * Y经纬度转米
         */
        private double Lat2Meter(double lat) {
            double my = Math.log(Math.tan((90 + lat) * Math.PI / 360.0)) / (Math.PI / 180.0
            );
            my = my * originShift / 180.0;
            return my;
        }



    展开全文
  • IOS 高德地图 API 加载 WMS 服务

    热门讨论 2018-08-10 15:56:15
    IOS 高德地图 API 加载 WMS 服务 本文主要介绍通过自定义高德地图 MATileOverlay 接口,添加 WMS 服务到地图上。废话少说,先贴代码。 代码 自定义类 WMSTileOverlayUtil,继承自高德地图接口 ...
  • 自定义类 WMSTileOverlayUtil,继承自高德地图接口 MATileOverlay,主要重载函数:- (NSURL *)URLForTilePath:(MATileOverlayPath)path;- (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *...
  • Android 中使用地图加载wms服务(高德地图,谷歌地图,天地图)由于公司需求需要在移动平台上加载自己发布的wms 服务: 高德地图加载wms 谷歌地图加载wms 天地图加载wms或者wmts 目前就做了这几个地图上面加载wms 服务...
  • 本文主要将如何通过tileLayer加载高德地图,如何通过tileLayer.wms加载Geoserver的WMS服务,下面介绍主要的代码 效果图: 注:中国板块图是加载Geoserver的WMS服务完成的 一、加载高德地图代码 var url = &...
  • tileSize: 256, // 加载WMS图层服务时,图片的分片大小 params: { 'LAYERS': '0', VERSION: '1.3.0', STYLES: 'default', FORMAT: 'image/png' } // OGC标准的WMS地图服务的GetMap接口的参数 }); wms5.set...
  •  var wms = new OpenLayers.Layer.WMS(  "GPS",  "http://192.168.106.33:6080/arcgis/services/OpenlayerPoint/MapServer/WMSServer",  {  LAYERS: "2",  transparent:true  },  {  ...
  • 高德地图JSAPI提供了WMS和WMTS图层,凡是符合OGC标准的支持EPSG3857坐标系统的WMS和WMTS地图服务均可通过这两个图层添加到地图中 类名 描述 是否插件 AMap.TileLayer.WMS ...
  • GD_Geoserver.txt

    2020-09-11 17:18:12
    高德地图加载wms的整个流程(shp->geoserver->load),包括geoserevr的图层发布、style配置、绑定、geoserver跨域配置、tomcat配置、高德加载wms等的全部流程步骤
  • 高德地图JSAPI提供了WMS和WMTS图层,凡是符合OGC标准的支持EPSG3857坐标系统的WMS和WMTS地图服务均可通过这两个图层添加到地图中类名描述是否插件AMap.TileLayer.WMS用于加载OGC标准的WMS地图服务的一种图层类,自v...
  • 一、高德api加载谷歌地图示例: https://lbs.amap.com/api/javascript-api/guide/layers/wms 但是不知道为什么加载的是矢量数据,我们不妨换下别的谷歌影像url改下试试 //创建自定义切片图层,指定 getTileUrl 属性...
  •  开始开源gis的不归路,第一课便是加载底图,底图目前主流的都是wmts,以后会研究一下wms,本文介绍了普通网络在线切片(如谷歌百度高德等)、Arcgis在线切片与离线切片、openlayer在线与离线切片。通过这三类主流...
  • 我们这节主要是加载各种各样的地图,包括在线服务的地图,比如天地图、高德、OSM等,还有一些我们自己使用地图服务器发布的地图,比如使用Geoserver发布的wms地图服务,最后还介绍了常用矢量地图数据的加载,好了,...
  • QGIS有加载WMS、WMTS、WFS,以及XYZ形式的瓦片等地图服务的能力,通常可以作为空间数据的底图一起可视化出来。 本文列举一些例子记录QGIS如何使用地图服务,具体包括: XYZ XYZ的链接获取 WMTS服务,以Mapbox为例 ...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

高德加载wms