转载请注明出处:http://blog.csdn.net/zkjthinking/article/details/77278838

由于公司需求需要在移动平台上加载自己发布的wms 服务:

  • 高德地图加载wms
  • 谷歌地图加载wms
  • 天地图加载wms或者wmts

目前就做了这几个地图上面加载wms 服务的需求,所有只在这里写这三种;
1.高德地图加载wms:
代码:

//加载自定义wms在你的Activity 中加载 amap为mapview.getAmap();
HeritageScopeTileProvider tileProvider = newHeritageScopeTileProvider();
aMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));

然后我们看这个自定义类中怎么写吧

public class HeritageScopeTileProvider extends UrlTileProvider {private String mRootUrl;//默认瓦片大小private static int titleSize = 256;//a=6378137±2(m)//基本参数private final double initialResolution= 156543.03392804062;//2*Math.PI*6378137/titleSize;private final double originShift      = 20037508.342789244;//2*Math.PI*6378137/2.0; 周长的一半private final double HALF_PI = Math.PI / 2.0;private final double RAD_PER_DEGREE = Math.PI / 180.0;private final double HALF_RAD_PER_DEGREE = Math.PI / 360.0;private final double METER_PER_DEGREE = originShift / 180.0;//一度多少米private final double DEGREE_PER_METER = 180.0 / originShift;//一米多少度public HeritageScopeTileProvider() {super(titleSize, titleSize);//地址写你自己的wms地址mRootUrl = "http://xxxxxx自己的/wms?LAYERS=cwh:protect_region_38_20160830&FORMAT=image%2Fpng&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG%3A900913&BBOX=";}public HeritageScopeTileProvider(int i, int i1) {super(i, i1);}@Overridepublic URL getTileUrl(int x, int y, int level) {try {String url = mRootUrl + TitleBounds(x, y, level);return new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}return null;}/*** 根据像素、等级算出坐标** @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);PositionModel position1 = PositionUtil.gcj_To_Gps84(minY,minX);minX = position1.getWgLon();minY = position1.getWgLat();PositionModel position2 = PositionUtil.gcj_To_Gps84(maxY,maxX);maxX = position2.getWgLon();maxY = position2.getWgLat();minX=Lon2Meter(minX);minY=Lat2Meter(minY);maxX=Lon2Meter(maxX);maxY=Lat2Meter(maxY);return 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 * DEGREE_PER_METER;return lon;}/*** Y米转经纬度*/private double Meters2Lat(double my) {double lat = my * DEGREE_PER_METER;lat = 180.0 / Math.PI * (2 * Math.atan(Math.exp(lat * RAD_PER_DEGREE)) - HALF_PI);return lat;}/*** X经纬度转米*/private double Lon2Meter(double lon) {double mx = lon * METER_PER_DEGREE;return mx;}/*** Y经纬度转米*/private double Lat2Meter(double lat) {double my = Math.log(Math.tan((90 + lat) * HALF_RAD_PER_DEGREE)) / (RAD_PER_DEGREE);my = my * METER_PER_DEGREE;return my;}}

看下效果

2.谷歌地图:
谷歌地图要想在Android 中使用,必须要下载谷歌的三驾马车,google play商店, google service, google服务框架,如果需要还要有个google 账号。下载个go 谷歌安装器自动帮你安装;
有了这些东西在手机然后下面的代码跑起来才会起作用:
代码:

  //google tilelayer 添加的方式;
GoogleHeritageScopeTileProvider tileProvidergoogle = new GoogleHeritageScopeTileProvider();mMap.addTileOverlay(new com.google.android.gms.maps.model.TileOverlayOptions().tileProvider(tileProvidergoogle));

看下自定义的代码

public class GoogleHeritageScopeTileProvider extends UrlTileProvider {private String mRootUrl;//默认瓦片大小private static int titleSize = 256;//a=6378137±2(m)//基本参数private final double initialResolution= 156543.03392804062;//2*Math.PI*6378137/titleSize;private final double originShift      = 20037508.342789244;//2*Math.PI*6378137/2.0; 周长的一半private final double HALF_PI = Math.PI / 2.0;private final double RAD_PER_DEGREE = Math.PI / 180.0;private final double HALF_RAD_PER_DEGREE = Math.PI / 360.0;private final double METER_PER_DEGREE = originShift / 180.0;//一度多少米private final double DEGREE_PER_METER = 180.0 / originShift;//一米多少度public GoogleHeritageScopeTileProvider() {super(titleSize, titleSize);mRootUrl = "http://xxxxx你自己要加载/wms?LAYERS=cwh:protect_region_38_20160830&FORMAT=image%2Fpng&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG%3A900913&BBOX=";}public GoogleHeritageScopeTileProvider(int i, int i1) {super(i, i1);}@Overridepublic URL getTileUrl(int x, int y, int level) {try {String url = mRootUrl + TitleBounds(x, y, level);return new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}return null;}/*** 根据像素、等级算出坐标** @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);PositionModel position1 = PositionUtil.gcj_To_Gps84(minY,minX);minX = position1.getWgLon();minY = position1.getWgLat();PositionModel position2 = PositionUtil.gcj_To_Gps84(maxY,maxX);maxX = position2.getWgLon();maxY = position2.getWgLat();minX=Lon2Meter(minX);minY=Lat2Meter(minY);maxX=Lon2Meter(maxX);maxY=Lat2Meter(maxY);return 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 * DEGREE_PER_METER;return lon;}/*** Y米转经纬度*/private double Meters2Lat(double my) {double lat = my * DEGREE_PER_METER;lat = 180.0 / Math.PI * (2 * Math.atan(Math.exp(lat * RAD_PER_DEGREE)) - HALF_PI);return lat;}/*** X经纬度转米*/private double Lon2Meter(double lon) {double mx = lon * METER_PER_DEGREE;return mx;}/*** Y经纬度转米*/private double Lat2Meter(double lat) {double my = Math.log(Math.tan((90 + lat) * HALF_RAD_PER_DEGREE)) / (RAD_PER_DEGREE);my = my * METER_PER_DEGREE;return my;}}

效果

3.天地图加载wms或者wmts;

//必须符合人家这个发布的规定,不符合加不上去的
String url = "http://t7.tianditu.com/DataServerT=vec_c&x=13394&y=2704&l=14";
mTianDiTuMap.setCustomTileService(url);

看下源码吧



好了,可以看到加载的话,只能符合人家的规范。若不是,好像并没有好的解决方案。

总结: 从高德地图和谷歌地图添加wms,这里是不是有一些惊奇的发现了,这个添加的方式基本相同(甚至类名和方法名都相同),知道一种另一个也就会添加了。还有些更多的可以自己看看人家源码;当然高德和Google在国内都是使用GCJ-02坐标系。就是我们常说的“火星坐标系”,至于天地图这个加载wms和wmts 的方式必须符合人家的发布规定。我并没有找到可靠的在高德和谷歌地图加载wmts 的方法,如果我如果那位大牛知道。麻烦告诉我感激不尽。
demo 地址https://github.com/zkjmyy/MapForWms

Android 中使用地图加载wms服务(高德地图,谷歌地图,天地图)相关推荐

