百度地圖獲取縮放級別

目前在做一個產(chǎn)品的大改版,主要是交互方式變化很大,尤其是增加了地圖相關(guān)交互盯捌,類似于滴滴、優(yōu)步首頁蘑秽。
map.png

開發(fā)時遇到的很大的一個問題就是縮放控制饺著,由于界面中同時存在地圖及輸入覆蓋層箫攀,在地圖上添加標注時需要精確控制標注顯示區(qū)域,使標注顯示范圍控制在覆蓋層區(qū)域上方幼衰。

遮蓋區(qū)域.jpeg

查閱android端相關(guān)api后發(fā)現(xiàn)縮放控制主要由此類 MapStatusUpdateFactory 間接來完成靴跛。

api.png

嘗試所有方法后發(fā)現(xiàn)百度提供的api不能同時控制地理范圍及中心點??,
MapStatusUpdateFactory.newLatLngBounds(builder.build()) 此方法可控制所有標注顯示在以地圖中心為中心點的整個地圖上渡嚣,但無法控制中心點位置梢睛。

嘗試人為構(gòu)造邊界點來控制顯示

示例.jpeg

如上圖,紅色為原始點识椰,紫色為根據(jù)當前屏幕未被覆蓋區(qū)域?qū)捀呒敖?jīng)緯度差值比例生成的邊界點绝葡,實際測試后發(fā)現(xiàn) MapStatusUpdateFactory.newLatLngBounds(builder.build()) 此方法不能完美顯示。

嘗試獲取設(shè)置中心點及縮放比例

MapStatus 此類也可控制地圖腹鹉。

  MapStatus mapStatus = new MapStatus.Builder()
                    .target(builder.build().getCenter())
                    .zoom(zoom)
                    .targetScreen(point).build();

            mMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));

FADF5D67-2020-44F9-B3B2-EC42049D7E95.png

此方法可控制中心點經(jīng)緯度及中心點屏幕坐標藏畅,適合精確控制單個點。但是MapStatus.Builder 此構(gòu)造類只提供了縮放級別設(shè)置功咒,并不能設(shè)置經(jīng)緯度范圍愉阎,在查閱了api后發(fā)現(xiàn)百度并未提供根據(jù)經(jīng)緯度范圍獲取縮放比例的api,網(wǎng)上給出的很多方法為通過比例尺力奋、縮放級別計算榜旦,很不靠譜...... 遂放棄此方法。

詢問了百度地圖的產(chǎn)品和技術(shù)刊侯,告知的方法還是通過MapStatusUpdateFactory 來完成章办,并不能達到我們的要求锉走,但是ios 提供了相關(guān)的方法 ??滨彻。

為了不影響開發(fā)進度,開發(fā)前期采用了人為構(gòu)造邊界點的方法挪蹭。

在項目主流程接近完成時亭饵,又重新開始地圖的開發(fā),對百度提供的一些類進行了仔細研究梁厉。發(fā)現(xiàn) MapStatusUpdateFactory 類的 MapStatusUpdateFactory 方法辜羊,也就是人為構(gòu)造邊界點所使用的方法:

    public static MapStatusUpdate newLatLngBounds(LatLngBounds var0) {
        if(var0 == null) {
            return null;
        } else {
            MapStatusUpdate var1 = new MapStatusUpdate(3);
            var1.d = var0;
            return var1;
        }
    }

