Android 中使用地图加载wms服务(高德地图,谷歌地图,天地图)
转载请注明出处: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服务(高德地图,谷歌地图,天地图)相关推荐
- Android高德地图加载WMS服务应用实践
效果图(灰色两块为自定义瓦片): 需求:在Android高德地图上需要加载wms服务,用于显示自己绘制的瓦片地图. 由于需要在指定的位置添加一小块瓦片地图,所以在制作瓦片地图时需要参照高德地图底图作为 ...
- Arcgis for Js之加载wms服务
概述:本节讲述Arcgis for Js加载ArcgisServer和GeoServer发布的wms服务. 1.定义resourceInfo var resourceInfo = { extent: ...
- ios 高德地图加载瓦片地图_IOS 高德地图 API 加载 WMS 服务
IOS 高德地图 API 加载 WMS 服务 本文主要介绍通过自定义高德地图 MATileOverlay 接口,添加 WMS 服务到地图上.废话少说,先贴代码. 代码 自定义类 WMSTileOver ...
- (十九)ArcGIS JS 加载WMS服务(超图示例)
前言 在工作中,需要在ArcGIS API for JavaScript中加载超图服务,因为超图的rest服务只可以用于Leaflet .openlayers3 (with MVT) .MapboxG ...
- android动态设置错误页面,Android中替换WebView加载网页失败时的页面
我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难 ...
- Android中获取WebView加载的html中console.log输出的内容
场景 Android中使用WebView加载本地html并支持运行JS代码和支持缩放: Android中使用WebView加载本地html并支持运行JS代码和支持缩放_BADAO_LIUMANG_QI ...
- 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决
在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决 参考文章: (1)在Android中调用KSOAP2库访问webservice服务出现的服务端 ...
- Android中的图片加载
Android中的图片加载所出现的问题 在Android的开发中,经常需要去加载图片,但是图片的尺寸有时候往往会很大,而我们的内存是有限的,加载进来的时候很有可能会造成内存溢出,这种结果也是我们不想看 ...
- android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解
Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...
最新文章
- TikTok在美逃过一劫,但在印度……
- React入门0x014: Fragment
- mysql数据库增删改查关键字_mysql数据库的增删改查
- Linux Shell脚本_较少Swap使用
- mybatis plus当月数据查询_mybatis plus的3种查询方式(小结)
- 抄底王牌tdx 副图(无未來函数)
- 【RLchina第四讲】Model-Based Reinforcement Learning
- 软件项目经理应具备的素质和条件_软件项目经理的素质能力要求
- 字节跳动大数据中心17万服务器硬实力支撑今日头条等产品线(公号回复“字节跳动”下载PDF典型资料,欢迎转发、赞赏支持科普)
- [golang]简单文件上传服务
- 中国电信天翼物联品牌升级,注智产业数字化
- Robomongo使用教程:踩着前辈的路
- 网站域名备案需要多长时间?个人经验分享
- 4.Jenkins跨站请求伪造保护关闭
- SpringBoot实现证书License的授权和验证
- 在路由器上Ez***的应用配置
- 鸿蒙系统不得不知的技术要点
- 教师如何创建百度百科词条?这篇带你了解
- 河北农业大学计算机专业保研高吗,高校尖子生保研失败 只因本科非211出身
- 像经营公司一样经营自己
热门文章
- typedef的用法,C语言typedef详解
- HTML5期末大作业:管理系统网站设计——学生信息管理系统模板 (13页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业
- 7-9 sdut-循环-乘法运算分数 10
- 详解2020数学建模国赛A题炉温曲线
- 基于FPGA的网络系统仿真分析
- End-to-End Knowledge-Routed Relational Dialogue System for Automatic Diagnosis翻译
- 国内芯片厂家种类(更新中)
- 如何提升android系统,Android系统智能手机如何提升上网速度
- Python中字典及其使用
- 对学校的希望和寄语_家长对孩子的希望和寄语