一、题目
Android 百度地图绘制点和轨迹
二、环境
win10 AndroidStudio
三、代码实现
说明:注释掉的部分是我之前直接把数据定死的,只是看代码能不能正常运行,看能不能得到我预期的结果。没注释的,我是用JSON字符串来作为数据的载体。
绘制标记点的部分:
package com.example.adressandtrace;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import org.json.JSONException;
import java.util.List;
import Entity.Address;
public class MainActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
//定义Maker坐标点
// mBaiduMap= mMapView.getMap();
// LatLng point = new LatLng(39.963175, 116.400244);
构建Marker图标
// BitmapDescriptor bitmap = BitmapDescriptorFactory
// .fromResource(R.drawable.icon_marka);
构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
// Log.v("MY1","Has Done");
// OverlayOptions option = new MarkerOptions().icon(bitmap).position(point);
在地图上添加Marker,并显示
// Log.v("MY2","Has Done");
// mBaiduMap.addOverlay(option);
// Log.v("MY3","Has Done");
Intent intent = getIntent();
String jsonString = intent.getStringExtra("jsonString");
Log.i("jsonString",jsonString);
Log.i("jsonString","这是绘制点activity");
JieXiJson jieXiJson = new JieXiJson();
List<Address> list = null;
try {
list = jieXiJson.getAddress(jsonString);
Log.i("jsonString",list.toString());
Log.i("jsonString","map输出后的检查语句");
} catch (JSONException e) {
e.printStackTrace();
}
// 定义Maker坐标点
mBaiduMap= mMapView.getMap();
if(list!= null ){
for(Address address : list){
double latitude = Double.valueOf(address.getLatitude());
double longitude = Double.valueOf(address.getLongitude());
LatLng point = new LatLng(latitude, longitude);
System.out.println(latitude);
BaiduMap mBaiduMap = mMapView.getMap();
//定义Maker坐标点
// LatLng point = new LatLng(27.904198, 112.930552);七栋比较准确的位置
// LatLng point = new LatLng(27.901332, 112.92163);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_gcoding);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
}
}else{
Toast.makeText(MainActivity.this, "没有获取到位置信息或者位置数据库为空!", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
}
绘制轨迹的部分:
package com.example.adressandtrace;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import Entity.Address;
public class TraceActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
// Intent intent = getIntent();
// String jsonString = intent.getStringExtra("jsonString");
// JieXiJson jieXiJson = new JieXiJson();
// Address address = jieXiJson.getAddress(jsonString);
定义Maker坐标点
// mBaiduMap= mMapView.getMap();
// double latitude = Double.valueOf(address.getLatitude());
// double longitude = Double.valueOf(address.getLongitude());
// LatLng point1 = new LatLng(latitude, longitude);
// LatLng point1 = new LatLng(27.101299, 112.94076);
// LatLng point2 = new LatLng(27.901299, 112.94076);
Intent intent = getIntent();
String jsonString = intent.getStringExtra("jsonString");
JieXiJson jieXiJson = new JieXiJson();
List<Address> list = null;
try {
list = jieXiJson.getAddress(jsonString);
Log.i("jsonString",list.toString());
Log.i("jsonString","map输出后的检查语句");
} catch (JSONException e) {
e.printStackTrace();
}
if(list != null){
BaiduMap mBaiduMap = mMapView.getMap();
//构建Marker图标
BitmapDescriptor bitmap1 = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
BitmapDescriptor bitmap2 = BitmapDescriptorFactory
.fromResource(R.drawable.icon_markb);
//构建MarkerOption,用于在地图上添加Marker
// OverlayOptions option = new MarkerOptions()
// .position(point)
// .icon(bitmap);
Log.v("MY1","Has Done");
Address address1 = list.get(0);
Address address2 = list.get(list.size()-1);
double latitude1 = Double.valueOf(address1.getLatitude());
double longitude1 = Double.valueOf(address1.getLongitude());
LatLng point1= new LatLng(latitude1, longitude1);
double latitude2 = Double.valueOf(address2.getLatitude());
double longitude2 = Double.valueOf(address2.getLongitude());
LatLng point2 = new LatLng(latitude2, longitude2);
OverlayOptions option1 = new MarkerOptions().icon(bitmap1).position(point1);
OverlayOptions option2 = new MarkerOptions().icon(bitmap2).position(point2);
//在地图上添加Marker,并显示
Log.v("MY2","Has Done");
mBaiduMap.addOverlay(option1);
mBaiduMap.addOverlay(option2);
Log.v("MY3","Has Done");
List<LatLng> points = new ArrayList<LatLng>();
for(Address address :list) {
//定义Maker坐标点
// LatLng point = new LatLng(27.904198, 112.930552);七栋比较准确的位置
double latitude = Double.valueOf(address.getLatitude());
double longitude = Double.valueOf(address.getLongitude());
LatLng point = new LatLng(latitude, longitude);
points.add(point);
}
//设置折线的属性
OverlayOptions mOverlayOptions = new PolylineOptions()
.width(10)
.color(0xAAFF0000)
.points(points);
//在地图上绘制折线
//mPloyline 折线对象
Overlay mPolyline = mBaiduMap.addOverlay(mOverlayOptions);
}else{
Toast.makeText(TraceActivity.this, "没有获取到位置信息或者位置数据库为空!", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
}
四、实验截图
这是查看实时位置(即数据库最后一条数据),程序运行后在浏览器页面显示的json数组。
这是我在户外定位的数据,数据准确,误差极小。
(PS:模拟器打开图层时,屏幕中心默认是北京,所以使用模拟器时你要知道你定位的地点大致是哪里,然后去地图上找)
这是绘制轨迹的实验截图。因为我是使用的本地服务器来实现传递数据的,所以手机和电脑要处于同一局域网下才能连接起来,数据采集不方便,所以我就随便在MySQL中输入几条经纬度信息来模拟一下。所以如果有要做这种需要数据库存储位置信息demo的小伙伴,建议试试云服务器或云服务,这种就不要同一局域网了,直接流量就可以上传数据。
此图表示是输入时间段,百度地图显示对应时间段的轨迹。
下图点A表示起点,就是起始时间的位置。
点B表示终点,就是终止时间的位置。
有问题,欢迎留言交流!