精华内容
下载资源
问答
  • 地图标记软件app
    2022-04-05 14:53:49

    1、先看效果

    uni-app (微信小程序中)
    uni-app(微信小程序)中腾讯地图和swiper的联动效果

    2、实现方式

    1. 加载地图(我用的腾讯地图)
      使用uni.createMapContext创建地图
    onLoad() {
    			this.map.myMapObj = uni.createMapContext("myMap", this); // 得到map对象
    			this.getData();//加载数据
    		},
    
    1. swiper盒子放入页面,样式可根据要求自行修改
      直接使用uni-app中封装的swiper,注意swiper盒子应该包含在地图map标签内部
    <swiper class="swiper-box" :current="currentswiper" @change="swiperChange($event)" display-multiple-items=1>
    	<block>
    		<swiper-item class="swiperitem" v-for="(item,index) in markersData" :key='index'>
    			<view class="swiper-box1">
    				<view class="txt-img">
    					<image src="https://pic.imgdb.cn/item/61ef49652ab3f51d9100dd7e.png" mode=""></image>
    					<view class="txt-info">
    						<text class="title">{{item.title}}</text>
    						<text class="discrip">{{item.discripe}}</text>
    					</view>
    				</view>
    				<view class="navigation" @click="handleMapLocation(item.latitude,item.longitude,item.title)">
    					<text class="txt">导航</text>
    					<image src="../static/lnwd-img/daohang.png" mode=""></image>
    				</view>
    			</view>
    		</swiper-item>
    	</block>
    </swiper>
    
    1. 具体实现
      使用map组件的@markertap点击方法,点击时调用moveToLocation方法将地图中心移动到相应标记点,然后再动态修改swiper组件的current值。swiper滑动时,使用swiper组件的@change(current 改变时会触发)方法,滑动时调用map组件的moveToLocation方法,将地图中心移动至swiper滑块对应的经纬度
    markertap(e) { //标记点点击事件
    		let marker = this.map.markers.find(item => {return item.id == e.detail.markerId});
    		if(!marker) {
    			uni.showToast({
    				title: '数据加载失败',
    				icon:'none',
    				duration: 2000
    			});
    		} else {
    			//移动到当前定位地点
    			this.map.myMapObj.moveToLocation({
    				latitude: marker.latitude,
    				longitude: marker.longitude
    			});	
    		};
    		this.currentswiper = e.detail.markerId
    	},
    
    swiperChange(event) {
    	//移动到当前定位地点
    	console.log(event.detail.current)
    	this.map.myMapObj.moveToLocation({
    		latitude: this.markersData[event.detail.current]._source.latitude,
    		longitude: this.markersData[event.detail.current]._source.longitude
    	});	
    },
    

    3、整体代码

    <template>
    	<view class="map-page">
    		<map id="myMap" style="width: 100%; height: 90vh;" :show-location="true" :latitude="map.latitude" :longitude="map.longitude" :scale="map.scale" :markers="map.markers" :circles="map.circles" @markertap="markertap" >
    			<swiper class="swiper-box" :current="currentswiper" @change="swiperChange($event)" display-multiple-items=1>
    				<block>
    					<swiper-item class="swiperitem" v-for="(item,index) in testData" :key='index'>
    						<view class="swiper-box1">
    							<view class="txt-img">
    								<image src="https://pic.imgdb.cn/item/61ef49652ab3f51d9100dd7e.png" mode=""></image>
    								<view class="txt-info">
    									<text class="title">{{item.title}}</text>
    									<text class="discrip">{{item.discripe}}</text>
    								</view>
    							</view>
    							<view class="navigation" @click="handleMapLocation(item.latitude,item.longitude,item.title)">
    								<text class="txt">导航</text>
    								<image src="../static/lnwd-img/daohang.png" mode=""></image>
    							</view>
    						</view>
    					</swiper-item>
    				</block>
    			</swiper>
    			
    		</map>
    	</view>
    </template>
    
    <style lang="less" scoped>
    	@import 'index.less';
    </style>
    
    <script>
    	export default {
    		data() {
    			return {
    				currentswiper: 0,//swiper的current,默认显示第一个
    				testData: [],//swiper数据
    				map: {
    					myMapObj: {},
    					latitude: '', //默认地址是后台返回数据的第一条
    					longitude: '',
    					scale: 8.5, // 默认16
    					markers: [],//标记点
    					marker: {}
    				},
    			};
    		},
    		onLoad() {
    			this.map.myMapObj = uni.createMapContext("myMap", this); // 得到map对象
    			this.getData();//加载数据
    		},
    		methods: {
    			swiperChange(event) {
    				//移动到当前定位地点
    				console.log(event.detail.current)
    				this.map.myMapObj.moveToLocation({
    					latitude: this.markersData[event.detail.current]._source.latitude,
    					longitude: this.markersData[event.detail.current]._source.longitude
    				});	
    			},
    			markertap(e) { //标记点点击事件
    				let marker = this.map.markers.find(item => {return item.id == e.detail.markerId});
    				if(!marker) {
    					uni.showToast({
    						title: '数据加载失败',
    						icon:'none',
    						duration: 3000
    					});
    				} else {
    					this.map.myMapObj.moveToLocation({
    						latitude: marker.latitude,
    						longitude: marker.longitude
    					});	//移动到当前定位地点
    				};
    				this.currentswiper = e.detail.markerId
    			},
    			getData() { //获取地图显示的数据
    				uni.request({
    					url: '/jiekou',//后台接口地址,根据实际需要修改
    					method: 'POST',
    					header:{
    						'Content-Type' : 'application/json'
    					},
    					data: {
    						data:'canshu'//需要传的参数,根据需要修改
    					},
    					success: res => {
    						//请求成功
    						console.log(res);
    						this.map.latitude = res.data.data[0].latitude
    						this.map.longitude = res.data.data[0].longitude
    						this.map.markers = [];
    						res.data.data.forEach((item, index) => {
    							let marker = {
    								"id": index,
    								"latitude": item.latitude,
    								"longitude": item.longitude,
    								"width": '30rpx',
    								"height": '40rpx',
    								"iconPath": '../static/lnwd-img/location.png',
    								"callout": {//标记点顶部气泡
    									"content": item.title,
    									"display": "ALWAYS",
    									"padding": 6,
    									"borderRadius": 5,
    									"borderWidth": 1,
    									"borderColor": "#3D8DFE"
    								},
    								"customData": {
    									"title": item.title,
    									"describe": item.discripe,
    								}
    							};
    							this.map.markers.push(marker);
    							this.$set(this, "markersData", res.data.data);
    						});
    						console.log(this.markersData, 'this.markersData')
    						console.log(this.map, 'this.map')
    					},
    					fail: () => {}
    					});
    			},
    			
    			handleMapLocation(lat,long,titl) {
    				console.log('进入导航')
    				// 获取定位信息
    				uni.getLocation({
    					type: 'wgs84', //返回可以用于uni.openLocation的经纬度
    					// 用户允许获取定位
    					success: (res) => {
    						console.log(res, '经纬度===>')
    						if (res.errMsg == "getLocation:ok") {
    							uni.openLocation({
    								// 传入你要去的纬度
    								latitude: lat,
    								// 传入你要去的经度
    								longitude: long,
    								// 传入你要去的地址信息 不填则为空
    								address: titl,
    								// 缩放大小
    								scale: 18,
    								success: function() {
    									console.log('成功的回调success');
    								}
    							});
    						}
    					},
    					// 用户拒绝获取定位后 再次点击触发
    					fail: function(res) {
    						console.log(res)
    						if (res.errMsg == "getLocation:fail auth deny") {
    							uni.showModal({
    								content: '检测到您没打开获取信息功能权限,是否去设置打开?',
    								confirmText: "确认",
    								cancelText: '取消',
    								success: (res) => {
    									if (res.confirm) {
    										uni.openSetting({
    											success: (res) => {
    												console.log('确定');
    											}
    										})
    									} else {
    										console.log('取消');
    										return false;
    									}
    								}
    							})
    						}
    					}
    				});
    			},
    		}
    	}
    </script>
    
    
    更多相关内容
  • uniapp 微信小程序地图,在高德app、腾讯app、百度app、苹果地图app 中打开

    效果图:

    • 坐标:示例图中的坐标为“天安门"。<map>可添加多个坐标点
    • 方法一:点击uniapp中的<map>插件唤醒地图
    • 方法二:可以点击<view>、<button>等标签也可以唤醒地图
    • 点击图片一后,会跳转到图片二页面(无需自己写图片二页面,小程序会自动打开此页面)

    (图片一)

     

     

    (图片二):

             

    • 点击(上面图片一)后,会自动打开(图片二中)左边的图片 
    • 点击(图片二左边图片)右下角绿色icon,会出现底部打开地图app选项弹窗(图片二右边图片)。选择app后,会自动打开对应app软件,如没有下载,则显示下载app的页面。

    以下为实现方法:

    html:

    <!-- 方法一:点击小程序map地图插件跳转到app中打开 -->
    <map @click="mapFun" class='map' :latitude="latitude" :longitude="longitude" :markers="covers" />
    
    <!-- 方法二:点击button等按钮打开 -->
    <button type="default" @click="mapFun">唤醒题图</button>

    <map>注意事项:

    (使用map地图插件时,具体注意事项及使用方法,请参考官方文档:map | uni-app官网)

    1. <map> 组件的宽/高推荐写直接量,比如:750rpx,不要设置百分比值。
    2. 谷歌地图使用 wgs84 坐标,其他地图使用 gcj02 坐标,用错坐标类型会显示偏移。
    3. App平台 layer-style 属性需要在地图服务商后台创建,值设置为高德后台申请的字符串,详情()自定义地图-创建地图-开发指南-Android 地图SDK | 高德地图API详情()
    4. <map> 组件在不同平台的底层引擎是不同的:微信小程序为腾讯地图;H5为腾讯地图或谷歌地图;App、支付宝(中国大陆地区版本)小程序为高德地图;百度小程序、快应用为百度地图。app-vue也可以使用百度地图,在manifest中配置,打包后生效,但app-nvue只支持高德地图。另外选择地图、查看地图位置的API也仅支持高德地图。App端如无特殊必要,建议使用高德地图。
    5. map 组件默认的api是参考微信小程序的,如需要使用plus.map,可以通过$getAppMap获取原生地图对象,详见()uni.createMapContext(mapId,this) | uni-app官网详见()。注意nvue的map组件不是plus.map对象,无法使用$getAppMap
    6. <map> 组件默认为国测局坐标,调用 uni.getLocation 返回结果传递给 <map> 组件时,需指定 type 为 gcj02。
    7. ......(其他注意事项可参考上方官网地址)

     

    js:

    // 高德地图、腾讯、百度等地图中打开
    data(){
        return{
    	    latitude: 39.909,
    		longitude: 116.39742,
    		covers: [{
    			latitude: 39.909,
    			longitude: 116.39742,
    			width:'50rpx'
    		}]
        }
    },
    methods:{
        mapFun() {
    	    uni.openLocation({
    		latitude: this.latitude,, //纬度 - 目的地/坐标点
     		longitude: this.longitude,, //经度 - 目的地/坐标点
    		name: "电脑城",
    		address: "重庆九龙坡"
    	    });
       }
    }
    

    <map>其他配置:(文档:map | uni-app官网

    markers

    标记点用于在地图上显示标记的位置

    属性说明类型必填备注平台差异说明
    id标记点idNumbermarker点击事件回调会返回此id。建议为每个marker设置上Number类型id,保证更新marker时有更好的性能。最大限制9位数
    latitude纬度Number浮点数,范围 -90 ~ 90
    longitude经度Number浮点数,范围 -180 ~ 180
    title标注点名String点击时显示,callout存在时将被忽略App-nvue 2.1.5+、微信小程序、H5、支付宝小程序、百度小程序、京东小程序
    iconPath显示的图标String项目目录下的图片路径,支持相对路径写法,以'/'开头则表示相对小程序根目录;也支持临时路径
    rotate旋转角度Number顺时针旋转的角度,范围 0 ~ 360,默认为 0App-nvue 2.1.5+、微信小程序、支付宝小程序、百度小程序、京东小程序
    alpha标注的透明度Number默认1,无透明,范围 0 ~ 1App-nvue 2.1.5+、微信小程序、支付宝小程序、百度小程序、京东小程序
    width标注图标宽度Number默认为图片实际宽度App-nvue 2.1.5+、微信小程序、H5、支付宝小程序、百度小程序、京东小程序
    height标注图标高度Number默认为图片实际高度App-nvue 2.1.5+、微信小程序、H5、支付宝小程序、百度小程序、京东小程序
    callout自定义标记点上方的气泡窗口Object支持的属性见下表,可识别换行符。App-nvue 2.1.5+、微信小程序、支付宝小程序、百度小程序、京东小程序
    label为标记点旁边增加标签Object支持的属性见下表,可识别换行符。App-nvue 2.1.5+、微信小程序、H5、App、百度小程序、支付宝小程序
    anchor经纬度在标注图标的锚点,默认底边中点Object{x, y},x表示横向(0-1),y表示竖向(0-1)。{x: .5, y: 1} 表示底边中点App-nvue 2.1.5+、微信小程序、H5、百度小程序、京东小程序
    clusterId自定义点聚合簇效果时使用NumberApp-nvue 3.1.0+、微信小程序
    customCallout自定义气泡窗口Objectapp暂时不支持、微信小程序、支付宝小程序
    aria-label无障碍访问,(属性)元素的额外描述StringApp-nvue 3.1.0+、微信小程序
    展开全文
  • 四款手机地图软件横向测评!从爱斯基摩人绘制的海港图到今天的卫星地图,从哥伦布勇闯新大陆的粗糙航海图到今天人们出门精确到米的手机地图,几千年来地图伴随着人类文明进步发生了天翻地覆的变化。▲ 航海图 二十年...

    原标题:敢问路在何方?四款手机地图软件横向测评!

    从爱斯基摩人绘制的海港图到今天的卫星地图,从哥伦布勇闯新大陆的粗糙航海图到今天人们出门精确到米的手机地图,几千年来地图伴随着人类文明进步发生了天翻地覆的变化。

    c10e5b8011707e4ab19d585ce7d98289.png▲ 航海图

    二十年前出门在外,纸质地图还是必备的物品,旅游景点里随处可见旅游图、路线图,游客们在地图上摸索前进路线。跑运输的卡车司机、户外探险徒步、地质勘探人员,这些人都会用到纸质地图,在一张张地图指引下走南闯北、勘探探险。

    到如今,随着当今时代快速进步,道路交通网络隔几个月就会更新一次,手机地图导航早已取代纸质地图,成为人们出门首选。应用商城里手机地图导航软件很多,基本定位、导航、公交查询功能大同小异,但在细节体验方面差距不小,哪款地图软件路线靠谱,哪款地图能够功能最齐全,渐渐成为茶余饭后闲聊的话题。

    c19cc47083d05fe333ee635ba133351d.png▲ 手机地图导航取代纸质地图

    口头上争个高低没有意义,亲自试试才是硬道理。从知名度、使用人数等角度考量,高德地图、百度地图、腾讯地图以及苹果地图使用率较高,所以今天小黑就来实际测评一下这四款主流手机地图APP ,从 多个角度综合对比分析。

    UI界面对比

    苹果自带地图UI设计简简单单,页面主体显示用户所在区域地图,正下方为搜索栏,输入信息可以查找地名或地址,右下角显示所在区域气温,除此之外别无他物。点击搜索栏,还可以选择搜索附近“加油站、美食、购物、咖啡厅”等......

    1b136cfc10e51f4d374a046efe5154a4.png▲ 苹果地图UI界面

    高德地图主体界面与苹果地图类似,都是以用户所在区域周围的地图,道路、小区、学校、交通枢纽标记一清二楚。搜索栏也在正下方,不过高德地图功能丰富许多,可以选择驾车、公交地铁、实时公交、打车等多种形式;附近一栏中亦可搜索美食、酒店等上百项品类,其中美食就分为快餐、火锅、茶餐厅等十几项。主界面右上角,点击“层叠”状按钮,还能调整公交地图与卫星地图以及充电站地图、地震地图等额外附加功能。

    b40c86b9ce3449182168e0613e7b61bf.png▲ 高德地图UI界面

    再看百度地图,它的UI设计完全不同,搜索栏在正上方,正下方是路线、出行助手与发现周边。主要功能上跟高德地图大同小异,只不过细节多有不同。比如地图类型多了3D俯视图与全景地图,生活便民地图上多了内部全景地图,点开地图上部分酒店、餐厅,可以直接欣赏内部全景。

    a9389aec71bed99b7bba849760fc215e.png▲ 百度地图UI界面

    腾讯地图的UI设计更像百度地图,无论是正上方的搜索栏与右侧边图层、路况、事实公交,几乎与百度地图如出一辙。在特色地图中,街景、3D俯瞰图与卫星图都有配备,额外还多了景区地图与积水地图。或许最近南方暴雨,多处发生洪涝灾害,腾讯临时新增积水地图,以便车辆行人及时避开。

    bff5e86e5802c3e12838d2c33950f7d5.png▲ 腾讯地图UI界面

    单比UI界面设计,百度地图功能最全,便民化措施较多,苹果地图功能最简单,除了2D平面地图之外,几乎没什么特别之处。日常使用起来,小黑觉得苹果地图适合极简主义者,稍稍有些额外需求的用户,都会选择百度、高德或者腾讯地图。此外,如果出门之前就想做足攻略,了解各地道路信息,百度地图与腾讯的街景地图特别适用。稍稍令小黑感到意外的是,号称国内用户量最多的高德地图并没有街景地图,这一点颇为遗憾。

    路况导航及信号能力测试

    小黑身边,地图导航用的最频繁的莫过于有车一族。对于驾驶员来说,导航功能或多或少都会用到。驾驶员开车在路上,最关心的就是路况导航与导航信号稳定性。于是小黑来到上海西站地铁站,在手机信号弱的地下,测试信号能力与路况导航。

    首先测试的依旧是苹果地图。本以为功能简单的苹果地图,导航反应时间肯定不慢。谁知道,当小黑输入“人民广场”之后,页面卡住不动,正在载入的提示整整转动了五分多钟,才显示出路况信息。给出的路线有三条,拥挤路段以红色线条表示,最快路线需要37分钟。驾驶偏好只有避开高速公路与收费站两个选项,整体上来看,苹果地图还是与之前一样,过于简单。

    cc7d6a68ac8a7a046074f107bf3358f3.png▲ 苹果地图显示路况

    比起苹果地图,高德地图简直反应神速,虽然右上方一直显示信号弱,但依旧可以秒开页面,立马显示出导航路线。路况显示清晰,路线精确,导航设置里还可以选择躲避拥挤、大路优先、速度最快等设置。小黑选择躲避拥挤后,成功找到交通路—南北高架路的路线,一路过去只要29分钟。

    此外,高德地图还有一个独特的优势——导航语音包。在导航设置里可以选择林志玲、李佳琦、郭德纲等人的特色语音包。小黑作为高德地图用户,经常在各种语音包中切换,时而在志玲姐姐悦耳动听的指令下行驶,时而在郭老师诙谐幽默的语气下行驶。伴随着风格各异的导航语音包,枯燥的驾驶时间也变得有趣起来。

    badec4528710d3acc7865c4f726e24af.png▲ 高德地图实时导航

    百度地图路况导航路线偏好可选项比高德地图少一点,不过多一个智能推荐,能够记住车主的驾驶习惯,比如走小路避堵,绕路必读等等。小黑身边的朋友Y君喜欢用百度地图,据他所言百度地图用起来比较方便,比如他每天开车上班,走同样的路线,偶尔会抄小路,每当前方有拥堵的时候,百度地图会自行切换路线。

    b3ae9cf97051e2457996f89e7e8ca0ac.png

    最后看一下腾讯地图,路况信息、路线显示、剩余里程等方面腾讯地图应有尽有,导航路线接近高德地图。打开速度、实时路况显示与高德、百度两大地图区别不大,导航语音上也有安琪拉、貂蝉等游戏人物可选,与前面三个地图都不一样,腾讯地图可以切换小地图与光柱地图,导航语音可以切换。

    总体来看,苹果地图差距明显,其他三大地图各有特色,其中高德地图定位与路线推荐稍好一些,在同等条件下高德地图推荐的路线更加快捷迅速。百度地图主打智能推荐,随着用户使用时间的增长,使用起来会越发得心应手。

    公交地铁路线规划

    除了有车一族,更多上班族还是靠双脚与公共交通工具出行,因此地图的测试自然少不了地铁公交。小黑与同事A君一起从上海西站出发,前往人民广场,四大地图APP给出的路线各有不同。苹果地图优先推荐公交方案,时间与地铁差不多,步行路程还短。只是小黑点开后才发现,苹果地图定位位置并不准,路线出发位置已经偏离上海西站。在地铁方案上居然显示需要花12分钟走到地铁站,而此时小黑明明坐在站内。

    78a574939e2fe8b473dc72ec40a94727.png▲ 苹果地图与百度地图方案

    百度地图与苹果地图类似,优先推荐公交方案,其次是11号线转10号线再转8号线。在小黑印象中,这套方案有点绕路,对比高德地图优先推荐的11号线转2号线方案,站数多不说还要多换乘一次。最后一个腾讯地图与高德地图一样,也是优先推荐11号线转2号线方案,虽然不行多了300米,但是整体花费时间与换乘次数都少一点。

    eaabc02cb28d3d8da2197426030691f0.png▲ 高德地图与腾讯地图搜索结果

    在路线推荐中,四大APP均有显示所经站数与时间,其中高德地图还显示出地铁拥挤程度。比如11号线显示较舒适,2号线显示人数非常拥挤。在小黑实际乘车体验中,发现事实果真如此。在江苏路换乘后,明显发现2号线车厢人数多于11号线。

    1593c3d03d4b729ef6a174cf0703eb93.png▲ 高德地图显示出地铁拥挤程度

    当然,这里小黑还想吐槽一下,小黑乘坐地铁时常常戴着耳机,听不到列车员报站声。打开地图查看位置,总是会有延迟。此次小黑对地铁实时位置也做了对比测试,结果大失所望。四大APP中没有一个及时更新位置,当小黑坐着地铁达到隆德路时,地图中的位置还显示为上海西站。

    好在小黑注意到有下车提醒功能,于是在返程路上,小黑依次打开高德地图、百度地图与腾讯地图下车导航功能。至于苹果地图,毫无疑问又是没有这功能。在实际测试中,高德地图率先提醒,其后腾讯地图、百度地图依次提醒,总算在到站之前叫醒了沉迷于音乐中的小黑。

    地图数据库测试

    小黑人在上海,无法测试全国各地路况。而一款手机地图软件好不好用,地图数据库与资料完全度至关重要。所以小黑决定通过搜索充电桩与偏僻的位置来进行数据质量测试。苹果地图出现意外,显示的充电站并不是小黑所在地附近的,直接跑到黄浦江边去了。腾讯地图发挥正常,周边的充电桩都有显示,而且直接在地图上显示充电桩基本信息。

    3ed5146a069747b47176077184eb05b8.png▲ 苹果地图与腾讯地图充电桩搜索结果

    百度地图不愧为便民专用,专业的充电桩地图。不仅充电桩数量多了几倍,还根据国家电网、星星充电、特来电等品牌分成不同类别,充电桩电量是否充足、智能找桩、扫码充电等附加功能。最后高德地图表现也相当不错,虽然数量比不上百度,但是快充慢充,充电桩总数量与可充数量标记清楚,非常适合新能源车主。

    2c5a9d3bb820c6aa43449cbda8d06a4f.png▲ 百度地图与高德地图充电桩搜索结果

    充电桩只能体现地图软件在城市里的数据量,于是小黑决定搜一下远在边界的黑瞎子岛。结果显示高德地图信息最全,除了黑瞎子岛镇位置,还有基本道路图。采用高德地图资源的苹果地图以与百度地图表现稍差,可以显示出基本信息,而腾讯地图发挥最差,除了孤零零的黑瞎子岛国家森林公园,连条路都没有。

    7a021ab8018e2d48c78881be5b82240c.png▲ 高德地图与采用高德地图资源的苹果地图

    c6a31c367c1422c9e64de9f185e130a9.png▲ 腾讯地图与百度地图

    俗话说“实践出真知”,从以上对比可以发现,高德地图还是精度最高、数据最全的地图APP;百度地图在街景地图、实景地图、充电桩地图等便民功能上优势不小;腾讯地图平平无奇,该有的功能基本都有,突出的地方并不亮眼;而苹果地图差距明显,可以看出苹果在地图APP上并未花心思,仅仅拿到高德地图的数据后,稍稍改动,功能上只能说够用,拓展附加功能几乎为零。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 需求:根据经纬度绘制标记点,点击标记点弹出弹框和底部按钮,点击顶部弹框进入二级界面,点击底部按钮弹出第三方地图软件选择页,实现跨进程跳转。 项目是公司项目,只放出重要部分代码。 绘制标记点: final ...

    需求:根据经纬度绘制标记点,点击标记点弹出弹框和底部按钮,点击顶部弹框进入二级界面,点击底部按钮弹出第三方地图软件选择页,实现跨进程跳转。

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

    项目是公司项目,只放出重要部分代码。

    
    					final Marker marker1 = aMap.addMarker(new MarkerOptions()
                        .position(latLng2)
                        .title("地址标题111111")
                        .snippet("地址内容1111"));
                final Marker marker2 = aMap.addMarker(new MarkerOptions()
                        .position(latLng3)
                        .title("地址标题22222")
                        .snippet("地址内容2222"));
    

    绘制标记点

     //标记点击事件
                AMap.OnMarkerClickListener markerClickListener = new AMap.OnMarkerClickListener() {
                    @Override
                    public boolean onMarkerClick(Marker marker) {
                        position = marker.getPosition();
                        title = marker.getTitle();
                        marker.showInfoWindow();
                        nav.setVisibility(View.VISIBLE);
                        //导航按钮点击
                        nav.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                showAnimation();
                            }
                        });
                        return true;
                    }
                };
    

    点击标记后获取到当前标记的经纬度和名称,显示底部按钮,点击按钮弹出第三方地图选择页。

    //标记上部弹框点击
                AMap.OnInfoWindowClickListener listener = new AMap.OnInfoWindowClickListener() {
                    @Override
                    public void onInfoWindowClick(Marker arg0) {
                            Toast.makeText(FangchanMapActivity.this, "点击了弹框1", Toast.LENGTH_SHORT).show();
                    }
                };
    

    点击标记顶部弹框进入二级界面,需要什么值就取什么值,后台还在出接口,我这边没有做操作

    //地图点击
                AMap.OnMapClickListener mapClickListener = new AMap.OnMapClickListener() {
                    @Override
                    public void onMapClick(LatLng latLng) {
                        marker1.hideInfoWindow();
                        marker2.hideInfoWindow();
                        nav.setVisibility(View.GONE);
                    }
                };
    

    这里只做了显示隐藏的操作

    			//设置图标
    			marker1.setIcon(BitmapDescriptorFactory.fromResource(R.mipmap.marker_icon));
    			//绑定点击事件
                aMap.setOnInfoWindowClickListener(listener);
                aMap.setOnMapClickListener(mapClickListener);
                aMap.setOnMarkerClickListener(markerClickListener);
    

    千万千万千万记得绑定点击事件在这里插入图片描述

    private void showAnimation() {
            LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View vPopupWindow = inflater.inflate(R.layout.layout_popupwindow, null, false);//引入弹窗布局
            popupWindow = new PopupWindow(vPopupWindow, ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, true);
            TextView gaode = vPopupWindow.findViewById(R.id.gaode);
            TextView baidu = vPopupWindow.findViewById(R.id.baidu);
            TextView tengxun = vPopupWindow.findViewById(R.id.tengxun);
            TextView clean_text = vPopupWindow.findViewById(R.id.clean_text);
            gaode.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (MapUtil.isGdMapInstalled()) {
                        MapUtil.openGaoDeNavi(FangchanMapActivity.this, 0, 0, null, position.latitude, position.longitude, title);
                    } else {
                        //这里必须要写逻辑,不然如果手机没安装该应用,程序会闪退,这里可以实现下载安装该地图应用
                        Toast.makeText(FangchanMapActivity.this, "尚未安装高德地图", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            baidu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (MapUtil.isBaiduMapInstalled()){
                        MapUtil.openBaiDuNavi(FangchanMapActivity.this, 0, 0, null, position.latitude, position.longitude, title);
                    } else {
                        Toast.makeText(FangchanMapActivity.this, "尚未安装百度地图", Toast.LENGTH_SHORT).show();
                    }
    
                }
            });
            tengxun.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (MapUtil.isTencentMapInstalled()){
                        MapUtil.openTencentMap(FangchanMapActivity.this, 0, 0, null, position.latitude, position.longitude, title);
                    } else {
                        Toast.makeText(FangchanMapActivity.this, "尚未安装腾讯地图", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            clean_text.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    popupWindow.dismiss();
                }
            });
            //设置背景透明
            addBackground();
            //设置进出动画
            popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);
            //引入依附的布局
            View parentView = LayoutInflater.from(FangchanMapActivity.this).inflate(R.layout.layout_popupwindow, null);
            //相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
            popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
        }
        private void addBackground() {
            // 设置背景颜色变暗
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.alpha = 0.7f;//调节透明度
            getWindow().setAttributes(lp);
            //dismiss时恢复原样
            popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
    
                @Override
                public void onDismiss() {
                    WindowManager.LayoutParams lp = getWindow().getAttributes();
                    lp.alpha = 1f;
                    getWindow().setAttributes(lp);
                }
            });
        }
    

    底部弹框,popupwindow实现

    
    public class MapUtil {
    
        public static final String PN_GAODE_MAP = "com.autonavi.minimap";// 高德地图包名
        public static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地图包名
        public static final String PN_TENCENT_MAP = "com.tencent.map"; // 腾讯地图包名
    
        /**
         * 检查地图应用是否安装
         * @return
         */
        public static boolean isGdMapInstalled(){
            return isInstallPackage(PN_GAODE_MAP);
        }
    
        public static boolean isBaiduMapInstalled(){
            return isInstallPackage(PN_BAIDU_MAP);
        }
    
        public static boolean isTencentMapInstalled(){
            return isInstallPackage(PN_TENCENT_MAP);
        }
    
        private static boolean isInstallPackage(String packageName) {
            return new File("/data/data/" + packageName).exists();
        }
    
        /**
         * 百度转高德
         * @param bd_lat
         * @param bd_lon
         * @return
         */
        public static double[] bdToGaoDe(double bd_lat, double bd_lon) {
            double[] gd_lat_lon = new double[2];
            double PI = 3.14159265358979324 * 3000.0 / 180.0;
            double x = bd_lon - 0.0065, y = bd_lat - 0.006;
            double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI);
            double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI);
            gd_lat_lon[0] = z * Math.cos(theta);
            gd_lat_lon[1] = z * Math.sin(theta);
            return gd_lat_lon;
        }
    
        /**
         * 高德、腾讯转百度
         * @param gd_lon
         * @param gd_lat
         * @return
         */
        private static double[] gaoDeToBaidu(double gd_lon, double gd_lat) {
            double[] bd_lat_lon = new double[2];
            double PI = 3.14159265358979324 * 3000.0 / 180.0;
            double x = gd_lon, y = gd_lat;
            double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * PI);
            double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * PI);
            bd_lat_lon[0] = z * Math.cos(theta) + 0.0065;
            bd_lat_lon[1] = z * Math.sin(theta) + 0.006;
            return bd_lat_lon;
        }
    
    
    
        /**
         * 打开高德地图导航功能
         * @param context
         * @param slat 起点纬度
         * @param slon 起点经度
         * @param sname 起点名称 可不填(0,0,null)
         * @param dlat 终点纬度
         * @param dlon 终点经度
         * @param dname 终点名称 必填
         */
        public static void openGaoDeNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
            String uriString = null;
            StringBuilder builder = new StringBuilder("amapuri://route/plan?sourceApplication=maxuslife");
            if (slat != 0) {
                builder.append("&sname=").append(sname)
                        .append("&slat=").append(slat)
                        .append("&slon=").append(slon);
            }
            builder.append("&dlat=").append(dlat)
                    .append("&dlon=").append(dlon)
                    .append("&dname=").append(dname)
                    .append("&dev=0")
                    .append("&t=0");
            uriString = builder.toString();
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setPackage(PN_GAODE_MAP);
            intent.setData(Uri.parse(uriString));
            context.startActivity(intent);
        }
    
        /**
         * 打开腾讯地图
         * params 参考http://lbs.qq.com/uri_v1/guide-route.html
         *
         * @param context
         * @param slat 起点纬度
         * @param slon 起点经度
         * @param sname 起点名称 可不填(0,0,null)
         * @param dlat 终点纬度
         * @param dlon 终点经度
         * @param dname 终点名称 必填
         * 驾车:type=drive,policy有以下取值
        0:较快捷
        1:无高速
        2:距离
        policy的取值缺省为0
         * &from=" + dqAddress + "&fromcoord=" + dqLatitude + "," + dqLongitude + "
         */
        public static void openTencentMap(Context context, double slat, double slon, String sname, double dlat, double dlon, String dname) {
            String uriString = null;
            StringBuilder builder = new StringBuilder("qqmap://map/routeplan?type=drive&policy=0&referer=zhongshuo");
            if (slat != 0) {
                builder.append("&from=").append(sname)
                        .append("&fromcoord=").append(slat)
                        .append(",")
                        .append(slon);
            }
            builder.append("&to=").append(dname)
                    .append("&tocoord=").append(dlat)
                    .append(",")
                    .append(dlon);
            uriString = builder.toString();
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setPackage(PN_TENCENT_MAP);
            intent.setData(Uri.parse(uriString));
            context.startActivity(intent);
        }
    
        /**
         * 打开百度地图导航功能(默认坐标点是高德地图,需要转换)
         * @param context
         * @param slat 起点纬度
         * @param slon 起点经度
         * @param sname 起点名称 可不填(0,0,null)
         * @param dlat 终点纬度
         * @param dlon 终点经度
         * @param dname 终点名称 必填
         */
        public static void openBaiDuNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
            String uriString = null;
            //终点坐标转换
    //        此方法需要百度地图的BaiduLBS_Android.jar包
    //        LatLng destination = new LatLng(dlat,dlon);
    //        LatLng destinationLatLng = GCJ02ToBD09(destination);
    //        dlat = destinationLatLng.latitude;
    //        dlon = destinationLatLng.longitude;
    
            double destination[] = gaoDeToBaidu(dlat, dlon);
            dlat = destination[0];
            dlon = destination[1];
    
            StringBuilder builder = new StringBuilder("baidumap://map/direction?mode=driving&");
            if (slat != 0){
                //起点坐标转换
    
    //            LatLng origin = new LatLng(slat,slon);
    //            LatLng originLatLng = GCJ02ToBD09(origin);
    //            slat = originLatLng.latitude;
    //            slon = originLatLng.longitude;
    
                double[] origin = gaoDeToBaidu(slat, slon);
                slat = origin[0];
                slon = origin[1];
    
                builder.append("origin=latlng:")
                        .append(slat)
                        .append(",")
                        .append(slon)
                        .append("|name:")
                        .append(sname);
            }
            builder.append("&destination=latlng:")
                    .append(dlat)
                    .append(",")
                    .append(dlon)
                    .append("|name:")
                    .append(dname);
            uriString = builder.toString();
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setPackage(PN_BAIDU_MAP);
            intent.setData(Uri.parse(uriString));
            context.startActivity(intent);
        }
    }
    

    跳转第三方地图软件的工具类,参考这位老哥写的MapUtil

    结束!芜湖~

    展开全文
  • 智慧医院软件(APP和微信企业公众号)功能列表.doc
  • BmapBmap,简单的双地图应用。可任意切换/高德地图数据源,致力满足日常生活的出行需求。具有步行、公交、骑行、驾驶等出行方案,查看街景。新版特性1.升级百度地图sdk6.0.02.升级高德地图sdk6.9.43.升级讯飞语音sdk...
  • 昊哥走天下 这是一款基于位置信息服务(LBS)的Web社交应用, 集...修复定位标记叠加bug 修复定位到当前时放缩级别跳跃bug 服务器部署 # 安装libcap依赖以允许普通用户使用1024以下的端口 (Ubuntu) sudo apt-get install l
  • 一、使用小程序内置方法拉起微信内置地图
  • ) 如何获取看下图: 我由于已经申请成功,跳转界面如下所示: 具体申请这个AK的方法在下面这个链接: Android 百度地图SDK 自动定位、标记定位_初学者-Study的博客-CSDN博客_地图定位标记 遇到的问题4: 1....
  • BmapBmap,简单的双地图应用。可任意切换/高德地图数据源,致力满足日常生活的出行需求。具有步行、公交、骑行、驾驶等出行方案,查看街景。新版特性1.升级百度地图sdk6.0.02.升级高德地图sdk6.9.43.升级讯飞语音sdk...
  • 我们今天以高德地图的数据为例来简单的了解一下,在APP中如何调用和使用API。了解它内部的原理和注意事项。首先我们应该找到一个API的开放网站,以高德地图为例,我们找到高德地图的官网。 注册成为开发者。成为...
  • longitude="{{lon}}" show-location="{{true}}" markers="{{markers}}" bindmarkertap="bindmarkertap" > //index.js //获取应用实例 const app = getApp() Page({ data: { lat:'', //维度 lon:'', //经度 markers:...
  • Android移动开发教学app案例之校园地图
  • 一.... 1.获取 SHA1 在获取Android签名证书的sha1值获取使用keytool时,出现了'keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件... 进入百度地图开放平台,控制台创建应用 在我的应用中,查看自己的...
  • 一、开始点线面标注 左下角【标绘】,点...可 同步到电脑、编辑、删除等等 这个图标控制显示 或者 不显示在地图上 如下图: 同时:在软件屏幕上 【长按】 地图界面上的标绘点、线、面,也会出现上图中的功能界面 
  • 最近闲的没事干,发现滴滴出行的app地图上的小汽车可以跑,很炫是不是,我们公司也是做车辆监控的app的,我就一直揣摩着怎么也让我们的小汽车在地图上跑来跑去啊,这样给人感觉好点,废话不说了,先看下滴滴出行的...
  • 估计每个爱好编程的都想某天可以开发出一个专属于自己的软件or应用,在下也是。然而由于当初入门编程的时候偷懒特地避开了那些以开发为目的源代码级的语言(比如说java,C和C++)而选择了R,我离这个目标估计是越走...
  • 智慧医院软件(APP)功能列表 1、院外版(APP)功能 序号 功能 模块 功能描述 1 预约 号源查询 提供医生号源的查询,按日期+时段查询医生号源,并提供分时号源查询。 科室医生搜索 可通过搜索科室或医生,快速查找医生...
  • Hbuilder开发app引入地图

    千次阅读 2019-04-25 21:28:08
    由于开发需要使用到地图进行定位,所以在网上找了许多的资料,一开始,...里面关于Hbuilder开发App的各种详细介绍,例如:调用手机摄像头、获取手机的通讯录等等。 里面其中的一个是关于Maps的,如何引入手机的内置...
  • 1.桥接模式:电子商务网站常有这样的功能:发送消息通知,比如订货发货通知等,从业务上看,消息分为普通消息、加急消息和特急消息多种不同的消息类型,其业务处理是不一样的,比如加急消息是在消息上添加加急标记.....
  • 由于项目中用到的是高德地图,所以这里用到的是调起高德地图APP来实现该功能。首先肯定要去高德开放平台去申请KEY,拿到这个KEY后通过调用js代码就可以实现该功能。之前在H5页面中无论是做导航还是定位一般我都是...
  • // 打开地图App,开始导航 function openMapApp(lat, lng, addr) { // 地图uri api数组 var uri = new Array(); if (ua.android) { // 百度地图uri api uri[0] = "bdapp://map/navi?location=" + lat + "," +...
  • //添加标记点 covers: [ { latitude: 39.9085, longitude: 116.39747, // #ifdef APP-PLUS iconPath: '', // #endif // #ifndef APP-PLUS iconPath: '', ...
  • 该项目是一个简单的演示,使用OpenLayers JavaScript库加载地图,将地图居中并在地图上添加一个点,以标记城市公园的位置。 由于使用了OpenLayers,因此可以将数据导出为任何标准GIS格式:KML,GeoJSON等。在此...
  • import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import ...
  • 具有以下特点出租车标记显示在地图上的不同位置(基于静态位置) 屏幕不同部分的动画不同在地图上显示折线(来自Google Maps API的硬编码数据) 在Android和IOS上均可运行。 它有助于管理状态并从项目的中心位置...
  • 5 款傻瓜式手机 APP 开发工具.pdf5 款傻瓜式手机 APP 开发工具.pdf5 款傻瓜式手机 APP 开发工具.pdf5 款傻瓜式手机 APP 开发工具.pdf5 款傻瓜式手机 APP 开发工具.pdf5 款傻瓜式手机 APP 开发工具.pdf5 款傻瓜式手机...
  • 5 款傻瓜式手机 APP 开发工具.docx5 款傻瓜式手机 APP 开发工具.docx5 款傻瓜式手机 APP 开发工具.docx5 款傻瓜式手机 APP 开发工具.docx5 款傻瓜式手机 APP 开发工具.docx5 款傻瓜式手机 APP 开发工具.docx5 款傻瓜...
  • 1令人脑洞大开的APP(一)这年头,手机APP可谓一个比一个奇葩,正所谓只有你不敢想的,没有它不敢做的。...那些让人脑洞大开的APP1.Spring相机——一秒拉出大长腿软件名称:Spring相机(增高弹簧)软件版本:2....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,334
精华内容 2,133
关键字:

地图标记软件app