osmdroid 中使用ArcgisServer地圖服務(wù)

osmdroid

osmdroid是一個開源項目,其目的是提供比安卓原生的MapView更為強大的地圖組件庫。osmdroid支持多種在線或者離線的瓦片地圖源以及地圖覆蓋管理器,用于繪制圖標(biāo)降铸、幾何圖形以及GPS定位住拭。

osmdroid相比于Android原生MapView的優(yōu)勢在于其豐富的瓦片地圖源和地圖覆蓋管理器了。相比于Arcgis Android Runtime SDK這種專業(yè)的GIS開發(fā)包在功能上的劣勢非常明顯柱嫌,但也有其優(yōu)勢也很明顯——輕量锋恬。一個使用了Arcgis Android Runtime SDK的APP,如果完整支持arm64-v8a编丘、armeabi-v7a与学、armeabi、x86的話嘉抓,apk文件至少60M索守,僅支持armeabi-v7a也在30M以上,而使用osmdroid的APP的APK通常只有幾M抑片。

ArcgisServer的地圖服務(wù)

Arcgis可以說是GIS領(lǐng)域最強大的軟件卵佛,沒有之一。Esri公司也是一家值得尊重的公司敞斋,一直在致力于GIS領(lǐng)域新技術(shù)的開發(fā)以及Arcgis和互聯(lián)網(wǎng)新科技的融合截汪。ArcgisServer提供了目前市場上最強大最豐富的的GIS領(lǐng)域的服務(wù),包括地圖服務(wù)植捎,瓦片服務(wù)衙解,矢量切片服務(wù),要素服務(wù)焰枢,分析服務(wù)蚓峦,幾何網(wǎng)絡(luò)服務(wù)等等等。

osmdroid主要是一個MapView医咨,矢量切片這種新技術(shù)完全不支持枫匾,瓦片服務(wù)本來就支持,只有地圖服務(wù)拟淮,osmdroid原本不支持干茉,但有潛力。這里說的潛力很泊,是因為Arcgis的地圖服務(wù)是通過export接口返回的一張圖片角虫,在數(shù)據(jù)源上與瓦片地圖沒有區(qū)別。

以瓦片的形式請求地圖服務(wù)

在ArcgisServer地圖服務(wù)的地圖請求鏈接一般形式如下:http://192.168.1.28:6080/arcgis/rest/services/NHCT/MapServer/export?bbox=114.36767578125,30.519681272749406,114.3731689453125,30.524413269923976&bboxSR=4326&size=256,256&format=png24&transparent=true&dpi=96&f=image委造,其中bbox表示請求的地圖的范圍戳鹅,size表示請求的圖片的大小,format表示請求的圖片的格式昏兆,transparent表示沒有數(shù)據(jù)的部分是否透明枫虏,如果format不為png時,transparent參數(shù)無效。f表示以圖片的形式返回隶债,另外還有json和html的形式腾它。

我們要以瓦片的形式請求地圖服務(wù),重點就在算出每個請求瓦片的bbox死讹,其邏輯代碼如下瞒滴。

public static BoundingBox tile2boundingBox(final int x, final int y, final int zoom) 
{
    BoundingBox bb = new BoundingBox(tile2lat(y, zoom), tile2lon(x + 1, zoom), tile2lat(y + 1, zoom), tile2lon(x, zoom));
    return bb;
}

public static double tile2lon(int x, int z) {
    return x / Math.pow(2.0, z) * 360.0 - 180;
}

public static double tile2lat(int y, int z) {
    double n = Math.PI - (2.0 * Math.PI * y) / Math.pow(2.0, z);
    return Math.toDegrees(Math.atan(Math.sinh(n)));
}

當(dāng)然如果是莫卡托投影的,就不是經(jīng)緯度了

public  double[] getBoundingBox(int x, int y, int zoom) {
    double tileSize = MAP_SIZE / Math.pow(2, zoom);
    double minx = TILE_ORIGIN[ORIG_X] + x * tileSize;
    double maxx = TILE_ORIGIN[ORIG_X] + (x + 1) * tileSize;
    double miny = TILE_ORIGIN[ORIG_Y] - (y + 1) * tileSize;
    double maxy = TILE_ORIGIN[ORIG_Y] - y * tileSize;

    double[] bbox = new double[4];
    bbox[MINX] = minx;
    bbox[MINY] = miny;
    bbox[MAXX] = maxx;
    bbox[MAXY] = maxy;

    return bbox;
}

