android开发百度地图坐标偏差,利用百度地图Android sdk高仿微信发送位置功能及遇到的问题...

接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶

我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出

1、在微信发送功能中,不管用户如何拖拽地图,总有个覆盖物固定了MapView中央,怎么实现?

其实这很容易实现,只要MapView的布局文件中,将一个ImageView覆盖在MapView的中央,就能够实现不管用户如何拖拽地图,覆盖物(ImageView)总固定总MapView中央

2、如何获取MapView中央的地理坐标,也即是屏幕覆盖物处的坐标?

要获取MapView中央的地理坐标,首先先获取覆盖物在屏幕上的物理坐标,这里得区别一下地理坐标(经纬度)和物理坐标(xy轴);

可以通过

来获取物理坐标,这个物理坐标是不变的,而物理坐标对应的地理坐标却是随着用户拖拽地图而改变,所以,当我们需要地理坐标时,可以通过

currentLatLng = mBaiduMap.getProjection().fromScreenLocation(

mCenterPoint);

获取。

3、如何获取该地理坐标周围的所有poi信息(也就是周围建筑物的信息),而不只是某个类型的兴趣点?

为了实现这个功能,真是费了我好大劲,因为我之前一直以为用POI周边搜索实现的,有人提示我可以通过循环轴线搜索实现不同关键字搜索,但这样子确实很难实现跟微信那样的效果。通过查看API,发现可以通过反地理编码解决这个问题,至于什么事反地理编码,可以到百度地图官网了解,通过调用它,可以返回一个该地理坐标附近建筑信息的一个列表

4、当用户拖拽地图,如何让列表更新到目前中心地理位置的周边信息?

这个困难其实也不难实现,只是重写mBaiduMap.setOnMapTouchListener(touchListener);触摸事件,在触摸监听器的回调函数中

将MapView中央的物理坐标转换成对应的地理坐标,再通过反地理编码获取周边信息,道理同问题3

5、当点击listview某一项时,如何将项地理位置显示在MapView也就是屏幕中央?

很简单,通过listview的适配器获取item的位置信息,包括经纬度,然后用动画跳转到屏幕中央位置即可。

我认为上面5个问题是实现这个功能的关键所在,下面是效果图

034a7982e9328ad4dbeec58ef2520b80.png

上面是一个MapVIew,覆盖物固定在其中央,地图左下角的白色正方形是回到定位点的按钮,因为没找到好看的图片,就留着空白了

下面是一个listView,显示地图指示地点周围的一些位置信息

贴一下实现该功能的核心代码

Activity类

package com.vr.souhuodong.UI.Sou;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.content.Intent;

import android.graphics.Point;

import android.net.Uri;

import android.os.Bundle;

import android.view.MotionEvent;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ImageView;

import android.widget.ListView;

import android.widget.ProgressBar;

import com.baidu.location.BDLocation;

import com.baidu.location.BDLocationListener;

import com.baidu.location.LocationClient;

import com.baidu.location.LocationClientOption;

import com.baidu.mapapi.map.BaiduMap;

import com.baidu.mapapi.map.BaiduMap.OnMapTouchListener;

import com.baidu.mapapi.map.BitmapDescriptor;

import com.baidu.mapapi.map.BitmapDescriptorFactory;

import com.baidu.mapapi.map.MapStatusUpdate;

import com.baidu.mapapi.map.MapStatusUpdateFactory;

import com.baidu.mapapi.map.MapView;

import com.baidu.mapapi.map.MarkerOptions;

import com.baidu.mapapi.map.MyLocationConfiguration;

import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;

import com.baidu.mapapi.map.MyLocationData;

import com.baidu.mapapi.map.OverlayOptions;

import com.baidu.mapapi.model.LatLng;

import com.baidu.mapapi.search.core.PoiInfo;

import com.baidu.mapapi.search.core.SearchResult;

import com.baidu.mapapi.search.geocode.GeoCodeResult;

import com.baidu.mapapi.search.geocode.GeoCoder;

import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;

import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;

import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;

import com.vr.souhuodong.R;

import com.vr.souhuodong.UI.Adapter.PlaceListAdapter;

