高德地图五:室内地图功能
生活随笔
收集整理的這篇文章主要介紹了
高德地图五:室内地图功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
高德地圖五:室內地圖功能
什么是室內地圖
室內地圖一般指大型室內建筑的內部地圖,與室外地圖相比,更注重小區域、大比例尺、高精度和精細化的內部元素展現。
室內地圖涉及商業設施、交通設施、文化設施、教育設施、醫療設施、演出場館等大型室內場館的地圖深度精細數據,天然具備豐富多樣的應用場景和業務,
可基于室內地圖擴展各種行業的業務應用。
室內地圖數據
室內地圖數據,較之室外,更加精細;且室內建筑類型多樣,使得室內地圖數據更加復雜。既包括吸煙室、充電處、問訊處、ATM、母嬰室等在內的室內公共設施,
也包括扶梯、電梯、樓梯、商鋪門、出入口等在內的室內通行設施;既包括詳細的屬性信息,也包括精準位置的空間信息。與此同時,室內地圖數據對數據空間
坐標精度也有較高要求。
地圖數據是地圖應用的基礎,需要嚴格控制數據質量,以更好地支撐地圖應用。
室內地圖數據生產需要依據專業的地圖數據生產流程,遵循標準的室內地圖數據生產標準和規范,歷經嚴格的內外業處理以及質檢處理,才能滿足數據質量要求,滿足地圖應用需要。
實例:
layout/activity_main.xml
com/example/administrator/MainActivity.java
package com.example.administrator;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import com.amap.api.maps.AMap;import com.amap.api.maps.AMap.OnMapLoadedListener;import com.amap.api.maps.CameraUpdateFactory;import com.amap.api.maps.MapView;import com.amap.api.maps.model.IndoorBuildingInfo;import com.amap.api.maps.model.LatLng;public class MainActivity extends Activity{private MapView mapView;private AMap aMap;IndoorFloorSwitchView floorSwitchView;private Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mapView = (MapView) findViewById(R.id.map);mapView.onCreate(savedInstanceState);// 此方法必須重寫floorSwitchView = (IndoorFloorSwitchView) findViewById(R.id.indoor_switchview);init();// 設置樓層控制控件監聽floorSwitchView.setOnIndoorFloorSwitchListener(new MyIndoorSwitchViewAdapter());// 設置室內地圖回調監聽aMap.setOnIndoorBuildingActiveListener(new AMap.OnIndoorBuildingActiveListener() {@Overridepublic void OnIndoorBuilding(final IndoorBuildingInfo indoorBuildingInfo) {Log.i("amap", "indoor OnIndoorBuilding " + indoorBuildingInfo);if (indoorBuildingInfo != null) {handler.post(new Runnable() {@Overridepublic void run() {floorSwitchView.setVisible(true);//相同室內圖,不需要替換樓層總數,只需要設置選中的樓層即可if (mIndoorBuildingInfo == null || !mIndoorBuildingInfo.poiid.equals(indoorBuildingInfo.poiid)) {floorSwitchView.setItems(indoorBuildingInfo.floor_names);floorSwitchView.setSeletion(indoorBuildingInfo.activeFloorName);}mIndoorBuildingInfo = indoorBuildingInfo;}});} else {Log.i("amap", "indoor OnIndoorBuilding indoor disappear");floorSwitchView.setVisible(false);}}});aMap.setOnMapLoadedListener(new OnMapLoadedListener() {@Overridepublic void onMapLoaded() {// 室內地圖默認不顯示,這里把它設置成顯示aMap.showIndoorMap(true);// 關閉SDK自帶的室內地圖控件aMap.getUiSettings().setIndoorSwitchEnabled(false);//移動到有室內地圖的地方,放大級別才可以看見aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(39.91095, 116.37296), 19));}});}/*** 初始化AMap對象*/private void init() {if (aMap == null) {aMap = mapView.getMap();aMap.getUiSettings().setScaleControlsEnabled(true);}}/*** 方法必須重寫*/@Overrideprotected void onResume() {super.onResume();mapView.onResume();}/*** 方法必須重寫*/@Overrideprotected void onPause() {super.onPause();mapView.onPause();}/*** 方法必須重寫*/@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}/*** 方法必須重寫*/@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}/*** 室內地圖信息*/IndoorBuildingInfo mIndoorBuildingInfo = null;private class MyIndoorSwitchViewAdapter implements IndoorFloorSwitchView.OnIndoorFloorSwitchListener {@Overridepublic void onSelected(final int selectedIndex) {Log.i("amap", "indoor onselected " + selectedIndex);if (mIndoorBuildingInfo != null) {mIndoorBuildingInfo.activeFloorIndex = mIndoorBuildingInfo.floor_indexs[selectedIndex];mIndoorBuildingInfo.activeFloorName = mIndoorBuildingInfo.floor_names[selectedIndex];aMap.setIndoorBuildingInfo(mIndoorBuildingInfo);}}}}com/example/administrator/IndoorFloorSwitchView.java
package com.example.administrator;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.ColorFilter;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.text.TextPaint;import android.util.AttributeSet;import android.util.TypedValue;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import android.widget.ScrollView;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/*** 樓層控制控件*/public class IndoorFloorSwitchView extends ScrollView {public static final String TAG = IndoorFloorSwitchView.class.getSimpleName();private Context context;private LinearLayout views;private int itemHeight = 0;private List<String> items;private int scrollDirection = -1;private static final int SCROLL_DIRECTION_UP = 0;private static final int SCROLL_DIRECTION_DOWN = 1;private int viewWidth;private Bitmap selectBitmap = null;private int backGroundColor = Color.parseColor("#eeffffff");private int strokeColor = Color.parseColor("#44383838");private int strokeWidth = 4; // 邊框寬度private int offset = 1; // 偏移量在最前面和最后面補全private int displayItemCount; // 每頁顯示的數int selectedIndex = 1;private int initialY;private Runnable scrollerTask;private int newCheck = 50;public IndoorFloorSwitchView(Context context) {super(context);init(context);}public IndoorFloorSwitchView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public IndoorFloorSwitchView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);init(context);}public int getOffset() {return offset;}/*** 修改偏移量,即當第一個顯示在中間是上面有幾個空白<br>* 也會影響整體顯示,如設置1,上下各偏移1,總共顯3個;設置2總共顯示5個;** @param offset*/public void setOffset(int offset) {this.offset = offset;}private void init(Context context) {this.context = context;this.setVerticalScrollBarEnabled(false);selectBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.map_indoor_select);views = new LinearLayout(context);views.setOrientation(LinearLayout.VERTICAL);this.addView(views);scrollerTask = new Runnable() {public void run() {int newY = getScrollY();if (initialY - newY == 0) { // stoppedfinal int remainder = initialY % itemHeight;final int divided = initialY / itemHeight;if (remainder == 0) {selectedIndex = divided + offset;onSeletedCallBack();} else {if (remainder > itemHeight / 2) {IndoorFloorSwitchView.this.post(new Runnable() {@Overridepublic void run() {IndoorFloorSwitchView.this.smoothScrollTo(0, initialY - remainder+ itemHeight);selectedIndex = divided + offset + 1;onSeletedCallBack();}});} else {IndoorFloorSwitchView.this.post(new Runnable() {@Overridepublic void run() {IndoorFloorSwitchView.this.smoothScrollTo(0, initialY - remainder);selectedIndex = divided + offset;onSeletedCallBack();}});}}} else {initialY = getScrollY();IndoorFloorSwitchView.this.postDelayed(scrollerTask,newCheck);}}};}public void startScrollerTask() {initialY = getScrollY();this.postDelayed(scrollerTask, newCheck);}private void initData() {if(items==null||items.size()==0){return;}views.removeAllViews();displayItemCount = offset * 2 + 1;for (int i=items.size()-1;i>=0;i--) {views.addView(createView(items.get(i)));}refreshItemView(0);}private TextView createView(String item) {TextView tv = new TextView(context);tv.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));tv.setSingleLine(true);tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);tv.setText(item);tv.setGravity(Gravity.CENTER);TextPaint tp = tv.getPaint();tp.setFakeBoldText(true);int padding_h = dip2px(context, 8);int padding_v = dip2px(context, 6);tv.setPadding(padding_h, padding_v, padding_h, padding_v);if (0 == itemHeight) {itemHeight = getViewMeasuredHeight(tv);views.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, itemHeight* displayItemCount));this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, itemHeight * displayItemCount));}return tv;}private void refreshItemView(int y) {int position = y / itemHeight + offset;int remainder = y % itemHeight;int divided = y / itemHeight;if (remainder == 0) {position = divided + offset;} else {if (remainder > itemHeight / 2) {position = divided + offset + 1;}}int childSize = views.getChildCount();for (int i = 0; i < childSize; i++) {TextView itemView = (TextView) views.getChildAt(i);if (null == itemView) {return;}if (position == i) {itemView.setTextColor(Color.parseColor("#0288ce"));} else {itemView.setTextColor(Color.parseColor("#bbbbbb"));}}}private List<String> getItems() {return items;}/*** 設置顯示的內*** @param list*/public void setItems(List<String> list) {if (null == items) {items = new ArrayList<String>();}items.clear();items.addAll(list);// 前面和后面補for (int i = 0; i < offset; i++) {items.add(0, "");items.add("");}initData();}/*** 設置顯示的內*** @param strs*/public void setItems(String[] strs) {if (null == items) {items = new ArrayList<String>();}items.clear();for (int i = 0; i < strs.length; i++)items.add(strs[i]);// 前面和后面補for (int i = 0; i < offset; i++) {items.add(0, "");items.add("");}initData();}public void setBackgroundColor(int color) {this.backGroundColor = color;}public void setStrokeColor(int color) {this.strokeColor = color;}public void setStrokeWidth(int width) {this.strokeWidth = width;}/*** 設置選中狀圖片** @param bitmap*/public void setIndoorSelectBitmap(Bitmap bitmap) {this.selectBitmap = bitmap;}public void destroy() {if (selectBitmap != null && !selectBitmap.isRecycled()) {selectBitmap.recycle();selectBitmap = null;}}@Overridepublic void setBackgroundDrawable(Drawable background) {if (viewWidth == 0) {viewWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();}background = new Drawable() {@Overridepublic void draw(Canvas canvas) {try {drawBg(canvas);drawCenterLine(canvas);drawStroke(canvas);} catch (Throwable e) {}}private void drawBg(Canvas canvas) {canvas.drawColor(backGroundColor);}/*** @param canvas*/private void drawCenterLine(Canvas canvas) {final Paint paint = new Paint();Rect src = new Rect();// 圖片 >>原矩Rect dst = new Rect();// 屏幕 >>目標矩形src.left = 0;src.top = 0;src.right = 0 + selectBitmap.getWidth();src.bottom = 0 + selectBitmap.getHeight();dst.left = 0;dst.top = obtainSelectedAreaBorder()[0];dst.right = 0 + viewWidth;dst.bottom = obtainSelectedAreaBorder()[1];canvas.drawBitmap(selectBitmap, src, dst, paint);}/*** @param canvas*/private void drawStroke(Canvas canvas) {final Paint mPaint = new Paint();Rect rect = canvas.getClipBounds();mPaint.setColor(strokeColor);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(strokeWidth);canvas.drawRect(rect, mPaint);}@Overridepublic void setAlpha(int alpha) {}@Overridepublic void setColorFilter(ColorFilter cf) {}@Overridepublic int getOpacity() {return 0;}};super.setBackgroundDrawable(background);}/*** 獲取選中區域的邊*/private int[] obtainSelectedAreaBorder() {int[] selectedAreaBorder = null;if (null == selectedAreaBorder) {selectedAreaBorder = new int[2];selectedAreaBorder[0] = itemHeight * offset;selectedAreaBorder[1] = itemHeight * (offset + 1);}return selectedAreaBorder;}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);viewWidth = w;setBackgroundDrawable(null);}@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);refreshItemView(t);if (t > oldt) {scrollDirection = SCROLL_DIRECTION_DOWN;} else {scrollDirection = SCROLL_DIRECTION_UP;}}/*** 選中回調*/private void onSeletedCallBack() {if (null != onIndoorFloorSwtichListener) {try {onIndoorFloorSwtichListener.onSelected(getSeletedIndex());} catch (Throwable e) {}}}public void setSeletion(String selectValue) {if(items==null||items.size()==0){return;}int position = items.indexOf(selectValue);final int p = items.size()-offset-1-position;selectedIndex = p + offset;this.post(new Runnable() {@Overridepublic void run() {IndoorFloorSwitchView.this.smoothScrollTo(0, p * itemHeight);}});}public String getSeletedItem() {return items.get(selectedIndex);}public int getSeletedIndex() {if(items==null||items.size()==0){return 0;}int result = items.size()-1-selectedIndex - offset;return Math.min(items.size() - 2 * offset, Math.max(0, result));}@Overridepublic void fling(int velocityY) {super.fling(velocityY / 3);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_UP) {startScrollerTask();}return super.onTouchEvent(ev);}private OnIndoorFloorSwitchListener onIndoorFloorSwtichListener;public OnIndoorFloorSwitchListener getOnIndoorFloorSwitchListener() {return onIndoorFloorSwtichListener;}public void setOnIndoorFloorSwitchListener(OnIndoorFloorSwitchListener onIndoorFloorSwtichListener) {this.onIndoorFloorSwtichListener = onIndoorFloorSwtichListener;}public static abstract interface OnIndoorFloorSwitchListener {public abstract void onSelected(int selectedIndex);}// utilspublic static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}/*** 獲取控件的高度,如果獲取的高度為0,則重新計算尺寸后再返回高度** @param view* @return*/public static int getViewMeasuredHeight(View view) {calcViewMeasure(view);return view.getMeasuredHeight();}/*** 獲取控件的寬度,如果獲取的寬度為0,則重新計算尺寸后再返回寬度** @param view* @return*/public static int getViewMeasuredWidth(View view) {calcViewMeasure(view);return view.getMeasuredWidth();}/*** 測量控件的尺*** @param view*/public static void calcViewMeasure(View view) {int width = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);view.measure(width, expandSpec);}public void setVisible(boolean isEnable) {if (isEnable) {if(!isVisible()) {setVisibility(VISIBLE);}} else {if(isVisible())setVisibility(GONE);}}public boolean isVisible() {return getVisibility() == VISIBLE ? true : false;}}總結
以上是生活随笔為你收集整理的高德地图五:室内地图功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开关电源三大拓扑之 Boost 电源中P
- 下一篇: Android—App—必备开发组件—调