Android實現高德地圖POI搜尋
效果圖如下:
匯入高德地圖的搜尋服務包到工程的libs目錄中,並配置好許可權與使用者KEY。
許可權如下:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
使用者KEY配置如下:
<meta-data
android:name="com.amap.api.v2.apikey"
android:value ="這裡填你的KEY"/>
建立activity_main.xml佈局檔案如下,因為要實現使用者輸入直接就顯示資料,所以就沒用到搜尋按鈕。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/search_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ListView
android:id="@+id/search_list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
建立address_item.xml佈局檔案如下,用於ListView中每一個Item佈局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp" >
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="標題"
android:textSize="20sp"/>
<TextView
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="內容"
android:textColor="#FF4A4A4A"/>
</LinearLayout>
建立AddressBean實體類,程式碼如下
public class AddressBean {
private double longitude;//經度
private double latitude;//緯度
private String title;//資訊標題
private String text;//資訊內容
public AddressBean(double lon, double lat, String title, String text){
this.longitude = lon;
this.latitude = lat;
this.title = title;
this.text = text;
}
public double getLongitude() {
return longitude;
}
public double getLatitude() {
return latitude;
}
public String getTitle() {
return title;
}
public String getText(){
return text;
}
}
建立SearchAdapter資料介面卡類,程式碼如下:
public class SearchAdapter extends BaseAdapter{
private List<AddressBean> data;
private LayoutInflater li;
public SearchAdapter(Context context){
li = LayoutInflater.from(context);
}
/**
* 設定資料集
* @param data
*/
public void setData(List<AddressBean> data){
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh = null;
if(convertView == null){
vh = new ViewHolder();
convertView = li.inflate(R.layout.address_item, null);
vh.title = (TextView) convertView.findViewById(R.id.item_title);
vh.text = (TextView) convertView.findViewById(R.id.item_text);
convertView.setTag(vh);
}else{
vh = (ViewHolder) convertView.getTag();
}
vh.title.setText(data.get(position).getTitle());
vh.text.setText(data.get(position).getText());
return convertView;
}
private class ViewHolder{
public TextView title;
public TextView text;
}
}
這裡會提供方法setData()用於動態更新資料集。
建立InputTask類,封裝PoiSearch的搜尋服務,並與Adapter進行繫結。
public class InputTask implements OnPoiSearchListener {
private static InputTask mInstance;
private SearchAdapter mAdapter;
private PoiSearch mSearch;
private Context mContext;
private InputTask(Context context, SearchAdapter adapter){
this.mContext = context;
this.mAdapter = adapter;
}
/**
* 獲取例項
* @param context 上下文
* @param adapter 資料介面卡
* @return
*/
public static InputTask getInstance(Context context, SearchAdapter adapter){
if(mInstance == null){
synchronized (InputTask.class) {
if(mInstance == null){
mInstance = new InputTask(context, adapter);
}
}
}
return mInstance;
}
/**
* 設定資料介面卡
* @param adapter
*/
public void setAdapter(SearchAdapter adapter){
this.mAdapter = adapter;
}
/**
* POI搜尋
* @param key 關鍵字
* @param city 城市
*/
public void onSearch(String key, String city){
//POI搜尋條件
PoiSearch.Query query = new PoiSearch.Query(key, "", city);
mSearch = new PoiSearch(mContext, query);
//設定非同步監聽
mSearch.setOnPoiSearchListener(this);
//查詢POI非同步介面
mSearch.searchPOIAsyn();
}
/**
* 非同步搜尋回撥
*/
@Override
public void onPoiSearched(PoiResult poiResult, int rCode) {
if(rCode == 0 && poiResult != null){
ArrayList<AddressBean> data = new ArrayList<AddressBean>();
ArrayList<PoiItem> items = poiResult.getPois();
for(PoiItem item : items){
//獲取經緯度物件
LatLonPoint llp = item.getLatLonPoint();
double lon = llp.getLongitude();
double lat = llp.getLatitude();
//獲取標題
String title = item.getTitle();
//獲取內容
String text = item.getSnippet();
data.add(new AddressBean(lon, lat, title, text));
}
mAdapter.setData(data);
mAdapter.notifyDataSetChanged();
}
}
}
使用PoiSearch.Query定義搜尋條件,構造方法有三個引數分別是:搜尋關鍵字、POI類別、城市(地區)。
其中多個關鍵字用“|”分割,POI類別可以為”“空字串代表不區分類別,城市可以為”“空字串代表檢索所有城市。
在搜尋到結果回撥的時候使用notifyDataSetChanged()更新資料介面卡,實現資料動態更新。
建立MainAty類,程式碼如下:
public class MainAty extends Activity implements TextWatcher, OnItemClickListener{
private static final String TAG = "MainAty";
private EditText edit;
private ListView lv;
private SearchAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
edit = (EditText) findViewById(R.id.search_edit);
lv = (ListView) findViewById(R.id.search_list);
edit.addTextChangedListener(this);
mAdapter = new SearchAdapter(this);
lv.setAdapter(mAdapter);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
InputTask.getInstance(this, mAdapter).onSearch(s.toString(), "");
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//Item點選事件處理
}
}
實現TextWatcher,並重寫onTextChanged方法監聽輸入框資料的變化,從而實現實時更新資料。
相關推薦
Android實現高德地圖POI搜尋
效果圖如下: 匯入高德地圖的搜尋服務包到工程的libs目錄中,並配置好許可權與使用者KEY。 許可權如下: <uses-permission android:name="android.permission.INTERNET"/> <
Android實現高德地圖定位詳細流程
要實現高德地圖定位呢,首先需要做好以下幾步準備: 如果你嫌筆者寫的不好或者懶得看,只需要程式碼的話,請選擇: github:點選開啟連結,此連線可能和文章內容有所出入,因
高德地圖---Poi搜尋遇到的坑
1.根據關鍵字檢索POI 我剛開始認為這才是最關鍵的搜尋方法,可以搜尋到任何想要的資訊,但是發現,並不是,它只能搜尋到像北京這樣的城市名字,其餘的都是nothiing,但這個方法下還有這個 List<SuggestionCity> suggest
Android實現高德地圖自定義樣式
放置Android工程下的assets資料夾,在assets資料夾裡面建立了一個styleMap子資料夾。將裡面的檔案寫到sd卡中。 寫出檔案程式碼: try { // 先獲取系統
android studio實現高德地圖api定位
簡單的demo:https://my.oschina.net/zhangqie/blog/845488 SHA1值的獲取:參考高德官網:http://lbs.amap.com/faq/top/hot-questions/253/ publicstatic String sH
Android簡單實現高德地圖顯示及定位
1、要實現高德地圖的定位,首先要下載高德地圖的SDK 下載地址:http://lbs.amap.com/api/android-location-sdk/download/ 然後在高德地圖官網上登入你註冊的賬號並且去控制檯
js中實現高德地圖坐標經緯度轉百度地圖坐標
math.sqrt pan poi 結果 mat blog 筆記 百度 說明 1 function tobdMap(x, y) { 2 var x_pi = 3.14159265358979324 * 3000.0 / 180.0; 3
java實現高德地圖經緯度轉換成百度地圖
因為專案中使用到了高德地圖的API獲取到了某查詢位置的經緯度,但是頁面定位的時候是使用的百度地圖,所以這其中需要進行相應的轉碼。高德使用的是火星座標(地球座標加密後的地址),百度地圖使用的是自己加密後的經緯度。 編寫經緯度實體類 package com.liang.work.e
【Android】高德地圖根據2個座標智慧縮放地圖
需求: 在地圖上給定2個座標點,然後將2個座標點通過縮放都能顯示出來。 實現: 通過查閱高德地圖接入文件和API能找到縮放的API高德地圖文件,看到以下說明 限制地圖的顯示範圍 從地圖 SDK V4.1.0 起新增了設定地圖顯示範圍的方法,手機螢幕僅顯示設定的地圖
百度高德地圖poi資料下載
對於地圖產品而言,某個地理位置周邊的資訊,稱之為 POI 。百度地圖的官方文件中是這麼解釋的:位置資料,point of information。不過網路上也有其他的說法,point of interest ,地圖上任何
2018年高德地圖POI全國資料下載
全國商戶、樓宇、社群、公交,景點、學校、加油站,汽車維修與服務等各類地圖資料,有經緯度,電話。2018全國最新poi資料資料,詳細到樓棟出入口。 對於地圖產品而言,某個地理位置周邊的資訊,稱之為 POI 。百度地圖的官方文件中是這麼解釋的:位置資料,poin
react-native(android) 使用高德地圖
在react-native中使用高德地圖(android 端) 功能實現: 顯示地圖 定位 查詢周邊的 poi 1.安裝依賴 npm install react-native-amap3d 2.構建配置 react-native link react-nativ
高德地圖 定位 搜尋
<body> <input type="text" id="mymap_search"> <button class="search">search</button> <input type="text" name=
全國百度高德地圖poi資料下載
2018年11月11日 13:33:00 wanjiawen0260 閱讀數:15 標籤: poi
android呼叫高德地圖的方法
Intent intent2 = null;try { intent2 = Intent.getIntent("androidamap://route?sourceApplication=softname&sname=我的位置&"+"&dname="+name+"&dev
Android呼叫高德地圖app語音導航
直接呼叫高德地圖app進行導航 首先,要先進入高德開放平臺,註冊登入以後,建立自己的APP,然後會生成appkey 高德開放平臺網址: http://lbs.amap.com/ 然後下載jar包匯入專案工程之中
實現高德地圖後臺持續定位
高德地圖實現在後臺持續定位,當然需要服務,但是現在已經無法在殺死APP的時候仍然持續獲取了,我這種形式只能在APP沒被殺死的時候持續獲取,獲取到定位資訊後你可以回調出去,下面就是我這個服務 public class LocationService extends Service {
Android基於高德地圖實時定位服務
Service功能有:實時定位(後臺進行) Service不會,去百度谷歌 功能有 實時定位(30秒間隔) 判斷是否在規定的時間段內 判斷距離是否大於規定的距離 判斷服務是否在開啟的狀態 服務程式碼:LocationService(Android
js呼叫高德地圖的搜尋api
<link rel="stylesheet" href="https://cache.amap.com/lbs/static/main.css"/> <script type="text/javascript" src="https://webap
高德定位+poi搜尋
package com.amap.map2d.demo.location; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.util.Log; impo