public class ChoosePlaceActivity extends Activity {

MapView mMapView;

BaiduMap mBaiduMap;

ProgressBar mLoadBar;

ImageView mSelectImg;

// 定位

LocationClient mLocationClient = null;

MyBDLocationListner mListner = null;

BitmapDescriptor mCurrentMarker = null;

// 当前经纬度

double mLantitude;

double mLongtitude;

LatLng mLoactionLatLng;

// 设置第一次定位标志

boolean isFirstLoc = true;

// MapView中央对于的屏幕坐标

Point mCenterPoint = null;

// 地理编码

GeoCoder mGeoCoder = null;

// 位置列表

ListView mListView;

PlaceListAdapter mAdapter;

List mInfoList;

PoiInfo mCurentInfo;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_chooseplace);

initView();

}

/**

* 初始化界面

*/

private void initView() {

// TODO Auto-generated method stub

// 初始化地图

mMapView = (MapView) findViewById(R.id.chooseplace_bmapView);

mMapView.showZoomControls(false);

mBaiduMap = mMapView.getMap();

MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f);

mBaiduMap.setMapStatus(msu);

mBaiduMap.setOnMapTouchListener(touchListener);

// 初始化POI信息列表

mInfoList = new ArrayList();

// 初始化当前MapView中心屏幕坐标,初始化当前地理坐标

mCenterPoint = mBaiduMap.getMapStatus().targetScreen;

mLoactionLatLng = mBaiduMap.getMapStatus().target;

// 定位

mBaiduMap.setMyLocationEnabled(true);

mLocationClient = new LocationClient(this);

mListner = new MyBDLocationListner();

mLocationClient.registerLocationListener(mListner);

LocationClientOption option = new LocationClientOption();

option.setOpenGps(true);// 打开gps

option.setCoorType("bd09ll"); // 设置坐标类型

option.setScanSpan(1000);

mLocationClient.setLocOption(option);

mLocationClient.start();

// 地理编码

mGeoCoder = GeoCoder.newInstance();

mGeoCoder.setOnGetGeoCodeResultListener(GeoListener);

// 周边位置列表

mListView = (ListView) findViewById(R.id.place_list);

mLoadBar = (ProgressBar) findViewById(R.id.place_progressBar);

mListView.setOnItemClickListener(itemClickListener);

mAdapter = new PlaceListAdapter(getLayoutInflater(), mInfoList);

mListView.setAdapter(mAdapter);

mSelectImg = new ImageView(this);

}

public void turnBack(View view) {

// 实现动画跳转

MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(mLoactionLatLng);

mBaiduMap.animateMapStatus(u);

mBaiduMap.clear();

// 发起反地理编码检索

mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())

.location(mLoactionLatLng));

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

mLocationClient.stop();

mGeoCoder.destroy();

}

// 定位监听器

private class MyBDLocationListner implements BDLocationListener {

@Override

public void onReceiveLocation(BDLocation location) {

// TODO Auto-generated method stub

// map view 销毁后不在处理新接收的位置

if (location == null || mMapView == null)

return;

MyLocationData data = new MyLocationData.Builder()//

// .direction(mCurrentX)//

.accuracy(location.getRadius())//

.latitude(location.getLatitude())//

.longitude(location.getLongitude())//

.build();

mBaiduMap.setMyLocationData(data);

// 设置自定义图标

MyLocationConfiguration config = new MyLocationConfiguration(

LocationMode.NORMAL, true, null);

mBaiduMap.setMyLocationConfigeration(config);

mLantitude = location.getLatitude();

mLongtitude = location.getLongitude();

LatLng currentLatLng = new LatLng(mLantitude, mLongtitude);

mLoactionLatLng = new LatLng(mLantitude, mLongtitude);

// 是否第一次定位

if (isFirstLoc) {

isFirstLoc = false;

// 实现动画跳转

MapStatusUpdate u = MapStatusUpdateFactory

.newLatLng(currentLatLng);

mBaiduMap.animateMapStatus(u);

mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())

.location(currentLatLng));

return;

}

}

}

// 地理编码监听器

