1. 程式人生 > >LBS.雲端儲存和雲檢索應用實戰

LBS.雲端儲存和雲檢索應用實戰

用過美團外賣的小夥伴們都知道,美團通過收貨地址來為我們推薦附近的商品或者商家,如下:

這裡寫圖片描述

要想實現這個業務,需要:

  1. 知道收貨地址的座標點
  2. 知道店鋪的座標點
  3. 根據收貨地址來檢索附近的店鋪。

上一次,我們介紹了百度LBS地圖的Web端開發實戰,主要介紹了百度地圖的地圖展示、本地檢索、逆/地理編碼、覆蓋物、城市列表等關鍵功能;實現了店鋪的座標點定位。
那麼這一次我們著重介紹通過百度LBS雲端儲存和雲檢索實現“根據收貨地址來檢索附近的店鋪”的功能。

LBS.雲是百度地圖針對LBS開發者推出的平臺級服務,結合已有的地圖API和SDK服務,通過開放服務端儲存和計算能力,提供海量位置資料的實時儲存、檢索、展示一體化解決方案。
這個解決方案讓我們能夠很輕鬆地實現上述功能。

0.簡介

LBS雲提供了關鍵的nearby API,這個API主要是通過上傳一個Point的座標到LBS雲,通過nearby的檢索功能實現對附近10000米範圍的Point點檢索,通過json資料傳遞給我們開發者。
LBS云為我們提供了一個可擴充套件列的位置資料表(geotable),裡面可以儲存我們想要儲存的關鍵欄位,比如店鋪ID。

LBS雲應用的模式

這樣,我們開發者只需要關注如何儲存資料和獲取資料了。

1.LBS雲端儲存

然後到虎鯨資料管理平臺建立自己的table。

這裡寫圖片描述

我的table名為ym_shop_lbs,自定義欄位為shop_id。
我現在要做的就是將店鋪的point和ID儲存到LBS雲。

百度LBS地圖的Web端開發實戰教程中介紹到了如何儲存店鋪的Point,我們接著講。

通過ajax將point的資訊傳遞的controller。

$.showConfirm("您確定要將 " + rs.address + " 設為當前地址嗎?", function() {
// 通過ajax進行地址點的更新
$.ajax({
    type : 'POST',
    url : common.ctx + "/seller/updateShopLocation",
    dataType : "json",
    cache : false,
    data : {
        lbs_point : point.lng + ","
+ point.lat, lbs_address : rs.address, }, success : function(json) { }, error : function(xhr, ajaxOptions, thrownError) { $.showErr("更新店鋪座標失敗,稍後再試"); } });

接下來的程式碼,篇幅比較長,考慮到每個人的專案需求都不一樣,就不貼具體的程式碼了,我把幾個關鍵的程式碼,都提交到了CSDN的程式碼庫 bd_lbs_yun ,可參照。

public ModelAndView updateShopLocation() {
    Shops shop = mem.get("shop");
    String lbs_point = getPara("lbs_point");
    String lbs_address = getPara("lbs_address");
    shop.setAddress(lbs_address);

    if (StringUtils.isEmpty(shop.getLbs_point())) {
        shop.setLbs_point(lbs_point);

        // 增加座標值
        message = this.shopService.addLocation(shop);
    } else {
        shop.setLbs_point(lbs_point);

        // 更新座標值
        message = this.shopService.updateLocation(shop);
    }
}

增加座標點和更新座標點。

private Map<String, Object> createLBSParams(Shops shop) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("ak", Variables.baidu_map_key);
    params.put("geotable_id", Variables.baidu_map_table_id);

    params.put("title", shop.getPusername());// 店鋪名稱

    String[] lbs_points = shop.getLbs_point().split(",");

    // 經度
    params.put("longitude", lbs_points[0]);
    params.put("latitude", lbs_points[1]);// 店鋪緯度

    params.put("coord_type", "3");

    return params;
}
public String addLocation(Shops shop) {
    Map<String, Object> params = createLBSParams(shop);

    // 自定義列
    params.put("shop_id", shop.getPid());// 放入使用者id,或者店鋪倉庫id使用者後期檢索
    /*
     * 引數名 引數含義 型別 備註 status 狀態碼 int32 0代表成功,其它取值含義另行說明 message 響應的資訊
     * string(50) 狀態碼描述 id 新增的資料的id string
     */

    String jsonStr = BaiduLBSUtil.createPOI(params);// 返回
    CreateResData resData = JSON.parseObject(jsonStr, CreateResData.class);

    if (!resData.isSuccessed()) {
        throw new OrderException(resData.getMessage());
    }

    return "店鋪位置設定成功";// 返回新增列的id
}

BaiduLBSUtil的具體內容,可從CSDN的程式碼庫 bd_lbs_yun 下載。

3.LBS雲檢索

通過nearby方法檢索。

// 獲取列表資訊
// http://api.map.baidu.com/geosearch/v3/nearby?ak=您的ak&geotable_id=****&location=116.395884,39.932154&radius=1000&tags=酒店&sortby=distance:1|price:1&filter=price:200,300
Map<String, Object> params = new HashMap<String, Object>();
params.put("ak", Variables.baidu_map_key);
params.put("geotable_id", Variables.baidu_map_table_id);
params.put("location", lbs_point);// 收貨地址的座標點
params.put("radius", 10000);// 檢索半徑
params.put("page_index", vo.getPageNum() - 1);// 百度從0開始
params.put("page_size", vo.getNumPerPage());// 百度預設為10,最多50

String jsonStr = BaiduLBSUtil.nearby(params);// 返回

NearbyResData resData = JSON.parseObject(jsonStr, NearbyResData.class);
ArrayList<ContentData> shop_ids = resData.getContents();

需要注意的是,百度LBS雲的nearby方法本身提供了分頁功能,並且下表從0開始,不是從1開始。
獲取到shop_id後,表示大功告成了。
接下來就只需要將shop_id和自己的表進行關聯,獲取到對應的資料就可以了。

如果要顯示距離,可通過ContentData中的distance欄位來獲取。

這裡寫圖片描述

限於篇幅、以及各自專案的不同,本文提供的程式碼只能作為參照,如果還需要幫助,可以通過技術交流群和我聯絡。

不務正業的IT狗,喜歡讀書和寫作!

微信掃一掃下方二維碼即可關注 沉默王二 公眾號: