Android 中使用地图加载wms服务(高德地图,谷歌地图,天地图)
轉載請注明出處:http://blog.csdn.net/zkjthinking/article/details/77278838
由于公司需求需要在移動平臺上加載自己發布的wms 服務:
- 高德地圖加載wms
- 谷歌地圖加載wms
- 天地圖加載wms或者wmts
目前就做了這幾個地圖上面加載wms 服務的需求,所有只在這里寫這三種;
1.高德地圖加載wms:
代碼:
然后我們看這個自定義類中怎么寫吧
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 谷歌安裝器自動幫你安裝;
有了這些東西在手機然后下面的代碼跑起來才會起作用:
代碼:
看下自定義的代碼
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服务(高德地图,谷歌地图,天地图)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《淘宝店铺设计装修一册通》一2.6 光影
- 下一篇: 加速计简单使用---迷宫游戏