在所構(gòu)造的 MapStatusUpdate 對象在此方法mMap.animateMapStatus(MapStatusUpdateFactory.newLatLngBounds(builder.build())); 調(diào)用過程中,會調(diào)用以下方法:

 MapStatusUpdate(int var1) {
        this.a = var1;
    }

    MapStatus a(e var1, MapStatus var2) {
        if(null != var1 && null != var2) {
            switch(this.a) {
            case 1:
                return this.b;
            case 2:
                return new MapStatus(var2.rotate, this.c, var2.overlook, var2.zoom, var2.targetScreen, (LatLngBounds)null);
            case 3:
                double var3 = 0.0D;
                double var5 = 0.0D;
                double var7 = 0.0D;
                double var9 = 0.0D;
                GeoPoint var11 = CoordUtil.ll2mc(this.d.southwest);
                GeoPoint var12 = CoordUtil.ll2mc(this.d.northeast);
                var3 = var11.getLongitudeE6();
                var5 = var12.getLatitudeE6();
                var7 = var12.getLongitudeE6();
                var9 = var11.getLatitudeE6();
                float var13 = var1.a((int)var3, (int)var5, (int)var7, (int)var9, var2.a.j.right - var2.a.j.left, var2.a.j.bottom - var2.a.j.top);
                LatLng var14 = this.d.getCenter();
                return new MapStatus(var2.rotate, var14, var2.overlook, var13, var2.targetScreen, (LatLngBounds)null);
}

case 3 返回的 MapStatus 對象的構(gòu)造方法為:

   MapStatus(float var1, LatLng var2, float var3, float var4, Point var5, LatLngBounds var6) {
        this.rotate = var1;
        this.target = var2;
        this.overlook = var3;
        this.zoom = var4;
        this.targetScreen = var5;
        if(this.target != null) {
            this.b = CoordUtil.ll2mc(this.target).getLongitudeE6();
            this.c = CoordUtil.ll2mc(this.target).getLatitudeE6();
        }

        this.bound = var6;
    }

注意這個構(gòu)造方法的 var4 參數(shù)词顾,此參數(shù)為縮放級別八秃。

傳入的值便是由此方法計算出來的:
float var13 = var1.a((int)var3, (int)var5, (int)var7, (int)var9, var2.a.j.right - var2.a.j.left, var2.a.j.bottom - var2.a.j.top);

這個類是什么鬼

public class e implements b {
     public e(Context var1, String var2) {
       this.A = var1;
       this.f = new ArrayList();
       this.an = var2;
   }
}

本想自己實例化一個對象,發(fā)現(xiàn)找不到這個 an 到底是什么東西...... 直接實例化的方法失敗了肉盹。

在經(jīng)過一番查找后昔驱,在 BaiduMap 中找到了這個類的實例

    private e i;
    BaiduMap(af var1) {
        this.j = var1;
        this.i = this.j.b();
        this.d = ad.b;
        this.c();
    }

    BaiduMap(j var1) {
        this.h = var1;
        this.i = this.h.a();
        this.d = ad.a;
        this.c();
    }

并且是在 BaiduMap 實例化時就被實例化了!I先獭骤肛!

這個屬性是 private 的纳本,并不能直接獲取,需要通過反射獲取:

        Field eField = null;
        eField = BaiduMap.class.getDeclaredField("i");
        eField.setAccessible(true);
        com.baidu.platform.comapi.map.e zoomUtils = (com.baidu.platform.comapi.map.e) eField.get(baiduMap);

獲取到這個類的實例后腋颠,就可以調(diào)用它的方法計算縮放級別了:

public float a(int var1, int var2, int var3, int var4, int var5, int var6) {
        if(!this.i) {
            return 12.0F;
        } else if(this.g == null) {
            return 0.0F;
        } else {
            Bundle var7 = new Bundle();
            var7.putInt("left", var1);
            var7.putInt("right", var3);
            var7.putInt("bottom", var4);
            var7.putInt("top", var2);
            var7.putInt("hasHW", 1);
            var7.putInt("width", var5);
            var7.putInt("height", var6);
            return this.g.c(var7);
        }
    }

傳入相關(guān)參數(shù)

       GeoPoint southwest = CoordUtil.ll2mc(builder.build().southwest);
        GeoPoint northeast = CoordUtil.ll2mc(builder.build().northeast);
        double left = southwest.getLongitudeE6();
        double top = northeast.getLatitudeE6();
        double right = northeast.getLongitudeE6();
        double bottom = southwest.getLatitudeE6();
        float zoom = zoomUtils.a((int) left, (int) top, (int) right, (int) bottom, width, height);

此時就得到縮放級別了繁成,最后的 widthheight 為顯示區(qū)域 淑玫。

上述計算方法經(jīng)過層層調(diào)用巾腕,最終會調(diào)用native方法

public class JNIBaseMap {
    public long a;

    public JNIBaseMap() {
    }

    public native float GetZoomToBound(long var1, Bundle var3);
}

實際測試中,比人為構(gòu)造邊界點的效果好很多絮蒿,但是存在寬高區(qū)域控制無效的情況祠墅,目前暫無更好的辦法,只能期望百度開放相關(guān)的接口了......

最后附上完整代碼


 public static float getFitZoom(BaiduMap baiduMap, LatLngBounds.Builder builder, int width, int height) throws Exception {
        Field eField = null;
        eField = BaiduMap.class.getDeclaredField("i");
        eField.setAccessible(true);
        com.baidu.platform.comapi.map.e zoomUtils = (com.baidu.platform.comapi.map.e) eField.get(baiduMap);
        GeoPoint southwest = CoordUtil.ll2mc(builder.build().southwest);
        GeoPoint northeast = CoordUtil.ll2mc(builder.build().northeast);
        double left = southwest.getLongitudeE6();
        double top = northeast.getLatitudeE6();
        double right = northeast.getLongitudeE6();
        double bottom = southwest.getLatitudeE6();
        float zoom = zoomUtils.a((int) left, (int) top, (int) right, (int) bottom, width, height);
        Log.e("zoom",zoom+"");
        return zoom;
    }

注:百度地圖版本4.5.2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歌径,一起剝皮案震驚了整個濱河市毁嗦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌回铛,老刑警劉巖狗准,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茵肃,居然都是意外死亡腔长,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門验残,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捞附,“玉大人,你說我怎么就攤上這事您没∧裾伲” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵氨鹏,是天一觀的道長欧募。 經(jīng)常有香客問我,道長仆抵,這世上最難降的妖魔是什么跟继? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮镣丑,結(jié)果婚禮上舔糖,老公的妹妹穿的比我還像新娘。我一直安慰自己莺匠,他們只是感情好金吗,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般辽聊。 火紅的嫁衣襯著肌膚如雪纪挎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天跟匆,我揣著相機與錄音异袄,去河邊找鬼。 笑死玛臂,一個胖子當著我的面吹牛烤蜕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迹冤,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼讽营,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泡徙?” 一聲冷哼從身側(cè)響起橱鹏,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堪藐,沒想到半個月后莉兰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡礁竞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年糖荒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片模捂。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捶朵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狂男,到底是詐尸還是另有隱情综看,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布并淋,位于F島的核電站寓搬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏县耽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一镣典、第九天 我趴在偏房一處隱蔽的房頂上張望兔毙。 院中可真熱鬧,春花似錦兄春、人聲如沸澎剥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哑姚。三九已至祭饭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叙量,已是汗流浹背倡蝙。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绞佩,地道東北人寺鸥。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像品山,于是被迫代替她去往敵國和親胆建。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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

  • 因為要做一個地圖操作的項目肘交,需要用到這個地圖庫笆载,但是查詢官方API麻煩,而且這個地圖框架的API做的用起來確實太麻...
    虛幻的銹色閱讀 33,835評論 1 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涯呻,服務(wù)發(fā)現(xiàn)宰译,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 【 申請密鑰AndroidSDK:應(yīng)用程序包名+數(shù)字簽名 As查看數(shù)字簽名:cmd-----cd .android...
    征程_Journey閱讀 2,264評論 0 5
  • 感恩幫助我的所有人魄懂,支持我的所有人 沒有反思的人生不值得過 每一個目標都要心甘情愿沿侈,都要找到堅持的原因 90天目標...
    yunzhan閱讀 140評論 0 1
  • 注定一場無根的漂泊 像落葉,像思念 那些不肯安放的 那些不肯停留的 也許是你市栗,也許是我 有顛沛流離的傷口 找不到一...
    燕返樓蘭閱讀 183評論 0 4