OnGetGeoCoderResultListener GeoListener = new OnGetGeoCoderResultListener() {

public void onGetGeoCodeResult(GeoCodeResult result) {

if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {

// 没有检索到结果

}

// 获取地理编码结果

}

@Override

public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {

if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {

// 没有找到检索结果

}

// 获取反向地理编码结果

else {

// 当前位置信息

mCurentInfo = new PoiInfo();

mCurentInfo.address = result.getAddress();

mCurentInfo.location = result.getLocation();

mCurentInfo.name = "[位置]";

mInfoList.clear();

mInfoList.add(mCurentInfo);

// 将周边信息加入表

if (result.getPoiList() != null) {

mInfoList.addAll(result.getPoiList());

}

// 通知适配数据已改变

mAdapter.notifyDataSetChanged();

mLoadBar.setVisibility(View.GONE);

}

}

};

// 地图触摸事件监听器

OnMapTouchListener touchListener = new OnMapTouchListener() {

@Override

public void onTouch(MotionEvent event) {

// TODO Auto-generated method stub

if (event.getAction() == MotionEvent.ACTION_UP) {

if (mCenterPoint == null) {

return;

}

// 获取当前MapView中心屏幕坐标对应的地理坐标

LatLng currentLatLng;

currentLatLng = mBaiduMap.getProjection().fromScreenLocation(

mCenterPoint);

System.out.println("----" + mCenterPoint.x);

System.out.println("----" + currentLatLng.latitude);

// 发起反地理编码检索

mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())

.location(currentLatLng));

mLoadBar.setVisibility(View.VISIBLE);

}

}

};

// listView选项点击事件监听器

OnItemClickListener itemClickListener = new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position,

long id) {

// TODO Auto-generated method stub

// 通知是适配器第position个item被选择了

mAdapter.setNotifyTip(position);

BitmapDescriptor mSelectIco = BitmapDescriptorFactory

.fromResource(R.drawable.icon_geo);

mBaiduMap.clear();

PoiInfo info = (PoiInfo) mAdapter.getItem(position);

LatLng la = info.location;

// 动画跳转

MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(la);

mBaiduMap.animateMapStatus(u);

// 添加覆盖物

OverlayOptions ooA = new MarkerOptions().position(la)

.icon(mSelectIco).anchor(0.5f, 0.5f);

mBaiduMap.addOverlay(ooA);

// 选中项打勾

mSelectImg.setBackgroundResource(R.drawable.greywhite);

mSelectImg = (ImageView) view.findViewById(R.id.place_select);

mSelectImg.setBackgroundResource(R.drawable.ic_select);

// Uri mUri = Uri.parse("geo:39.940409,116.355257");

// Intent mIntent = new Intent(Intent.ACTION_VIEW,mUri);

// startActivity(mIntent);

}

};

}

自定义的listView适配器

package com.vr.souhuodong.UI.Adapter;

import java.util.List;

import android.R.integer;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

import com.baidu.mapapi.search.core.PoiInfo;

import com.vr.souhuodong.R;

public class PlaceListAdapter extends BaseAdapter {

List mList;

LayoutInflater mInflater;

int notifyTip ;

private class MyViewHolder {

TextView placeName;

TextView placeAddree;

ImageView placeSelected;

}

public PlaceListAdapter(LayoutInflater mInflater , List mList) {

super();

this.mList = mList;

this.mInflater = mInflater;

notifyTip = -1 ;

}

/**

* 设置第几个item被选择

* @param notifyTip

*/

public void setNotifyTip(int notifyTip) {

this.notifyTip = notifyTip;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return mList.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return mList.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

MyViewHolder holder;

if (convertView == null) {

System.out.println("----aa-");

convertView = mInflater.inflate(com.vr.souhuodong.R.layout.listitem_place, parent, false);

holder = new MyViewHolder();

holder.placeName = (TextView) convertView

.findViewById(com.vr.souhuodong.R.id.place_name);

holder.placeAddree = (TextView) convertView

.findViewById(com.vr.souhuodong.R.id.place_adress);

holder.placeSelected = (ImageView) convertView

.findViewById(com.vr.souhuodong.R.id.place_select);

holder.placeName.setText(mList.get(position).name);

holder.placeAddree.setText(mList.get(position).address);

holder.placeSelected.setBackgroundResource(R.drawable.greywhite);

convertView.setTag(holder);

} else {

holder = (MyViewHolder) convertView.getTag();

}

holder.placeName.setText(mList.get(position).name);

holder.placeAddree.setText(mList.get(position).address);

//根据重新加载的时候第position条item是否是当前所选择的,选择加载不同的图片

if(notifyTip == position ){

holder.placeSelected.setBackgroundResource(R.drawable.ic_select);

}

else {

holder.placeSelected.setBackgroundResource(R.drawable.greywhite);

}

return convertView;

}

// class MyItemClickListener implements OnClickListener {

//

// ImageView mImg;

// public MyItemClickListener(ImageView mImg) {

// this.mImg = mImg;

// }

// @Override

// public void onClick(View v) {

// // TODO Auto-generated method stub

// mImg.setBackgroundResource(R.drawable.ic_select);

// }

//

// }

}