  1. Android高德地图加载WMS服务应用实践

    效果图(灰色两块为自定义瓦片): 需求:在Android高德地图上需要加载wms服务,用于显示自己绘制的瓦片地图. 由于需要在指定的位置添加一小块瓦片地图,所以在制作瓦片地图时需要参照高德地图底图作为 ...

  2. Arcgis for Js之加载wms服务

    概述:本节讲述Arcgis for Js加载ArcgisServer和GeoServer发布的wms服务. 1.定义resourceInfo var resourceInfo = { extent: ...

  3. ios 高德地图加载瓦片地图_IOS 高德地图 API 加载 WMS 服务

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

  4. (十九)ArcGIS JS 加载WMS服务(超图示例)

    前言 在工作中,需要在ArcGIS API for JavaScript中加载超图服务,因为超图的rest服务只可以用于Leaflet .openlayers3 (with MVT) .MapboxG ...

  5. android动态设置错误页面,Android中替换WebView加载网页失败时的页面

    我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难 ...

  6. Android中获取WebView加载的html中console.log输出的内容

    场景 Android中使用WebView加载本地html并支持运行JS代码和支持缩放: Android中使用WebView加载本地html并支持运行JS代码和支持缩放_BADAO_LIUMANG_QI ...

  7. 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决

    在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决 参考文章: (1)在Android中调用KSOAP2库访问webservice服务出现的服务端 ...

  8. Android中的图片加载

    Android中的图片加载所出现的问题 在Android的开发中,经常需要去加载图片,但是图片的尺寸有时候往往会很大,而我们的内存是有限的,加载进来的时候很有可能会造成内存溢出,这种结果也是我们不想看 ...

  9. android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解

    Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...

最新文章

  1. TikTok在美逃过一劫,但在印度……
  2. React入门0x014: Fragment
  3. mysql数据库增删改查关键字_mysql数据库的增删改查
  4. Linux Shell脚本_较少Swap使用
  5. mybatis plus当月数据查询_mybatis plus的3种查询方式(小结)
  6. 抄底王牌tdx 副图(无未來函数)
  7. 【RLchina第四讲】Model-Based Reinforcement Learning
  8. 软件项目经理应具备的素质和条件_软件项目经理的素质能力要求
  9. 字节跳动大数据中心17万服务器硬实力支撑今日头条等产品线(公号回复“字节跳动”下载PDF典型资料,欢迎转发、赞赏支持科普)
  10. [golang]简单文件上传服务
  11. 中国电信天翼物联品牌升级,注智产业数字化
  12. Robomongo使用教程:踩着前辈的路
  13. 网站域名备案需要多长时间?个人经验分享
  14. 4.Jenkins跨站请求伪造保护关闭
  15. SpringBoot实现证书License的授权和验证
  16. 在路由器上Ez***的应用配置
  17. 鸿蒙系统不得不知的技术要点
  18. 教师如何创建百度百科词条?这篇带你了解
  19. 河北农业大学计算机专业保研高吗,高校尖子生保研失败 只因本科非211出身
  20. 像经营公司一样经营自己

热门文章

  1. typedef的用法,C语言typedef详解
  2. HTML5期末大作业:管理系统网站设计——学生信息管理系统模板 (13页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业
  3. 7-9 sdut-循环-乘法运算分数 10
  4. 详解2020数学建模国赛A题炉温曲线
  5. 基于FPGA的网络系统仿真分析
  6. End-to-End Knowledge-Routed Relational Dialogue System for Automatic Diagnosis翻译
  7. 国内芯片厂家种类(更新中)
  8. 如何提升android系统,Android系统智能手机如何提升上网速度
  9. Python中字典及其使用
  10. 对学校的希望和寄语_家长对孩子的希望和寄语