关于新手开发出来的地图偏差太大的问题,进行坐标转换
2017-03-04 11:06
260 查看
本文为解决开发出来的百度地图坐标偏差问题,如果不进行坐标转换将误差1公里左右,
具体参考百度官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/tool
以下为我的代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_baidu_map__main"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="com.example.baidumaptest.baiduMap_MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clickable="true"/>
</RelativeLayout>
下面就是Java代码
package com.example.baidumaptest;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLoca
4000
tionData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.CoordinateConverter;
import java.util.List;
public class baiduMap_MainActivity extends AppCompatActivity {
private MapView mapView;
private BaiduMap baiduMap;
private LocationManager locationManager;
private String provider;
private Boolean isFirstLocate = true;
@Override
protected void onDestroy() {
super.onDestroy();
baiduMap.setMyLocationEnabled(false);
mapView.onDestroy();
if (locationManager != null) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.removeUpdates(locationListener);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_baidu_map__main);
mapView = (MapView) findViewById(R.id.map_view);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
List<String> providerList = locationManager.getProviders(true);
if (providerList.contains(locationManager.GPS_PROVIDER)) {
provider = locationManager.GPS_PROVIDER;
}
if (providerList.contains(locationManager.NETWORK_PROVIDER)) {
provider = locationManager.NETWORK_PROVIDER;
} else {
Toast.makeText(this, "no location provider to use", Toast.LENGTH_SHORT).show();
return;
}
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = locationManager.getLastKnownLocation(provider);
if (location!=null){
navigateTo(location);
}
locationManager.requestLocationUpdates(provider,3000,1,locationListener);
}
private void navigateTo(Location location) {
if (isFirstLocate){
LatLng sourceLatLng=new LatLng(location.getLatitude(),location.getLongitude());
//下面开始对坐标进行转换(转换成百度的坐标计算方式)
CoordinateConverter converter = new CoordinateConverter();
converter.from(CoordinateConverter.CoordType.GPS);
// sourceLatLng待转换坐标
converter.coord(sourceLatLng);
LatLng desLatLng = converter.convert();
//转换结束,desLatLng即为转换后的坐标
MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(desLatLng);
baiduMap.animateMapStatus(update);
update=MapStatusUpdateFactory.zoomTo(19f);
baiduMap.animateMapStatus(update);
isFirstLocate=false;
}
CoordinateConverter converter = new CoordinateConverter();
converter.from(CoordinateConverter.CoordType.GPS);
converter.coord(new LatLng(location.getLatitude(),location.getLongitude()));
LatLng desLatLng = converter.convert();
MyLocationData.Builder locationBuilder=new MyLocationData.Builder();
locationBuilder.latitude(desLatLng.latitude);
locationBuilder.longitude(desLatLng.longitude);
MyLocationData locationdata=locationBuilder.build();
baiduMap.setMyLocationData(locationdata);
}
LocationListener locationListener=new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (location!=null){
navigateTo(location);
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
}
顺便贴一下关于声明文件代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.baidumaptest">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="yGdRyv6mdsfLGr9O6ofaEhaGGaekklrf"/>
<activity android:name=".baiduMap_MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
具体参考百度官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/tool
以下为我的代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_baidu_map__main"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="com.example.baidumaptest.baiduMap_MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clickable="true"/>
</RelativeLayout>
下面就是Java代码
package com.example.baidumaptest;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLoca
4000
tionData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.CoordinateConverter;
import java.util.List;
public class baiduMap_MainActivity extends AppCompatActivity {
private MapView mapView;
private BaiduMap baiduMap;
private LocationManager locationManager;
private String provider;
private Boolean isFirstLocate = true;
@Override
protected void onDestroy() {
super.onDestroy();
baiduMap.setMyLocationEnabled(false);
mapView.onDestroy();
if (locationManager != null) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.removeUpdates(locationListener);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_baidu_map__main);
mapView = (MapView) findViewById(R.id.map_view);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
List<String> providerList = locationManager.getProviders(true);
if (providerList.contains(locationManager.GPS_PROVIDER)) {
provider = locationManager.GPS_PROVIDER;
}
if (providerList.contains(locationManager.NETWORK_PROVIDER)) {
provider = locationManager.NETWORK_PROVIDER;
} else {
Toast.makeText(this, "no location provider to use", Toast.LENGTH_SHORT).show();
return;
}
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = locationManager.getLastKnownLocation(provider);
if (location!=null){
navigateTo(location);
}
locationManager.requestLocationUpdates(provider,3000,1,locationListener);
}
private void navigateTo(Location location) {
if (isFirstLocate){
LatLng sourceLatLng=new LatLng(location.getLatitude(),location.getLongitude());
//下面开始对坐标进行转换(转换成百度的坐标计算方式)
CoordinateConverter converter = new CoordinateConverter();
converter.from(CoordinateConverter.CoordType.GPS);
// sourceLatLng待转换坐标
converter.coord(sourceLatLng);
LatLng desLatLng = converter.convert();
//转换结束,desLatLng即为转换后的坐标
MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(desLatLng);
baiduMap.animateMapStatus(update);
update=MapStatusUpdateFactory.zoomTo(19f);
baiduMap.animateMapStatus(update);
isFirstLocate=false;
}
CoordinateConverter converter = new CoordinateConverter();
converter.from(CoordinateConverter.CoordType.GPS);
converter.coord(new LatLng(location.getLatitude(),location.getLongitude()));
LatLng desLatLng = converter.convert();
MyLocationData.Builder locationBuilder=new MyLocationData.Builder();
locationBuilder.latitude(desLatLng.latitude);
locationBuilder.longitude(desLatLng.longitude);
MyLocationData locationdata=locationBuilder.build();
baiduMap.setMyLocationData(locationdata);
}
LocationListener locationListener=new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (location!=null){
navigateTo(location);
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
}
顺便贴一下关于声明文件代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.baidumaptest">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="yGdRyv6mdsfLGr9O6ofaEhaGGaekklrf"/>
<activity android:name=".baiduMap_MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
相关文章推荐
- 关于TP5视图分离到根目录的解决方法 原有: 为了方便前端开发,我想把视图(view)部分分离出来专门给前端进行修改 过程:在进行视图设置分离的过程遇到了问题 参考了官方文档http://www
- 百度地图开发问题----解决地图有时候加载不出来问题
- #菜鸟新手EclipseJavaEE&MySQL&Tomcat#关于一个Eclipse中登陆界面通过连接MySQL数据库进行验证的小体验(感谢qq群友引燃的解答让我解决这个小问题)
- Android 百度地图开发问题----解决地图有时候加载不出来问题
- 关于如何从多个项目创建 ASP.NET 应用程序以进行组开发问题
- VS2010无法调试问题解决 最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看。 之前开发环境:VS2008,ArcGIS9.3,Ar
- 18.02.10,记录maven开发bos中struts2配置问题,关于如何进行WEB-INF下页面的访问?
- 关于revit二次开发中,用winform剖切房间进行房间定位的问题
- 关于WebForm开发问题(给新手的建议)
- Android 百度地图开发问题----解决地图有时候加载不出来问题
- Android 百度地图开发问题----解决地图有时候加载不出来问题
- [地图SkyLine二次开发]关于IE内存限制问题(1G)......(续)
- 使用百度地图SDK,使用Android studio开发工具,按照开发者指南进行操作,地图无法显示问题
- Android 百度地图开发问题----解决地图有时候加载不出来问题
- 关于arcgis(javascript)开发的地图在IE8下不显示的问题
- 关于做框架页作业时归还单中“创建人”显示不出来的问题
- 心得体会:关于开发效率和项目周期的问题
- ASP.Net开发新手常见问题备忘录
- 心得体会:关于开发效率和项目周期的问题
- Oracle开发中,关于查询的一个问题