总结

以上所述是小编给大家介绍的利用百度地图Android sdk高仿微信发送位置功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali linux 截图 软件,Kali-Linux-Tools-Interface:针对Kali Linux的图形化Web接口

Kali-Linux-Tools-Interface在当今这个信息时代,数据是最有价值的资产,因此,广大用户和企业已成为网络攻击的主要目标。众所周知,信息安全专业人员都会使用一系列技术工具来协助他们的活动。但是设置环境,安装这些工具…

android布局属性,Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline...

相信大家对LinearLayout已经相当熟悉,但你们是否了解它的属性baselineAligned呢?Android官方文档是这么描述的:那到底这个属性是做什么用的呢?baselineAligned:基准线对齐。首先要解释什么是基准线,这个在中文中不常见…

android取消自动调试模式吗,Android进入调试模式的三种技巧

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?Android开发过程中难免会遇到各种问题,通常我们会通过打印Log日志或者Debug模式来分析问题。这里介绍下Android程序进入到Debug的多种方式,…

IMX6怎么移植最新Android,[IMX6Q][Android5.1]移植筆記 --- 無法掛載system文件系統

platform: imx6qos: Android5.1branch: l5.1.1_2.1.0-ga編譯好system image之后開機提示如下log,注意紅色部分:Freeing unused kernel memory: 432K (c0be3000 - c0c4f000)usb 1-1: USB disconnect, device number 2Console: switching to colour dummy device 80x3…

【POJ - 1456】Supermarket (贪心,优先队列 或并查集)

题干: A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precis…

【CodeForces - 558C】Amr and Chemistry(位运算,bfs,计数,思维,tricks)

题干: Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting experiment. Amr has n different types of chemicals. Each chemical i has an initial volume of ailiters. For this experiment, Amr has to mix all th…

我家云刷android系统教程,我家云刷机教程——小白详细版(篇二)

#大男孩的快乐#征稿活动火热进行中。只要投稿就有50金币等你拿&#xff0c;更有三千元乐高大奖与达人Z计划专属权益等待优秀的你~>活动详情戳这里<前两天发了一篇我家云的刷机教程&#xff0c;没想到大家这么有兴趣&#xff0c;讨论的异常激烈。看了大家的评论才发现之前…

【Loj - 515】贪心只能过样例(暴力,或01背包 + bitset)

题干&#xff1a; 题目描述 输入格式 第一行一个数 n。 然后 n 行&#xff0c;每行两个数表示 ai​,bi​。 输出格式 输出一行一个数表示答案。 样例 样例输入 5 1 2 2 3 3 4 4 5 5 6 样例输出 26 数据范围与提示 解题报告&#xff1a; 注意到要求统计种类数&#xf…

html loader的作用,webpack认识loader的作用

举例&#xff1a;如果希望在.html文件中使用style.css样式&#xff0c;我们以前只学习过一种方式&#xff1a;直接在.html中通过link的方式来引入 &#xff0c;这是传统的做法&#xff0c;在webpack语境下&#xff0c;我们将选择一条不同的道路&#xff1a;在js文件中引入了css…

5可视化数据大屏模板_可视化大屏模板分享

3个月前的一天&#xff0c;老板找到我&#xff1a;“小王&#xff0c;数据怎么才能产生让人惊艳的感觉呢&#xff1f;”我说&#xff1a;“肯定是用代码让程序员操作一下&#xff0c;再让设计师做一下配色&#xff0c;最好还能是数据实时变化的那种&#xff0c;简直就和电影里一…

