精华内容
下载资源
问答
  • uniapp打包app,使用高德地图绘制轨迹,实现驾车路径的规划 uniapp自身提供地图组件,但由于兼容性比较差,很多功能无法基于uni提供的api实现自己的需求点,所以这里我们借助web-view的方式去实现路线的规划,以及...

    uniapp>>>>app端,使用高德地图绘制轨迹,实现驾车路径的规划

    uniapp自身提供地图组件,但由于兼容性比较差,很多功能无法基于uni提供的api实现自己的需求点,所以这里我们借助web-view的方式去实现路线的规划,以及高德地图的方法调用,

    这里的例子只实现了驾车路径的规划

     由于本次用的是renderjs这个插入模版,所以要用两个script块,并且用:prop用于传递数据参数,:change:prop用于监听数据变化

    <template>
    	<view class="amap-container">
    		<view id="amap" class="amap" :prop="option" :change:prop="amap.updateEcharts"></view>
    		<view class="" id="panel"></view>
    	</view>
    </template>

    在这块script中,可以做正常的逻辑操作,页面间参数接收,数据的赋值等等......就一切正常写就好

    <script>
    export default {
    	data() {
    		return {
    			option: []
    		};
    	},
    	onLoad(params) {
    		this.option = JSON.parse(params.data);
    	},
    	methods: {}
    };
    </script>

     这里要注意的一点哦,虽然是在uniapp中,但是这里的key要用webKey。

    <script module="amap" lang="renderjs">
    export default {
    	data() {
    		return {
    			map: null,
    			mapdata:{},
    			ownerInstanceObj: null//service层对象
    		}
    	},
    	mounted() {
    		if (typeof window.AMap === 'function') {
    			this.initAmap()
    		} else {
    			// 动态引入较大类库避免影响页面展示
    			const script = document.createElement('script')
    			script.src = 'https://webapi.amap.com/maps?v=1.4.15&key=XXXXXXXXXXXXXXXXXXXXX'
    			script.onload = this.initAmap.bind(this)
    			document.head.appendChild(script)
    		}
    	},
    	methods: {
    		updateEcharts(newValue, oldValue, ownerInstance, instance) {
    			// 监听 service 层数据变更
    			// console.log(oldValue)
    		},
    		initAmap(oldValue) {
    			this.map = new AMap.Map('amap', {
    				resizeEnable: true,
    				center: [118.397428, 39.90923],//地图中心点
    				zoom: 13 //地图显示的缩放级别
    			})
    			this.map.plugin('AMap.Driving', () => {
    			  let driving = new AMap.Driving({
    			  	map: this.map,
    				showTraffic: false//是否开启路况配置
    			  })
    			  // 根据起终点经纬度规划驾车导航路线
                   //  参数就可以直接去查看高德地图官网文档就可以咯,就会很清晰咯
    			  driving.search(new AMap.LngLat(this.option[0].lng, this.option[0].lat), new AMap.LngLat(this.option[1].lng, this.option[1].lat), [], (status, result) => {
    				// if (status === 'complete') {
    			 //  		console.log('绘制驾车路线完成')
    			 //  	} else {
    			 //  		console.log('获取驾车数据失败:' + result)
    			 //  	}
    			  })
    			})
    		}
    	}
    }
    </script>
    
    <style lang="scss" scoped>
    #amap {
    	width: 100%;
    	height: 100vh;
    }
    </style>
    

     

    展开全文
  • 用户体验地图绘制

    2019-04-16 17:19:03
    简单的介绍了用户体验地图绘制的步骤,比较精简,适合面试之前看看
  • android RPG地图绘制

    2016-02-17 21:43:45
    android原生态读取tiled地图资源,可使用多个图块,采用surfaceView绘制
  • ECharts 地图绘制

    千次阅读 2020-02-21 13:29:45
    ECharts 中地理坐标系组件可以用于地图绘制,它支持在地理坐标系上绘制散点图,线集。 2.visualMap[i] visualMap 是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道)。 视觉元素可以...

    地图模拟实例(数据不具真实性仅供学习)

    在绘制之前我们要了解一些Echarts的一些基本的组件:

    1.geo
    geo 是 ECharts 图表的地理坐标系组件。
    ECharts 中地理坐标系组件可以用于地图的绘制,它支持在地理坐标系上绘制散点图,线集。
    在这里插入图片描述

    2.visualMap[i]
    visualMap 是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道)。
    视觉元素可以是:
    - symbol: 图元的图形类别。
    - symbolSize: 图元的大小。
    - color: 图元的颜色。
    - colorAlpha: 图元的颜色的透明度。
    - opacity: 图元以及其附属物(如文字标签)的透明度。
    - colorLightness: 颜色的明暗度,参见 HSL
    - colorSaturation: 颜色的饱和度,参见 HSL
    - colorHue: 颜色的色调,参见 HSL
    visualMap 组件可以定义多个,从而可以同时对数据中的多个维度进行视觉映射。

    3.splitNumber
    对于分段型视觉映射组件中的连续型数据,会自动平均切分成几段。默认为5段。 连续数据的范围需要 maxmin 来指定。

    如果设置了 visualMap-piecewise.pieces 或者 visualMap-piecewise.categories,则 splitNumber 无效。

    4.pieces
    自定义『分段式视觉映射组件(visualMapPiecewise)』的每一段的范围,以及每一段的文字,以及每一段的特别的样式。例如:

    pieces: [
    			{gt: 500},            // (500, Infinity]
    			{gt: 300, lte: 500},  // (300, 500]
    			{gt: 100, lte: 300},
    			{gt: 50, lte: 100},
    			{gt: 10, lte: 50},
    			{lt: 5}// (-Infinity, 5)
    		],
            color: ['#d94e5d','#eac736','#50a3ba'],
            textStyle: {
                color: '#fff'
            }
    

    或者,更精确得,可以使用 lt(小于,little than),gt(大于,greater than),lte(小于等于 lettle than or equals),gte(大于等于,greater than or equals)来表达边界:
    在这里插入图片描述

    5.legend.tooltip

    图例的 tooltip 配置,配置项同 tooltip。默认不显示,可以在 legend 文字很多的时候对文字做裁剪并且开启 tooltip,如下示例:

      tooltip: {
            trigger: 'item',
    		 formatter: function (params) {
                return params.name + ' : ' + params.value[2];
            }
        }
    

    效果图:
    在这里插入图片描述

    代码实例

    <!DOCTYPE html>
    <html style="height: 100%">
       <head>
           <meta charset="utf-8">
       </head>
       <body style="height: 100%; margin: 0">
           <div id="container" style="height: 100%"></div>
           <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
           <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js"></script>
           <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat/dist/ecStat.min.js"></script>
           <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/dataTool.min.js"></script>
           <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js"></script>
           <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/world.js"></script>
           <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/bmap.min.js"></script>
           <script type="text/javascript">
    var dom = document.getElementById("container");
    var myChart = echarts.init(dom);
    var app = {};
    option = null;
    var geoCoordMap = {
        "海门":[121.15,31.89],
        "鄂尔多斯":[109.781327,39.608266],
        "招远":[120.38,37.35],
        "舟山":[122.207216,29.985295],
        "齐齐哈尔":[123.97,47.33],
        "盐城":[120.13,33.38],
        "赤峰":[118.87,42.28],
        "青岛":[120.33,36.07],
        "乳山":[121.52,36.89],
        "金昌":[102.188043,38.520089],
        "泉州":[118.58,24.93],
        "莱西":[120.53,36.86],
        "日照":[119.46,35.42],
        "胶南":[119.97,35.88],
        "南通":[121.05,32.08],
        "拉萨":[91.11,29.97],
        "云浮":[112.02,22.93],
        "梅州":[116.1,24.55],
        "文登":[122.05,37.2],
        "上海":[121.48,31.22],
        "攀枝花":[101.718637,26.582347],
        "威海":[122.1,37.5],
        "承德":[117.93,40.97],
        "厦门":[118.1,24.46],
        "汕尾":[115.375279,22.786211],
        "潮州":[116.63,23.68],
        "丹东":[124.37,40.13],
        "太仓":[121.1,31.45],
        "曲靖":[103.79,25.51],
        "烟台":[121.39,37.52],
        "福州":[119.3,26.08],
        "瓦房店":[121.979603,39.627114],
        "即墨":[120.45,36.38],
        "抚顺":[123.97,41.97],
        "玉溪":[102.52,24.35],
        "张家口":[114.87,40.82],
        "阳泉":[113.57,37.85],
        "莱州":[119.942327,37.177017],
        "湖州":[120.1,30.86],
        "汕头":[116.69,23.39],
        "昆山":[120.95,31.39],
        "宁波":[121.56,29.86],
        "湛江":[110.359377,21.270708],
        "揭阳":[116.35,23.55],
        "荣成":[122.41,37.16],
        "连云港":[119.16,34.59],
        "葫芦岛":[120.836932,40.711052],
        "常熟":[120.74,31.64],
        "东莞":[113.75,23.04],
        "河源":[114.68,23.73],
        "淮安":[119.15,33.5],
        "泰州":[119.9,32.49],
        "南宁":[108.33,22.84],
        "营口":[122.18,40.65],
        "惠州":[114.4,23.09],
        "江阴":[120.26,31.91],
        "蓬莱":[120.75,37.8],
        "韶关":[113.62,24.84],
        "嘉峪关":[98.289152,39.77313],
        "广州":[113.23,23.16],
        "延安":[109.47,36.6],
        "太原":[112.53,37.87],
        "清远":[113.01,23.7],
        "中山":[113.38,22.52],
        "昆明":[102.73,25.04],
        "寿光":[118.73,36.86],
        "盘锦":[122.070714,41.119997],
        "长治":[113.08,36.18],
        "深圳":[114.07,22.62],
        "珠海":[113.52,22.3],
        "宿迁":[118.3,33.96],
        "咸阳":[108.72,34.36],
        "铜川":[109.11,35.09],
        "平度":[119.97,36.77],
        "佛山":[113.11,23.05],
        "海口":[110.35,20.02],
        "江门":[113.06,22.61],
        "章丘":[117.53,36.72],
        "肇庆":[112.44,23.05],
        "大连":[121.62,38.92],
        "临汾":[111.5,36.08],
        "吴江":[120.63,31.16],
        "石嘴山":[106.39,39.04],
        "沈阳":[123.38,41.8],
        "苏州":[120.62,31.32],
        "茂名":[110.88,21.68],
        "嘉兴":[120.76,30.77],
        "长春":[125.35,43.88],
        "胶州":[120.03336,36.264622],
        "银川":[106.27,38.47],
        "张家港":[120.555821,31.875428],
        "三门峡":[111.19,34.76],
        "锦州":[121.15,41.13],
        "南昌":[115.89,28.68],
        "柳州":[109.4,24.33],
        "三亚":[109.511909,18.252847],
        "自贡":[104.778442,29.33903],
        "吉林":[126.57,43.87],
        "阳江":[111.95,21.85],
        "泸州":[105.39,28.91],
        "西宁":[101.74,36.56],
        "宜宾":[104.56,29.77],
        "呼和浩特":[111.65,40.82],
        "成都":[104.06,30.67],
        "大同":[113.3,40.12],
        "镇江":[119.44,32.2],
        "桂林":[110.28,25.29],
        "张家界":[110.479191,29.117096],
        "宜兴":[119.82,31.36],
        "北海":[109.12,21.49],
        "西安":[108.95,34.27],
        "金坛":[119.56,31.74],
        "东营":[118.49,37.46],
        "牡丹江":[129.58,44.6],
        "遵义":[106.9,27.7],
        "绍兴":[120.58,30.01],
        "扬州":[119.42,32.39],
        "常州":[119.95,31.79],
        "潍坊":[119.1,36.62],
        "重庆":[106.54,29.59],
        "台州":[121.420757,28.656386],
        "南京":[118.78,32.04],
        "滨州":[118.03,37.36],
        "贵阳":[106.71,26.57],
        "无锡":[120.29,31.59],
        "本溪":[123.73,41.3],
        "克拉玛依":[84.77,45.59],
        "渭南":[109.5,34.52],
        "马鞍山":[118.48,31.56],
        "宝鸡":[107.15,34.38],
        "焦作":[113.21,35.24],
        "句容":[119.16,31.95],
        "北京":[116.46,39.92],
        "徐州":[117.2,34.26],
        "衡水":[115.72,37.72],
        "包头":[110,40.58],
        "绵阳":[104.73,31.48],
        "乌鲁木齐":[87.68,43.77],
        "枣庄":[117.57,34.86],
        "杭州":[120.19,30.26],
        "淄博":[118.05,36.78],
        "鞍山":[122.85,41.12],
        "溧阳":[119.48,31.43],
        "库尔勒":[86.06,41.68],
        "安阳":[114.35,36.1],
        "开封":[114.35,34.79],
        "济南":[117,36.65],
        "德阳":[104.37,31.13],
        "温州":[120.65,28.01],
        "九江":[115.97,29.71],
        "邯郸":[114.47,36.6],
        "临安":[119.72,30.23],
        "兰州":[103.73,36.03],
        "沧州":[116.83,38.33],
        "临沂":[118.35,35.05],
        "南充":[106.110698,30.837793],
        "天津":[117.2,39.13],
        "富阳":[119.95,30.07],
        "泰安":[117.13,36.18],
        "诸暨":[120.23,29.71],
        "郑州":[113.65,34.76],
        "哈尔滨":[126.63,45.75],
        "聊城":[115.97,36.45],
        "芜湖":[118.38,31.33],
        "唐山":[118.02,39.63],
        "平顶山":[113.29,33.75],
        "邢台":[114.48,37.05],
        "德州":[116.29,37.45],
        "济宁":[116.59,35.38],
        "荆州":[112.239741,30.335165],
        "宜昌":[111.3,30.7],
        "义乌":[120.06,29.32],
        "丽水":[119.92,28.45],
        "洛阳":[112.44,34.7],
        "秦皇岛":[119.57,39.95],
        "株洲":[113.16,27.83],
        "石家庄":[114.48,38.03],
        "莱芜":[117.67,36.19],
        "常德":[111.69,29.05],
        "保定":[115.48,38.85],
        "湘潭":[112.91,27.87],
        "金华":[119.64,29.12],
        "岳阳":[113.09,29.37],
        "长沙":[113,28.21],
        "衢州":[118.88,28.97],
        "廊坊":[116.7,39.53],
        "菏泽":[115.480656,35.23375],
        "合肥":[117.27,31.86],
        "武汉":[114.31,30.52],
        "大庆":[125.03,46.58]
    };
    
    var convertData = function (data) {
        var res = [];
        for (var i = 0; i < data.length; i++) {
            var geoCoord = geoCoordMap[data[i].name];
            if (geoCoord) {
    			res.push({
                    name: data[i].name,
                    value: geoCoord.concat(data[i].value)
                });
            }
        }
        return res;
    };
    
    option = {
        backgroundColor: '#404a59',
        title: {
            text: '全国主要城市疫情模拟数据',
            subtext: 'This is simulated data',
            sublink: 'https://blog.csdn.net/qq_40896997',
            left: 'center',
            textStyle: {
                color: '#fff'
            }
        },
        tooltip: {
            trigger: 'item',
    		 formatter: function (params) {
                return params.name + ' : ' + params.value[2];
            }
        },
        legend: {
            orient: 'vertical',
            top: 'bottom',
            left: 'right',
            data:['感染人数'],
            textStyle: {
                color: '#fff'
            }
        },
        visualMap: {
    		pieces: [
    			{gt: 500},            // (500, Infinity]
    			{gt: 300, lte: 500},  // (300, 500]
    			{gt: 100, lte: 300},
    			{gt: 50, lte: 100},
    			{gt: 10, lte: 50},
    			{lt: 5}// (-Infinity, 5)
    		],
            color: ['#d94e5d','#eac736','#50a3ba'],
            textStyle: {
                color: '#fff'
            }
        },
        geo: {
            map: 'china',
            label: {
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    areaColor: '#323c48',
                    borderColor: '#111'
                },
                emphasis: {
                    areaColor: '#2a333d'
                }
            }
        },
        series: [
            {
                name: '感染人数',
                type: 'scatter',
                coordinateSystem: 'geo',
                data: convertData([
                    {name: "海门", value: 9},
                    {name: "鄂尔多斯", value: 12},
                    {name: "招远", value: 12},
                    {name: "舟山", value: 12},
                    {name: "齐齐哈尔", value: 14},
                    {name: "盐城", value: 15},
                    {name: "赤峰", value: 16},
                    {name: "青岛", value: 18},
                    {name: "乳山", value: 18},
                    {name: "金昌", value: 19},
                    {name: "泉州", value: 21},
                    {name: "莱西", value: 21},
                    {name: "日照", value: 21},
                    {name: "胶南", value: 22},
                    {name: "南通", value: 23},
                    {name: "拉萨", value: 1},
                    {name: "云浮", value: 24},
                    {name: "梅州", value: 25},
                    {name: "文登", value: 25},
                    {name: "上海", value: 25},
                    {name: "攀枝花", value: 25},
                    {name: "威海", value: 25},
                    {name: "承德", value: 25},
                    {name: "厦门", value: 26},
                    {name: "汕尾", value: 26},
                    {name: "潮州", value: 26},
                    {name: "丹东", value: 27},
                    {name: "太仓", value: 27},
                    {name: "曲靖", value: 27},
                    {name: "烟台", value: 28},
                    {name: "福州", value: 29},
                    {name: "瓦房店", value: 30},
                    {name: "即墨", value: 30},
                    {name: "抚顺", value: 31},
                    {name: "玉溪", value: 31},
                    {name: "张家口", value: 31},
                    {name: "阳泉", value: 31},
                    {name: "莱州", value: 32},
                    {name: "湖州", value: 32},
                    {name: "汕头", value: 32},
                    {name: "昆山", value: 33},
                    {name: "宁波", value: 33},
                    {name: "湛江", value: 33},
                    {name: "揭阳", value: 34},
                    {name: "荣成", value: 34},
                    {name: "连云港", value: 35},
                    {name: "葫芦岛", value: 35},
                    {name: "常熟", value: 36},
                    {name: "东莞", value: 36},
                    {name: "河源", value: 36},
                    {name: "淮安", value: 36},
                    {name: "泰州", value: 36},
                    {name: "南宁", value: 37},
                    {name: "营口", value: 37},
                    {name: "惠州", value: 37},
                    {name: "江阴", value: 37},
                    {name: "蓬莱", value: 37},
                    {name: "韶关", value: 38},
                    {name: "嘉峪关", value: 38},
                    {name: "广州", value: 338},
                    {name: "延安", value: 38},
                    {name: "太原", value: 39},
                    {name: "清远", value: 39},
                    {name: "中山", value: 39},
                    {name: "昆明", value: 39},
                    {name: "寿光", value: 40},
                    {name: "盘锦", value: 40},
                    {name: "长治", value: 41},
                    {name: "深圳", value: 388},
                    {name: "珠海", value: 42},
                    {name: "宿迁", value: 43},
                    {name: "咸阳", value: 43},
                    {name: "铜川", value: 44},
                    {name: "平度", value: 44},
                    {name: "佛山", value: 44},
                    {name: "海口", value: 44},
                    {name: "江门", value: 45},
                    {name: "章丘", value: 45},
                    {name: "肇庆", value: 46},
                    {name: "大连", value: 47},
                    {name: "临汾", value: 47},
                    {name: "吴江", value: 47},
                    {name: "石嘴山", value: 49},
                    {name: "沈阳", value: 50},
                    {name: "苏州", value: 50},
                    {name: "茂名", value: 50},
                    {name: "嘉兴", value: 51},
                    {name: "长春", value: 51},
                    {name: "胶州", value: 52},
                    {name: "银川", value: 52},
                    {name: "张家港", value: 52},
                    {name: "三门峡", value: 53},
                    {name: "锦州", value: 54},
                    {name: "南昌", value: 54},
                    {name: "柳州", value: 54},
                    {name: "三亚", value: 54},
                    {name: "自贡", value: 56},
                    {name: "吉林", value: 56},
                    {name: "阳江", value: 57},
                    {name: "泸州", value: 57},
                    {name: "西宁", value: 57},
                    {name: "宜宾", value: 58},
                    {name: "呼和浩特", value: 58},
                    {name: "成都", value: 58},
                    {name: "大同", value: 58},
                    {name: "镇江", value: 59},
                    {name: "桂林", value: 59},
                    {name: "张家界", value: 59},
                    {name: "宜兴", value: 59},
                    {name: "北海", value: 60},
                    {name: "西安", value: 61},
                    {name: "金坛", value: 62},
                    {name: "东营", value: 62},
                    {name: "牡丹江", value: 63},
                    {name: "遵义", value: 63},
                    {name: "绍兴", value: 63},
                    {name: "扬州", value: 64},
                    {name: "常州", value: 64},
                    {name: "潍坊", value: 65},
                    {name: "重庆", value: 66},
                    {name: "台州", value: 67},
                    {name: "南京", value: 67},
                    {name: "滨州", value: 70},
                    {name: "贵阳", value: 71},
                    {name: "无锡", value: 71},
                    {name: "本溪", value: 71},
                    {name: "克拉玛依", value: 72},
                    {name: "渭南", value: 72},
                    {name: "马鞍山", value: 72},
                    {name: "宝鸡", value: 72},
                    {name: "焦作", value: 75},
                    {name: "句容", value: 75},
                    {name: "北京", value: 79},
                    {name: "徐州", value: 79},
                    {name: "衡水", value: 80},
                    {name: "包头", value: 80},
                    {name: "绵阳", value: 80},
                    {name: "乌鲁木齐", value: 84},
                    {name: "枣庄", value: 84},
                    {name: "杭州", value: 84},
                    {name: "淄博", value: 85},
                    {name: "鞍山", value: 86},
                    {name: "溧阳", value: 86},
                    {name: "库尔勒", value: 86},
                    {name: "安阳", value: 90},
                    {name: "开封", value: 90},
                    {name: "济南", value: 92},
                    {name: "德阳", value: 93},
                    {name: "温州", value: 95},
                    {name: "九江", value: 96},
                    {name: "邯郸", value: 98},
                    {name: "临安", value: 99},
                    {name: "兰州", value: 99},
                    {name: "沧州", value: 100},
                    {name: "临沂", value: 103},
                    {name: "南充", value: 104},
                    {name: "天津", value: 105},
                    {name: "富阳", value: 106},
                    {name: "泰安", value: 112},
                    {name: "诸暨", value: 112},
                    {name: "郑州", value: 113},
                    {name: "哈尔滨", value: 114},
                    {name: "聊城", value: 116},
                    {name: "芜湖", value: 117},
                    {name: "唐山", value: 119},
                    {name: "平顶山", value: 119},
                    {name: "邢台", value: 119},
                    {name: "德州", value: 120},
                    {name: "济宁", value: 120},
                    {name: "荆州", value: 127},
                    {name: "宜昌", value: 130},
                    {name: "义乌", value: 132},
                    {name: "丽水", value: 133},
                    {name: "洛阳", value: 134},
                    {name: "秦皇岛", value: 136},
                    {name: "株洲", value: 143},
                    {name: "石家庄", value: 147},
                    {name: "莱芜", value: 148},
                    {name: "常德", value: 152},
                    {name: "保定", value: 153},
                    {name: "湘潭", value: 154},
                    {name: "金华", value: 157},
                    {name: "岳阳", value: 169},
                    {name: "长沙", value: 175},
                    {name: "衢州", value: 177},
                    {name: "廊坊", value: 193},
                    {name: "菏泽", value: 194},
                    {name: "合肥", value: 229},
                    {name: "武汉", value: 1473},
                    {name: "大庆", value: 279}
                ]),
                symbolSize: 12,
                label: {
                    normal: {
                        show: false
                    },
                    emphasis: {
                        show: false
                    }
                },
                itemStyle: {
                    emphasis: {
                        borderColor: '#fff',
                        borderWidth: 1
                    }
                }
            }
        ]
    };
    if (option && typeof option === "object") {
        myChart.setOption(option, true);
    }
           </script>
       </body>
    </html>
    

    效果图

    在这里插入图片描述

    展开全文
  • 百度地图绘制实时路线以及最短线路规划

    万次阅读 热门讨论 2016-05-03 13:36:47
    如何使用百度地图绘制实时路线以及最短线路规划最近在做百度地图的实时路线绘制,发现一些问题,比如由于定位漂移带来的路线绘制偏差,还有由于定位漂移,导致人未走动时,也会绘制路线等。百度鹰眼的线路纠偏个人...

    如何使用百度地图绘制实时路线以及最短线路规划

    最近在做百度地图的实时路线绘制,发现一些问题,比如由于定位漂移带来的路线绘制偏差,还有由于定位漂移,导致人未走动时,也会绘制路线等。百度鹰眼的线路纠偏个人感觉很一般啊。而且有限漂移了两百米的点他也没有纠正过来。所以最后还是决定自己写一个纠偏吧。而且百度地图官方的dome和示例代码真的很示例啊。然人摸不着头脑。ok进入正题,思路是这样的,因为实时绘制线路都是在室外,所以只采用gps定位,不采用无线网络定位。这样漂移一两百米的点基本不会出现。第二当人在等红绿灯时,人是静止的,但是定位有可能会漂移,所以这部分我们采用手机感应器进行判断是否移动。ok大体方向确定了,接下来就是进行功能划分然后开发了。功能模块主要涉及以下几点

    需要项目源码的请移步到此下载
    http://download.csdn.net/detail/zero172/9588471

    • 地图定位
    • 绘制当前位置
    • 获取位置进行纠偏
    • 判断是否移动
    • 绘制线路
    • 线路规划

    程序流程图凸显

    Created with Raphaël 2.2.0开始获取gps位置不是第一个?不是前10个?手机是否处于运动?两点间距离是否大于1米?两点间距离是否小于90米?保存位置绘制线路抛弃位置保存位置yesnoyesnoyesnoyesnoyesno

    下面是完整代码

    这里贴出的代码是基于各位亦有一定百度地图开发基础为参照,如果看不懂可留下邮箱我每晚发送源代码给各位,我是用jar包是3.7.3版的,各位如果使用其他版本的包,可能会出现百度地图初始化失败的现象。对我被坑过。

    package com.example.baidutext;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.graphics.Color;
    import android.hardware.Sensor;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.os.PowerManager;
    import android.os.PowerManager.WakeLock;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;
    
    import com.baidu.location.BDLocation;
    import com.baidu.location.BDLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.mapapi.SDKInitializer;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.BaiduMap.OnMapLongClickListener;
    import com.baidu.mapapi.map.BitmapDescriptor;
    import com.baidu.mapapi.map.BitmapDescriptorFactory;
    import com.baidu.mapapi.map.MapStatus;
    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.OverlayOptions;
    import com.baidu.mapapi.map.PolylineOptions;
    import com.baidu.mapapi.model.LatLng;
    import com.baidu.mapapi.search.route.BikingRouteResult;
    import com.baidu.mapapi.search.route.DrivingRouteResult;
    import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
    import com.baidu.mapapi.search.route.PlanNode;
    import com.baidu.mapapi.search.route.RoutePlanSearch;
    import com.baidu.mapapi.search.route.TransitRouteResult;
    import com.baidu.mapapi.search.route.WalkingRoutePlanOption;
    import com.baidu.mapapi.search.route.WalkingRouteResult;
    import com.baidu.mapapi.utils.DistanceUtil;
    
    public class MainActivity extends Activity {
    	/**
    	 * 百度地图视图
    	 */
    	private MapView map_v=null;
    	/**
    	 * 百度地图管理器
    	 */
    	private BaiduMap BaiDuMap;
    	//	/**
    	//	 * 位置管理器
    	//	 */
    	//	private LocationManager locationManager;
    	/**
    	 * 位置客户端
    	 */
    	private LocationClient locationClient = null;
    	/**
    	 * 获取位置时间间隔单位()
    	 */
    	private final int  time= 1000*9;
    	//	/**
    	//	 * 定位数据  
    	//	 */
    	//	private MyLocationData locData;
    	/**
    	 * 构建Marker图标  
    	 */
    	private BitmapDescriptor bitmap,StartBitmap,EndBitmap;  
    	/**
    	 *判断是否第一次定位
    	 */
    	private boolean isFirstLoc=true;
    	/**
    	 * 是否处于路线规划
    	 */
    	private boolean isGetRoute=false;
    	/**
    	 * 是否获取新路线
    	 */
    	private boolean isGetNewRoute=true;
    	/**
    	 * 定位位置数据
    	 * 多线程在修改本数据,需要增加一个锁;
    	 */
    	private List<LatLng> pointList = new ArrayList<LatLng>();
    	/**
    //	 * 判断是否处于暂停
    //	 */
    	//	private boolean isPause=false;
    	/**
    	 * 描述地图将要发生的变化
    	 */
    	protected MapStatusUpdate msUpdate = null;
    	/**
    	 *  覆盖物
    	 */
    	protected OverlayOptions overlay,StartOverlay,EndOverlay;
    	/**
    	 *  路线覆盖物
    	 */
    	private PolylineOptions polyline = null;
    	/**
    	 * 手机加速度感应器服务注册
    	 */
    	private SensorManager sm = null;
    	private Acc acc=new Acc();
    	/**
    	 * 最大距离单位()
    	 */
    	private final Double MaxDistance=90.00;
    	/**
    	 * 最小距离单位()
    	 */
    	private final Double MinDistance=2.0;
    	/**
    	 * 电源锁
    	 */
    	public static WakeLock wakeLock=null;
    	private PowerReceiver powerReceiver = new PowerReceiver();
    	/**
    	 *最近位置信息
    	 */
    	private LatLng latLng;
    	/**
    	 * 因距离太大丢失的点数
    	 */
    	private int LostLoc=0;
    	/**
    	 * 第一次定位丢失的点数
    	 */
    	private int FLostLoc=0;
    	/**
    	 * 程序名称
    	 */
    	private final String APP_FOLDER_NAME = "LocationDemo";
    	/**
    	 * 路线规划监听
    	 */
    	private RoutePlanSearch mSearch;
    	/**
    	 * 当前位置,终点位置
    	 */
    	private LatLng ll,EndLL;
    	/**
    	 * 路线规划等待进度框
    	 */
    	private ProgressDialog progressDialog;
    	/**
    	 * 获取位置距离常量
    	 */
    	private int constant=0;
    	/* (non-Javadoc)
    	 * @see android.app.Activity#onCreate(android.os.Bundle)
    	 */
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		sm = (SensorManager) getSystemService(SENSOR_SERVICE);
    		SDKInitializer.initialize(getApplicationContext());
    		
    //		activityList.add(this);
    		
    		setContentView(R.layout.activity_main);
    		init();
    		//设置定位监听
    		locationClient.registerLocationListener(new BDLocationListener(){
    
    			@Override
    			public void onReceiveLocation(BDLocation location) {
    				// TODO Auto-generated method stub
    				//				locData = new MyLocationData.Builder()  
    				//				.accuracy(0)  
    				//				// 此处设置开发者获取到的方向信息,顺时针0-360  
    				//				.direction(0).latitude(location.getLatitude())  
    				//				.longitude(location.getLongitude()).build();  
    				//				// 设置定位数据  
    				//				BaiDuMap.setMyLocationData(locData);  
    				ll = new LatLng(location.getLatitude(),
    						location.getLongitude());
    				progressDialog.dismiss();
    				if(isFirstLoc||isGetRoute){
    					if(!isGetRoute){
    						MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
    						BaiDuMap.animateMapStatus(u);
    					}
    					//				MyLocationConfiguration config = new MyLocationConfiguration(LocationMode.NORMAL, true, bitmap);//普通(LocationMode.NORMAL)、跟随(LocationMode.FOLLOWING)、罗盘(LocationMode.COMPASS)
    					//				BaiDuMap.setMyLocationConfigeration(config);
    					isFirstLoc=false;
    					if(constant<pointList.size()){
    						if(DistanceUtil.getDistance(pointList.get(constant),ll)>DistanceUtil.getDistance(pointList.get(constant+1),ll)){
    							save("距离: "+DistanceUtil.getDistance(pointList.get(constant+1),ll)+" 时间: "+getStringDate()+" 点数: "+constant);
    							if(DistanceUtil.getDistance(pointList.get(constant+1),ll)>100&&isGetNewRoute){
    								IsGetNewRoute();
    							}
    							constant++;
    						}else{
    							save("距离: "+DistanceUtil.getDistance(pointList.get(constant),ll)+" 时间: "+getStringDate()+" 点数: "+constant);
    							if(DistanceUtil.getDistance(pointList.get(constant),ll)>100&&isGetNewRoute){
    								IsGetNewRoute();
    							}
    						}
    					}
    					
    					drawRealtimePoint(ll);
    				}else{
    					showRealtimeTrack(location);
    				}
    				
    			}
    		});
    		locationClient.start();
    		//路线规划回调
    		OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener(){
    
    			@Override
    			public void onGetBikingRouteResult(BikingRouteResult arg0) {
    				// TODO Auto-generated method stub
    			}
    
    			@Override
    			public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
    				// TODO Auto-generated method stub
    			}
    
    			@Override
    			public void onGetTransitRouteResult(TransitRouteResult arg0) {
    				// TODO Auto-generated method stub
    			}
    
    			@Override
    			public void onGetWalkingRouteResult(WalkingRouteResult WalkingRoute) {
    				// TODO Auto-generated method stub
    				if(WalkingRoute.getRouteLines()!=null){
    					constant =0;
    					isGetNewRoute=true;
    					for(int i=0;i<WalkingRoute.getRouteLines().get(0).getAllStep().size();i++){
    						pointList.addAll(WalkingRoute.getRouteLines().get(0).getAllStep().get(i).getWayPoints());
    					}
    					save("时间: "+getStringDate()+" 总点数: "+pointList.size());
    				}
    				else
    //					Toast.makeText(MainActivity.this, "获取线路失败", 3000).show();
    					System.out.println("ccccccccccccccccccc");
    			}
    			
    		};
    		mSearch.setOnGetRoutePlanResultListener(listener);
    		//长按地图监听
    		BaiDuMap.setOnMapLongClickListener(new OnMapLongClickListener() {
    			
    			@Override
    			public void onMapLongClick(LatLng arg0) {
    				// TODO Auto-generated method stub
    				EndLL=arg0;
    				StartRoutePlan();
    			}
    		});
    //		mSearch.destroy();
    		Toast.makeText(this, "正在定位....", 3000).show();
    	}
    	/**
    	 * 初始化资源
    	 */
    	protected void init(){
    		map_v=(MapView)findViewById(R.id.bmapView);
    		bitmap = BitmapDescriptorFactory.fromResource(R.drawable.map_d);
    		StartBitmap= BitmapDescriptorFactory.fromResource(R.drawable.start_bitmap);
    		EndBitmap= BitmapDescriptorFactory.fromResource(R.drawable.end_bitmap);
    		//		locationManager = (LocationManager) getSystemService(this.LOCATION_SERVICE);
    		BaiDuMap=map_v.getMap();
    		locationClient = new LocationClient(this);
    		LocationClientOption option = new LocationClientOption();
    		option.setOpenGps(true);        //是否打开GPS
    		option.setCoorType("bd09ll");       //设置返回值的坐标类型。bd09ll百度加密经纬度坐标,bd09百度加密墨卡托坐标,gcj02国测局加密经纬度坐标
    		option.setPriority(LocationClientOption.GpsOnly);  //设置定位优先级,只取gps定位;
    		option.setProdName(APP_FOLDER_NAME); //设置产品线名称。
    		option.setScanSpan(time);    //设置定时定位的时间间隔。单位毫秒
    		locationClient.setLocOption(option);
    		BaiDuMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//普通地图模式 ;MAP_TYPE_SATELLITE为卫星地图;MAP_TYPE_NONE空白地图;
    		BaiDuMap.setTrafficEnabled(false);//不开启交通视图;
    		map_v.showZoomControls(false);//不开启底部放大缩小 图标;
    		BaiDuMap.animateMapStatus(MapStatusUpdateFactory.zoomTo(18));//设置地图缩放
    		BaiDuMap.setMyLocationEnabled(true);//开启定位图层
    		BaiDuMap.setMaxAndMinZoomLevel(18.0f,1.0f);
    		mSearch = RoutePlanSearch.newInstance();
    		progressDialog=new ProgressDialog(this);
    	}
    
    	@Override
    	protected void onStart() {
    		// TODO Auto-generated method stub
    		super.onStart();
    	}
    	@Override
    	protected void onDestroy() {
    		// TODO Auto-generated method stub
    		super.onDestroy();
    		map_v.onDestroy();
    		BaiDuMap.setMyLocationEnabled(false);
    		locationClient.stop();
    		map_v = null;
    		releaseWakeLock();
    		sm.unregisterListener(acc);
    		mSearch.destroy();
    		saveArray();
    	}
    
    	@Override
    	protected void onPause() {
    		// TODO Auto-generated method stub
    		super.onPause();
    		map_v.onPause();
    	}
    	@Override
    	public boolean onMenuItemSelected(int featureId, MenuItem item) {
    		// TODO Auto-generated method stub
    		if(item.getItemId()==R.id.action_settings)
    		{
    			progressDialog.setTitle("路线规划");
    			progressDialog.setMessage("正在清除路线请稍后。。");
    			progressDialog.show();
    			isGetRoute=false;
    			if(pointList!=null||pointList.size()>0)
    				pointList.clear();
    			if(StartOverlay!=null)
    				StartOverlay=null;
    			if(EndOverlay!=null)
    				EndOverlay=null;
    		}
    		return super.onMenuItemSelected(featureId, item);
    		
    	}
    	
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// TODO Auto-generated method stub
    		return super.onCreateOptionsMenu(menu);
    	}
    	/*
    	 * 将数据临时保存到xml文件
    	 */
    	private boolean saveArray() {  
    		deleteXML();
    		SharedPreferences sp= getSharedPreferences("lat", Context.MODE_APPEND);  
    		Editor mEdit1= sp.edit(); 
    		mEdit1.remove("Status_size");
    		mEdit1.putInt("Status_size",pointList.size());
    
    		for(int i=0;i<pointList.size();i++) {  
    			mEdit1.remove("lat_" + i);  
    			mEdit1.putString("lat_" + i,pointList.get(i).latitude+"");
    			mEdit1.remove("lon_" + i);  
    			mEdit1.putString("lon_" + i,pointList.get(i).longitude+"");
    		}  
    		return mEdit1.commit();	   
    	}
    	@Override
    	protected void onResume() {
    		// TODO Auto-generated method stub
    		super.onResume();
    		map_v.onResume();
    		sm.registerListener(acc, 
    				Sensor.TYPE_ACCELEROMETER ,
    				SensorManager.SENSOR_DELAY_NORMAL);
    		acquireWakeLock();
    		//		if(latLng!=null)
    		//			drawRealtimePoint(latLng);
    	}
    	//	/*
    	//	 * 读取xml文件存储数据;
    	//	 * @param mContext
    	//	 */
    	//	protected void loadArray(Context mContext) {	
    	//		SharedPreferences mSharedPreference1=getSharedPreferences("lat", Context.MODE_PRIVATE);   
    	//		//		  pointList.clear();  
    	//		int size = mSharedPreference1.getInt("Status_size", 0);	
    	//
    	//		for(int i=0;i<size;i++) {
    	//			Double lat1=Double.valueOf(mSharedPreference1.getString("lat_"+i, null));
    	//			Double lon1=Double.valueOf(mSharedPreference1.getString("lat_"+i, null));
    	//			pointList.add(new LatLng(lat1, lon1));	
    	//		}
    	//	}
    	/*
    	 * 删除xml文件
    	 */
    	private void deleteXML() {
    		File file = new File("/data/data/" + getPackageName().toString()  
    				+ "/shared_prefs", "lat.xml");  
    		if (file.exists()) {  
    			file.delete(); 
    		}
    	}
    	/*
    	 * 显示实时轨迹
    	 * 
    	 * @param realtimeTrack
    	 */
    	protected void showRealtimeTrack(BDLocation location) {
    		double latitude = location.getLatitude();
    		double longitude = location.getLongitude();
    		if (Math.abs(latitude - 0.0) < 0.000001 && Math.abs(longitude - 0.0) < 0.000001) {
    			Toast.makeText(this, "当前无轨迹点", 3000).show();
    		} else {
    			latLng = new LatLng(latitude, longitude);
    			if (IsMove(latLng,location)) {
    				// 绘制实时点
    				drawRealtimePoint(latLng);
    			}
    		}
    
    	}
    
    	/*
    	 * 绘制实时点
    	 * 
    	 * @param points
    	 */
    	private void drawRealtimePoint(LatLng point) {
    
    		BaiDuMap.clear();
    		polyline=null;
    		MapStatus mMapStatus = new MapStatus.Builder().target(point).build();
    
    		msUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
    
    
    		overlay = new MarkerOptions().position(point)
    				.icon(bitmap).zIndex(9).draggable(true);
    		
    		if (pointList.size() >=2 && pointList.size() <= 100000) {
    			// 添加路线(轨迹)
    			polyline = new PolylineOptions().width(10)
    					.color(Color.RED).points(pointList);
    		}
    
    		addMarker();
    
    	}
    	/*
    	 * 添加地图覆盖物
    	 */
    	protected  void addMarker() {
    
    		if (null != msUpdate) {
    			BaiDuMap.setMapStatus(msUpdate);
    		}
    
    		// 路线覆盖物
    		if (null != polyline) {
    			BaiDuMap.addOverlay(polyline);
    		}
    
    		// 实时点覆盖物
    		if (null != overlay) {
    			BaiDuMap.addOverlay(overlay);
    		}
    
    		//起点覆盖物
    		if (null != StartOverlay) {
    			BaiDuMap.addOverlay(StartOverlay);
    		}
    		// 终点覆盖物
    		if (null != EndOverlay) {
    			BaiDuMap.addOverlay(EndOverlay);
    		}
    	}
    
    	/*
    	 *@author chenzheng_Java  
    	 *保存用户输入的内容到文件 
    	 */  
    	private void save(String content) {  
    
    		try {  
    			/* 根据用户提供的文件名,以及文件的应用模式,打开一个输出流.文件不存系统会为你创建一个的, 
    			 * 至于为什么这个地方还有FileNotFoundException抛出,我也比较纳闷。在Context中是这样定义的 
    			 *   public abstract FileOutputStream openFileOutput(String name, int mode) 
    			 *   throws FileNotFoundException; 
    			 * openFileOutput(String name, int mode); 
    			 * 第一个参数,代表文件名称,注意这里的文件名称不能包括任何的/或者/这种分隔符,只能是文件名 
    			 *          该文件会被保存在/data/data/应用名称/files/chenzheng_java.txt 
    			 * 第二个参数,代表文件的操作模式 
    			 *          MODE_PRIVATE 私有(只能创建它的应用访问) 重复写入时会文件覆盖 
    			 *          MODE_APPEND  私有   重复写入时会在文件的末尾进行追加,而不是覆盖掉原来的文件 
    			 *          MODE_WORLD_READABLE 公用  可读 
    			 *          MODE_WORLD_WRITEABLE 公用 可读写 
    			 *  */  
    			content=content+"\n";
    			FileOutputStream outputStream = openFileOutput("Log.log",Activity.MODE_APPEND);  
    			outputStream.write(content.getBytes());  
    			outputStream.flush();  
    			outputStream.close();  
    		} catch (FileNotFoundException e) {  
    			e.printStackTrace();  
    		} catch (IOException e) {  
    			e.printStackTrace();  
    		}  
    
    	}  
    	/*
    	 * 获取系统时间
    	 */
    	private String getStringDate() {
    		Date currentTime = new Date();
    		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		String dateString = formatter.format(currentTime);
    		return dateString;
    	}
    
    	/*
    	 * 判断手机是否在运动
    	 */
    	private boolean IsMove(LatLng latLng,BDLocation location){
    		
    		if(pointList.size()>=1){
    			Double dis=DistanceUtil.getDistance(pointList.get(pointList.size()-1),latLng);
    			//判断手机是否静止,如果静止,判定采集点无效,直接抛弃
    			if(!acc.is_Acc&&acc.IsRun){
    				acc.IsRun=false;
    				return false;
    			}
    			//判断是否是第一次定位置,如果是第一次定位并且因为第一次抛弃的位置数量小于10个则判断两点间距离大小
    			if(FLostLoc<10){
    				FLostLoc=FLostLoc+1;
    				if(dis>10&&FLostLoc<6){//距离大于十米,而且被抛弃数量少于5个则说明有可能是获取位置失败
    					pointList.clear();
    					pointList.add(latLng);//更新位置
    					return false;
    				}
    				if(dis>0&&dis<10&&FLostLoc>=6)//如果距离在10米内,则表示客户正在运动,直接跳出
    					FLostLoc=11;
    			}
    			//根据两点间距离判断是否发生定位漂移,如果漂移距离小于MinDistance则抛弃,如果漂移距离大于MaxDistance则取两点的中间点.
    				if(dis<=MinDistance){
    					if((dis<=MinDistance||dis>=MaxDistance)){
    					return false;
    				}
    
    				if(LostLoc>=4){
    					Double newlatitude=(latLng.latitude+pointList.get(pointList.size()-1).latitude)/2;
    					Double newlongitude=(latLng.longitude+pointList.get(pointList.size()-1).longitude)/2;
    					latLng = new LatLng(newlatitude, newlongitude);
    				}else{
    					LostLoc=LostLoc+1;
    					return false;
    				}
    
    			}
    			LostLoc=0;//重置丢失点的个数
    			//			pointList.add(latLng);
    			acc.is_Acc=false;
    		}
    		pointList.add(latLng);
    		return true;
    	}
    	/*
    	 * 开始规划线路
    	 */
    	private void StartRoutePlan() {
    		// TODO Auto-generated method stub
    		progressDialog.setTitle("路线规划");
    		progressDialog.setMessage("正在规划路线请稍后。。");
    		progressDialog.show();
    		if(pointList!=null||pointList.size()>0)
    			pointList.clear();
    		PlanNode stNode = PlanNode.withLocation(ll);  
    		StartOverlay=new MarkerOptions().position(ll)
    				.icon(StartBitmap).zIndex(9);
    		
    		PlanNode enNode = PlanNode.withLocation(EndLL);
    		EndOverlay=new MarkerOptions().position(EndLL)
    				.icon(EndBitmap).zIndex(9);
    		mSearch.walkingSearch((new WalkingRoutePlanOption())  
    					.from(stNode)  
    					.to(enNode));
    		isGetRoute=true;
    	}
    	/*
    	 * 获取新路线
    	 */
    	private void IsGetNewRoute() {
    		// TODO Auto-generated method stub
    		AlertDialog.Builder builder = new Builder(this);
    		builder.setMessage("您已偏移路线,是否重新规划路线?");
    		builder.setTitle("路线偏移");
    		builder.setPositiveButton("重新规划", new OnClickListener() {   
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				StartRoutePlan();
    				dialog.dismiss();
    			}
    		});  
    		builder.setNegativeButton("按原规划", new OnClickListener() {   
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    			dialog.dismiss();
    		}
    		});
    		builder.create().show();
    		isGetNewRoute=false;
    	}
    	/*
    	 * 申请电源锁 
    	 */
    	private void acquireWakeLock() {
    		if (null == wakeLock) {
    
    			PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    
    			wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,getClass().getName());
    
    		}
    		IntentFilter filter = new IntentFilter();
    		filter.addAction(Intent.ACTION_SCREEN_ON);
    		filter.addAction(Intent.ACTION_SCREEN_OFF);
    		registerReceiver(powerReceiver, filter);
    	}
    
    	/*
    	 * 释放电源锁
    	 */
    	private void releaseWakeLock() {
    		unregisterReceiver(powerReceiver);
    	}
    }
    
    

    ##下面PowerReceiver文件的内容

    这里贴出的代码主要是完成电源锁的开启和撤销

    package com.example.baidutext;
    
    import android.annotation.SuppressLint;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class PowerReceiver extends BroadcastReceiver {
    
        @SuppressLint("Wakelock")
        @Override
        public void onReceive(final Context context, final Intent intent) {
            final String action = intent.getAction();
    
            //按下电源键,关闭屏幕
            if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                System.out.println("screen off,acquire wake lock!");
                if (null != MainActivity.wakeLock && !(MainActivity.wakeLock.isHeld())) {
                	MainActivity.wakeLock.acquire();
                }
             //按下电源键,打开屏幕  
            } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
                System.out.println("screen on,release wake lock!");
                if (null != MainActivity.wakeLock && MainActivity.wakeLock.isHeld()) {
                	MainActivity.wakeLock.release();
                }
            }
        }
    
    }
    

    ##下面Acc文件的内容

    这个文件主要是获取加速感应器的值,然后通过波峰和波谷的插值,以及两个波峰之间的时间差来判断手机是否处于移动。关于详细的大家可查找计步器原理。一下算法非本人原创,但是一直找不到原创作者,如作者本人看到,可与我联系

    package com.example.baidutext;
    
    import android.hardware.Sensor;
    import android.hardware.SensorListener;
    /**
     *根据加速度判断手机是否处于静止
     * @author Administrator
     *
     */
    public class Acc implements SensorListener {
    	//	/**
    	//	 * 手机加速度各方向状态
    	//	 */
    	//	private float F_Acc_x,F_Acc_y,F_Acc_z;
    	//	/**
    	//	 * 上次获取状态时间
    	//	 */
    	//	private long LastUpdateTime;   
    	//	/**
    	//	 * 两次获取状态时间间隔单位()
    	//	 */
    	//	private final int UPTATE_INTERVAL_TIME = 1000*10;   
    	//	
    	/**
    	 * 当前传感器的值
    	 */
    	private float gravityNew = 0;
    	/**
    	 * 上次传感器的值
    	 */
    	private float gravityOld = 0;
    	/**
    	 * 此次波峰的时间
    	 */
    	private long timeOfThisPeak = 0;
    	/**
    	 * 上次波峰的时间
    	 */
    	private long timeOfLastPeak = 0;
    	/**
    	 * 当前的时间
    	 */
    	private long timeOfNow = 0;;
    	/**
    	 * 波峰值
    	 */
    	private float peakOfWave = 0;
    	/**
    	 * 波谷值
    	 */
    	private float valleyOfWave = 0;
    	/**
    	 * 初始阈值
    	 */
    	private float ThreadValue = (float) 2.0;
    	/**
    	 * 动态阈值需要动态的数据,这个值用于这些动态数据的阈值
    	 */
    	private final float initialValue = (float) 1.3;
    	/**
    	 * 上一点的状态,上升还是下降
    	 */
    	private boolean lastStatus = false;
    	/**
    	 * 是否上升的标志位
    	 */
    	private boolean isDirectionUp = false;
    	/**
    	 * 持续上升次数
    	 */
    	private int continueUpCount = 0;
    	/**
    	 * 上一点的持续上升的次数,为了记录波峰的上升次数
    	 */
    	private int continueUpFormerCount = 0;
    	public boolean is_Acc=false;
    	//	private int ACC=30;//手机感应器波动范围,30以内判定手机处于静止
    	private int tempCount = 0;
    	private final int valueNum = 4;
    	/**
    	 * 用于存放计算阈值的波峰波谷差值
    	 */
    	private float[] tempValue = new float[valueNum];
    	/**
    	 * 记录波峰数量
    	 */
    	private int CountValue = 0;
    	/**
    	 * 判断传感器是否在运行
    	 */
    	public boolean IsRun=false; 
    	
    	public Acc(){
    		//		LastUpdateTime=System.currentTimeMillis();
    	}
    	@Override
    	public void onAccuracyChanged(int arg0, int arg1) {
    		// TODO Auto-generated method stub
    
    	}
    	/**
    	 * 感应器状态改变时自动调用此方法
    	 */
    	@Override
    	public void onSensorChanged(int arg0, float[] arg1) {
    		// TODO Auto-generated method stub
    		IsRun=true;
    		if(arg0==Sensor.TYPE_ACCELEROMETER){
    			//			JIUjia(arg1);
    			gravityNew = (float) Math.sqrt(arg1[0] * arg1[0]
    					+ arg1[1] * arg1[1] + arg1[2] * arg1[2]);
    			DetectorNewStep(gravityNew);
    		}
    	}
    
    	//	 protected boolean JIUjia(float[] values) {
    	//	    	if(F_Acc_x!=0){
    	//	    		long currentUpdateTime = System.currentTimeMillis();   
    	//	    		long timeInterval = currentUpdateTime - LastUpdateTime;    
    	//	    		if(timeInterval < UPTATE_INTERVAL_TIME)
    	//	    			return false;
    	//	    		LastUpdateTime=currentUpdateTime;
    	//	    		float tem0=values[0]-F_Acc_x;
    	//	    		float tem1=values[1]-F_Acc_y;
    	//	    		float tem2=values[2]-F_Acc_z;
    	//	    		System.out.println(Math.abs(tem0)+","+Math.abs(tem1)+","+Math.abs(tem2));
    	//	    		if(Math.abs(tem0)>ACC||Math.abs(tem1)>ACC||Math.abs(tem2)>ACC)
    	//	    			is_Acc=true;
    	//	    		
    	//	    	}
    	//	    	F_Acc_x=values[0];
    	//	    	F_Acc_y=values[1];
    	//	    	F_Acc_z=values[2];
    	//	    	return is_Acc;
    	//
    	//	    }
    
    	/*
    	 * 检测步子
    	 * 1.传入sersor中的数据
    	 * 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1* 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中
    	 * */
    	public void DetectorNewStep(float values) {
    		if (gravityOld == 0) {
    			gravityOld = values;
    		} else {
    			if (DetectorPeak(values, gravityOld)) {
    				timeOfLastPeak = timeOfThisPeak;
    				timeOfNow = System.currentTimeMillis();
    				if ((timeOfNow - timeOfLastPeak) >= 250&& (peakOfWave - valleyOfWave >= ThreadValue)) {
    					timeOfThisPeak = timeOfNow;
    					//两步之间间隔大于4秒则不算
    					if((timeOfNow-timeOfLastPeak)>40000)
    						CountValue=0;
    					else
    						CountValue++;
    					//只有手机连续摇晃4下或者以上才判定为走路
    					if(CountValue>=4)
    						is_Acc=true;
    					//	                    mStepListeners.onStep();
    				}
    				if (timeOfNow - timeOfLastPeak >= 250&& (peakOfWave - valleyOfWave >= initialValue)) {
    					timeOfThisPeak = timeOfNow;
    					ThreadValue = Peak_Valley_Thread(peakOfWave - valleyOfWave);
    				}
    			}
    		}
    		gravityOld = values;
    	}
    
    	/*
    	 * 检测波峰
    	 * 以下四个条件判断为波峰:
    	 * 1.目前点为下降的趋势:isDirectionUp为false
    	 * 2.之前的点为上升的趋势:lastStatus为true
    	 * 3.到波峰为止,持续上升大于等于4* 4.波峰值大于20
    	 * 记录波谷值
    	 * 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值
    	 * 2.所以要记录每次的波谷值,为了和下次的波峰做对比
    	 * */
    	public boolean DetectorPeak(float newValue, float oldValue) {
    		lastStatus = isDirectionUp;
    		if (newValue >= oldValue) {
    			isDirectionUp = true;
    			continueUpCount++;
    		} else {
    			continueUpFormerCount = continueUpCount;
    			continueUpCount = 0;
    			isDirectionUp = false;
    		}
    
    		if (!isDirectionUp && lastStatus&& (continueUpFormerCount >= 4 || oldValue >= 20&&oldValue<=40)) {
    			peakOfWave = oldValue;
    			return true;
    		} else if (!lastStatus && isDirectionUp) {
    			valleyOfWave = oldValue;
    			return false;
    		} else {
    			return false;
    		}
    	}
    
    	/*
    	 * 阈值的计算
    	 * 1.通过波峰波谷的差值计算阈值
    	 * 2.记录4个值,存入tempValue[]数组中
    	 * 3.在将数组传入函数averageValue中计算阈值
    	 * */
    	public float Peak_Valley_Thread(float value) {
    		float tempThread = ThreadValue;
    		if (tempCount < valueNum) {
    			tempValue[tempCount] = value;
    			tempCount++;
    		} else {
    			tempThread = averageValue(tempValue, valueNum);
    			for (int i = 1; i < valueNum; i++) {
    				tempValue[i - 1] = tempValue[i];
    			}
    			tempValue[valueNum - 1] = value;
    		}
    		return tempThread;
    
    	}
    
    	/*
    	 * 梯度化阈值
    	 * 1.计算数组的均值
    	 * 2.通过均值将阈值梯度化在一个范围里
    	 * */
    	public float averageValue(float value[], int n) {
    		float ave = 0;
    		for (int i = 0; i < n; i++) {
    			ave += value[i];
    		}
    		ave = ave / valueNum;
    		if (ave >= 8)
    			ave = (float) 4.3;
    		else if (ave >= 7 && ave < 8)
    			ave = (float) 3.3;
    		else if (ave >= 4 && ave < 7)
    			ave = (float) 2.3;
    		else if (ave >= 3 && ave < 4)
    			ave = (float) 2.0;
    		else {
    			ave = (float) 1.3;
    		}
    		return ave;
    	}
    }
    

    至此就全部结束了,各位如有其他问题可直接留言给我。

    展开全文
  • 餐厅应用 演示应用程序,可在地图绘制餐厅数据。 在找到
  • 百度地图绘制行政区边界

    千次阅读 2017-02-20 22:42:48
    一般app很少看到有在百度地图上显示行政边界的,本想偷懒一回,拿个现成的,但百度好长时间都没有。还是耐心的去看类参考吧,后来发现挺简单的,所以记录一下方便以后直接拿来用了。 其实就是获取点位生成图层添加...

    一般app很少看到有在百度地图上显示行政边界的,本想偷懒一回,拿个现成的,但百度好长时间都没有。还是耐心的去看类参考吧,后来发现挺简单的,所以记录一下方便以后直接拿来用了。

    其实就是获取点位生成图层添加到baidumap里面去。

    private void addBundary(String districtName) {   
        DistrictSearchOption option = new DistrictSearchOption();  
        searchOption = option.districtName(distrName).cityName("上海市");
        DistrictSearch search = DistrictSearch.newInstance();
        //获取到行政边界点
        search.searchDistrict(searchOption);
        search.setOnDistrictSearchListener(new OnGetDistricSearchResultListener() {
            @Override
            public void onGetDistrictResult(DistrictResult districtResult) {
                List<List<LatLng>> latLngs = districtResult.getPolylines();
    	        setLocation(districtResult.getCenterPt());
                if (latLngs != null && !latLngs.isEmpty()) {
                    polygonOptions = new PolygonOptions().points(latLngs.get(0)).fillColor(Color.parseColor("#00000000")).stroke(new Stroke(5, Color.parseColor("#AD8764")));
                    baiduMap.addOverlay(polygonOptions);
                }
            }
        });
    }
    
    //设定到行政中心中心点坐标
    private void setLocation(LatLng latLng) {  
        //定义地图状态 
        MapStatus mMapStatus = new MapStatus.Builder().target(latLng).build();
        //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);          
        //改变地图状态 
        baiduMap.setMapStatus(mMapStatusUpdate);
    }
    

     

     

     

    展开全文
  • 因工作需求,必须用百度地图绘制热力图;发现因关于百度地图密钥的使用问题如下: 1、抓取经纬度信息状态码200: {"status":200,"message":"APP不存在,AK有误请检查再重试"} 2、用浏览器打开写好的html弹窗: ...
  • vue结合esmap进行室内3D地图绘制

    千次阅读 2020-07-17 11:00:02
    近日,项目需求中有需要进行室内3D地图的开发,虽然可以和百度高德地图合作,让百度高德制作3D地图,但是成本太高,在进行多方查找之后,找到了esmap这个绘制地图的框架,下面具体介绍怎么做 先整个官方文档地址 ...
  • 问题:百度地图绘制圆形,圆形半径可随进度拖动条发生改变 思路:圆形本身是一个覆盖物,可参考百度地图Demo中的OverlayDemo.java这个类进行实现。完成画圆之后,圆形半径如何随着进度条的拖动进行变化?进度条与...
  • 越来越深入了解osmdroid开源地图...还有怎么绘制地图的网格,绘制网络分为两种,一种是直接在地图绘制,监听缩放等级。还有一种是利用Fragment加一层进行绘制。osmdroid 仓库地址:http://jcenter.bintray.com/org/o
  • 百度地图轨迹绘制

    千次阅读 2014-12-15 20:15:15
    一直想做一个记录自己运动轨迹的app,只是不知如何绘制轨迹。看了百度地图API中的demo,其实很简单。 核心代码只有两句: options = new PolylineOptions().color(0xAAFF0000).width(6) .points(points); ...
  • Android 百度地图绘制点和轨迹 二、环境 win10 AndroidStudio 三、代码实现 说明:注释掉的部分是我之前直接把数据定死的,只是看代码能不能正常运行,看能不能得到我预期的结果。没注释的,我是用JSON字符串来作为...
  • 微图APP除了很方便地标注绘制点外,还可以进行线路绘制。适合用于光纤、燃气和电力等管线绘制,也可以用于外业实地调绘。在微图APP中,无论是线路绘制、修改节点位置、添加节点或删除节点都非常方便。 1.绘制线的三...
  • 通过百度地图API绘制经纬度map

    千次阅读 2017-07-31 14:12:42
    通过百度地图API绘制经纬度map
  • 目前室内电子地图使用的是简单的图片显示方法,即人工将室内地图绘制成图片后,使用app客户端加载图片显示地图。现有技术的问题与不足:难以动态的更新和显示地图中各类元素。由于地图中各元素都是在图片中固定的,...
  • 需求:根据经纬度绘制标记点,点击标记点弹出弹框和底部按钮,点击顶部弹框进入二级界面,点击底部按钮弹出第三方地图软件选择页,实现跨进程跳转。 项目是公司项目,只放出重要部分代码。 绘制标记点: final ...
  • 百度地图历史轨迹绘制,动画播放,暂停、加速、减速,车头实时角度偏移,HTML页面点开即可使用
  • 问题描述:最近在做微信小程序项目,根据业务需求需要绘制起点到终点的线路图, 但是需要将起点和终点都都在地图的可视区域内显示,针对这个问题,我采取了以下下解决方案,效果图如下所示 xml: <view class=...
  • python绘制地图

    2020-02-02 16:28:07
    app_price = [10.84,8.65,18.06,8.90,5.04,29.20,8.98,17.80,27.81,24.24,12.72,11.10,6.30,7.00,22.45,16.92,11.00,14.99,18.85,5.85,1.40,7.32,14.61,4.62,6.05,8.07,6.73,15.54,13.00,39.07,25.61,21.3] ...
  • App需要展示行程路线,这里用的是高德地图的Api 绘制路线: 首先下载了官方提供的 AMap3DDemo ,运行后找到 case 多彩线绘制,仿照它基本上可以实现路线绘制。 绿色位置请忽略。 蓝色的线是绘制的轨迹线。 代码如下:...
  • 接上一篇文章,本篇探讨下Flutter地图绘制线,绘制线的需求在APP开发中,有很多,比如运动轨迹,物流轨迹等,因此有广泛的应用。 简单的绘制线的实现 绘制多条线
  • 这是基于百度地图sdk的地图app开发系列博客第五篇 代码仓库位置:https://github.com/YanhuiLu89/lmap.git 上一篇 基于百度地图sdk的地图app开发(五)——poi检索 因为本人是做C++开发,android和java都不熟,这...
  • 谈谈地图中的道路绘制

    千次阅读 2014-10-08 11:29:51
    地图渲染中道路相互关系表达,以及各家地图道路绘制的效果评比。。。
  • JavaScript高德地图绘制echarts图表随地图移动** 先上效果图 实现方法如下: 使用高德地图“信息窗体”,信息窗体AMap.InfoWindow的属性content,在content中创建一个div元素,在此div元素中绘制echarts图表。 ...
  • 百度地图之自定义绘制功能

    千次阅读 热门讨论 2013-09-09 01:42:30
    我们可以在地图绘制各种自定义的图形,包括点、折线、圆、多边形等等,尤其绘制点和折线非常实用,点可以用来标识所处的位置,折线可以用来描述走过的轨迹,结合前面GPS定位功能可以做出一些非常有意思的应用,...
  • Android 绘制中国地图及热点省份分布

    万次阅读 热门讨论 2017-10-10 11:09:59
    一丶效果图 二丶需求功能点技术点 ...2.Path绘制中国地图 3.SVG 转 Android Canvas Path Android Canvas Path基础:http://www.gcssloop.com/customview/Path_Basic/ 三丶看代码 自定义ChinaMapView /*
  • 百度地图绘制多个点例子

    千次阅读 2017-04-21 14:35:22
    水平有限,欢迎指正、交流!! 百度地图绘制多个点 *{padding: 0;margin: 0;font-family: "微软雅黑"} h3{width: 100%;height: 45px;line-height: 45px;background: #eee;color: #0
  • 百度地图调用app进行路径规划

    千次阅读 2015-05-23 13:28:32
    利用百度地图有两种方式来进行路径规划。 一是通过调用app来进行路径规划,二是通过url来访问。 调用app:baidumap://map/ 通过url来访问:http://api.map.baidu.com/ // 打开网页和调用webView的URL
  • uni-app:在接入高德地图进行polyline绘制时 报错:[渲染层错误] MultiPolyline.styles: 样式id line_0 对应的PolylineStyle.width属性 原代码是这样的: polyline: [{ points: [{ latitude: 26.235081, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,196
精华内容 4,478
关键字:

地图绘制app