Android 百度地图绘制点和轨迹

一、题目

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数组。
json

这是我在户外定位的数据,数据准确,误差极小。
(PS:模拟器打开图层时,屏幕中心默认是北京,所以使用模拟器时你要知道你定位的地点大致是哪里,然后去地图上找)
标记点



这是绘制轨迹的实验截图。因为我是使用的本地服务器来实现传递数据的,所以手机和电脑要处于同一局域网下才能连接起来,数据采集不方便,所以我就随便在MySQL中输入几条经纬度信息来模拟一下。所以如果有要做这种需要数据库存储位置信息demo的小伙伴,建议试试云服务器或云服务,这种就不要同一局域网了,直接流量就可以上传数据。

此图表示是输入时间段,百度地图显示对应时间段的轨迹。
时间

下图点A表示起点,就是起始时间的位置。
点B表示终点,就是终止时间的位置。
轨迹

有问题,欢迎留言交流!

猜你喜欢

转载自blog.csdn.net/weixin_43752257/article/details/113041298