c#12星座速配代码_白羊座今日运势|2020/12/11

整体运势&#xff1a;★★★☆☆爱情运势&#xff1a;★★☆☆☆事业运势&#xff1a;★★☆☆☆财富运势&#xff1a;★★★☆☆幸运数字&#xff1a;7速配星座&#xff1a;金牛座幸运颜色&#xff1a;橙色幸运时刻&#xff1a;12:00-14:00整体运势&#xff1a;接收的消息会比…

怎么去掉拼写检查的红线_发动机温度过高,水箱“开锅”,我们到底该怎么办?...

车子开久了&#xff0c;难免会出现一些小故障&#xff0c;今天我们就来说一下关于发动机水温过高的问题&#xff0c;这也是老司机常说的“开锅”。发动机水温正常情况是在80-90摄氏度之间&#xff0c;一旦超过这个温度&#xff0c;也就是水温表过了红线的时候&#xff0c;我们就…

【ZOJ - 2972】Hurdles of 110m (dp)

题干&#xff1a; In the year 2008, the 29th Olympic Games will be held in Beijing. This will signify the prosperity of China and Beijing Olympics is to be a festival for people all over the world as well. Liu Xiang is one of the famous Olympic athletes i…

格式说明_ISO11784/85 FDX-B动物芯片格式写码说明

植入式生物芯片口蹄疫、疯牛病、禽流感、非洲猪瘟的蔓延严重危及人类生命安全&#xff0c;引发了人们对动物性食品生产全过程安全追溯管理的重视。因此&#xff0c;有效地利用非接触式无线射频技术(RFID)对其进行控制成为有效的重要手段。一、国际动物识别标准介绍ISO 11784&am…

1至9填入九个方框内_防水涂料和施工堵漏的“五大技巧”和“九个细节”

防水涂料和施工堵漏的“五大技巧”和“九个细节”很多业主会在留言里问我家里水管堵了、房顶渗水怎么办&#xff0c;所以防水问题不可忽视。让您住的安心&#xff0c;您楼下的邻居也住的安心。对于防水问题&#xff0c;一定要在最初进行装修的时候就特别注意。下面这些是专业人…

限制 计算机中 某用户上网 win7,利用win7限制上网时间的方法

随着电脑的普及&#xff0c;很多家长为了让自己的孩子能有更广泛的知识&#xff0c;都给自己的孩子买了电脑&#xff0c;可现在很多孩子使用电脑却很少耗费在学习上&#xff0c;更多的时间是在娱乐&#xff0c;这样不仅影响学习而且还影响着视力&#xff0c;这样的问题相信困扰…

【ZOJ - 2976】Light Bulbs (枚举,暴力)

题干&#xff1a; Wildleopard had fallen in love with his girlfriend for 20 years. He wanted to end the long match for their love and get married this year. He bought a new house for his family and hired a company to decorate his house. Wildleopard and his…

为什么计算机编程以英语为主,为什么做编程都用英文,中文不行吗?听程序员解释完,总算明白了...

今天我们科普的话题是&#xff1a;为什么做编程都用英文&#xff0c;中文不行吗&#xff1f;听程序员解释完&#xff0c;总算明白了不知道大家最近有没有追过一部电视剧&#xff0c;它是《亲爱的热爱的》&#xff0c;由李现和杨紫主演的。主要讲述了这对情侣发生的浪漫爱情故事…

html的技术标准网站,HTML5标准最新技术预览

已经存在近十年的HTML4已经成为不断发展的Web开发领域的瓶颈&#xff1b;HTML5标准在此时显得尤为重要。每天都有新颖而创新的网站出现&#xff0c;全方位地拓展HTML的边界。Web开发者正在寻求新的技术&#xff0c;提供更强大的功能&#xff0c;那些因为脚本语言和浏览器的限制…

计算机网络技术实验,计算机网络技术实验

计算机网络技术实验 实 验 一 (2课时) 课题(项目)名称: 基本网络命令 计划学时: 2学时 实验目的 1. 了解网络命令的基本使用方法 2. 掌握常用网络命令的应用 3. 掌握网络通达性的基本测试方法 实验要求 1. 全面了解各种网络命令 2. 对常用的网络命令&#xff0c;上机测试运行 3…