然后照著請求瓦片一樣請求就可以了

@Override
public String getTileURLString(long pMapTileIndex) {
    String baseUrl = getBaseUrl();
    if (forceHttps)
        baseUrl = baseUrl.replace("http://", "https://");
    if (forceHttp)
        baseUrl = baseUrl.replace("https://", "http://");
    StringBuilder sb = new StringBuilder(baseUrl);
    if (!baseUrl.endsWith("/"))
        sb.append("/");
    sb.append("export?").append("bbox=");
    if (srs.equals("EPSG:900913")) {
        double[] bbox = getBoundingBox(MapTileIndex.getX(pMapTileIndex), MapTileIndex.getY(pMapTileIndex), MapTileIndex.getZoom(pMapTileIndex));
        sb.append(bbox[MINX]).append(",");
        sb.append(bbox[MINY]).append(",");
        sb.append(bbox[MAXX]).append(",");
        sb.append(bbox[MAXY]);
    } else {
        BoundingBox boundingBox = tile2boundingBox(MapTileIndex.getX(pMapTileIndex), MapTileIndex.getY(pMapTileIndex), MapTileIndex.getZoom(pMapTileIndex));
        sb.append(boundingBox.getLonWest()).append(",");
        sb.append(boundingBox.getLatSouth()).append(",");
        sb.append(boundingBox.getLonEast()).append(",");
        sb.append(boundingBox.getLatNorth());
    }
    sb.append("&bboxSR=").append(srs.replace("EPSG:","")).append("&size=").append(getTileSizePixels()).append(",").append(getTileSizePixels());
    sb.append("&format=png24").append("&transparent=true").append("&dpi=96").append("&f=image");
    String str = sb.toString();
    return str;
}

這個思路不是我的赞警,而是在osmdroid中自帶一個osmdroid-wms的子項目妓忍,我心想WMS和ArcgisServer的地圖服務(wù)原理一致,前者可以后者當(dāng)然也可以愧旦,所以就仔細閱讀了一下osmdroid-wms的源碼世剖,參照WMSTileSource類寫了一個ArcgisServer地圖服務(wù)的DataSource,核心代碼就是上面那些了笤虫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搁廓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子耕皮,更是在濱河造成了極大的恐慌,老刑警劉巖蝙场,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凌停,死亡現(xiàn)場離奇詭異,居然都是意外死亡售滤,警方通過查閱死者的電腦和手機罚拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來完箩,“玉大人赐俗,你說我怎么就攤上這事”字” “怎么了阻逮?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秩彤。 經(jīng)常有香客問我叔扼,道長,這世上最難降的妖魔是什么漫雷? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任瓜富,我火速辦了婚禮,結(jié)果婚禮上降盹,老公的妹妹穿的比我還像新娘与柑。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布价捧。 她就那樣靜靜地躺著丑念,像睡著了一般。 火紅的嫁衣襯著肌膚如雪干旧。 梳的紋絲不亂的頭發(fā)上渠欺,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音椎眯,去河邊找鬼挠将。 笑死,一個胖子當(dāng)著我的面吹牛编整,可吹牛的內(nèi)容都是我干的舔稀。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼掌测,長吁一口氣:“原來是場噩夢啊……” “哼内贮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汞斧,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤夜郁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粘勒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竞端,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年庙睡,在試婚紗的時候發(fā)現(xiàn)自己被綠了事富。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡乘陪,死狀恐怖统台,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啡邑,我是刑警寧澤贱勃,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站谣拣,受9級特大地震影響募寨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜森缠,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一拔鹰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贵涵,春花似錦列肢、人聲如沸恰画。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拴还。三九已至,卻和暖如春欧聘,著一層夾襖步出監(jiān)牢的瞬間片林,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工怀骤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留费封,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓蒋伦,卻偏偏與公主長得像弓摘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痕届,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容