前言:腾讯位置服务为各类应用厂商和开发者提供领先的LBS服务和解决方案;有针对Web应用的JavaScript API, 适合手机端Native APP的各种SDK, WebService接口,适合小程序的插件和各类地图API等。
目录
定位SDK (Android定位 SDK | IOS定位 SDK)
地图SDK(Android地图SDK | IOS地图SDK)
接入指南
接入步骤:(快速通道:腾讯位置官网)
作为开发者应该如何选择对应的API?
地图组件(H5)
手机组件H5,完整应用,不需要开发者进行开发,——》参考文档
位置展示组件,可以在地图上展示一个或多个位置点。数据来源支持三种方式:通过URL传递数据、地图检索数据和自有定制数据。 可以展示每个位置点的名称、地址等详细信息,也可查看该位置点的街景信息或发起到该位置的路线规划。
例如:
调用地址:
https://apis.map.qq.com/tools/poimarker?type=0&marker=coord:39.96554,116.26719;title:成都;addr:北京市海淀区复兴路32号院|coord:39.87803,116.19025;title:成都园;addr:北京市丰台区射击场路15号北京园博园|coord:39.88129,116.27062;title:老成都;addr:北京市丰台区岳各庄梅市口路西府景园六号楼底商|coord:39.9982,116.19015;title:北京园博园成都园;addr:北京市丰台区园博园内&key=yourkey&referer=myapp
地图javaScript API
用于浏览器端地图显示与应用,兼容手机端及PC端——》参考文档
JavaScript API V2可用于在网站中加入交互性强的街景、地图,能很好地支持PC及手机设备,身材小巧,动画效果顺滑流畅,动感十足,提供地图操作、标注、地点搜索、出行规划、地址解析、街景等接口,功能丰富,并免费开放各种附加工具库。JavaScript API V2是免费服务,任何提供免费访问的网站都可以调用。
可视化组件是JSAPI的附加库,在加载JavaScript API服务请求中通过libraries参数指明引入
<script charset=“utf-8” src=“https://map.qq.com/api/js?v=2.exp&key=YOUR_KEY&libraries=visualization”>
接口均定义在qq.maps.visualization全局变量中,需在地图初始化完成之后使用
var map = new qq.maps.Map(container, mapOpts);
var dots = new qq.maps.visualization.Dots({
map: map
});
dots.setData(data);
例如:我们要显示以北京的天安门为中心的 603x300 地图:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>孙叫兽测试天安门地图</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<style type="text/css">
html,body{
width:100%;
height:100%;
}
*{
margin:0px;
padding:0px;
}
body, button, input, select, textarea {
font: 12px/16px Verdana, Helvetica, Arial, sans-serif;
}
p{
width:603px;
padding-top:3px;
overflow:hidden;
}
.btn{
width:142px;
}
#container{
width:100%;
height:100%;
}
</style>
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"></script>
<script>
window.onload = function(){
//直接加载地图
//初始化地图函数 自定义函数名init
function init() {
//定义map变量 调用 qq.maps.Map() 构造函数 获取地图显示容器
var map = new qq.maps.Map(document.getElementById("container"), {
center: new qq.maps.LatLng(39.916527,116.397128), // 地图的中心地理座标。
zoom:8 // 地图的中心地理座标。
});
}
//调用初始化函数地图
init();
}
</script>
</head>
<body>
<!-- 定义地图显示容器 -->
<div id="container"></div>
</body>
</html>
效果:
加载地图API:
方式一:页面直接引入。
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"></script>
方式二:异步加载 JavaScript API
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>异步加载地图</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<style type="text/css">
html,body{
width:100%;
height:100%;
}
*{
margin:0px;
padding:0px;
}
body, button, input, select, textarea {
font: 12px/16px Verdana, Helvetica, Arial, sans-serif;
}
p{
width:603px;
padding-top:3px;
overflow:hidden;
}
#container{
width:100%;
height:100%;
}
.btn{
width:142px;
}
</style>
<script>
function init() {
//设置地图中心点
var myLatlng = new qq.maps.LatLng(39.916527,116.397128);
//定义工厂模式函数
var myOptions = {
zoom: 8, //设置地图缩放级别
center: myLatlng, //设置中心点样式
mapTypeId: qq.maps.MapTypeId.ROADMAP //设置地图样式详情参见MapType
}
//获取dom元素添加地图信息
var map = new qq.maps.Map(document.getElementById("container"), myOptions);
}
//异步加载地图库函数文件
function loadScript() {
//创建script标签
var script = document.createElement("script");
//设置标签的type属性
script.type = "text/javascript";
//设置标签的链接地址
script.src = "https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&callback=init";
//添加标签到dom
document.body.appendChild(script);
}
window.onload = loadScript; // dom文档加载结束开始加载 此段代码
</script>
</head>
<body>
<div id="container"></div>
</body>
</html>
效果:
有如下功能:
叠加覆盖物 | 强大的附加库 | 定义自己的地图 |
提供点标注、折线、圆、多边形、信息窗 口等覆盖物,用户可以定义个性化地图。 |
提供了鼠标绘制工具箱、几何运算、座标 转换、文本输入提示等附加库。 |
支持用户可以自定义地图类型,使用自己 的数据或图片,自定义切图、取图规则。 |
定位SDK (Android定位 SDK | IOS定位 SDK)
腾讯地图定位SDK是一套基于Android 4.1及以上版本设备的应用程序接口。通过该接口,您可以轻松使用腾讯地图定位服务,构建LBS应用程序。
定位SDK包括GPS定位与网络定位,实现了经纬度座标偏转与当前位置的POI名称、地址或者行政区划的查询。采用了移动缓存策略,节省流量与电量。
定位SDK是提供给具有一定Android编程经验和了解面向对象概念的开发者使用。
本android示例采用后台定位方式:
当用户进程出于后台时,有时也会有需求使用定位服务,但应用处于后台时Android系统会对定位做诸多限制。因此我们通过设置前台Service的方式来提高进程级别,使定位服务由后台转向前台。
1.manifest增加Service声明
<service android:name="com.tencent.map.geolocation.s" />
2.在启动定位之前,调用enableForegroundLocation
mLocationManager.enableForegroundLocation(LOC_NOTIFICATIONID, buildNotification());
mLocationManager.requestLocationUpdates(request, this, getMainLooper());
构建Notification(其中enableForegroundLocation的参数分别是一个整形的NotificationID,一个是Notification的实例。)
private Notification buildNotification() {
Notification.Builder builder = null;
Notification notification = null;
if (android.os.Build.VERSION.SDK_INT >= 26) {
//Android O上对Notification进行了修改,如果设置的targetSDKVersion>=26建议使用此种方式创建通知栏
if (notificationManager == null) {
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
String channelId = getPackageName();
if (!isCreateChannel) {NotificationChannel notificationChannel = new NotificationChannel(channelId,
NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
notificationChannel.enableLights(true);//是否在桌面icon右上角展示小圆点
notificationChannel.setLightColor(Color.BLUE); //小圆点颜色
notificationChannel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
notificationManager.createNotificationChannel(notificationChannel);
isCreateChannel = true;
}
builder = new Notification.Builder(getApplicationContext(), channelId);
} else {
builder = new Notification.Builder(getApplicationContext());
}
builder.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("LocationDemo")
.setContentText("正在后台运行")
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
.setWhen(System.currentTimeMillis());
if (android.os.Build.VERSION.SDK_INT >= 16) {
notification = builder.build();
} else {
notification = builder.getNotification();
}
return notification;
}
3.在停止定位之后,调用disableForegroundLocation停止前台服务
LocationManager.removeUpdates(this);
mLocationManager.disableForegroundLocation(true);
权限配置(请在manifest文件下配置如下权限:)
<!-- 通过GPS得到精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 通过网络得到粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 访问网络. 某些位置信息需要从网络服务器获取 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问WiFi状态. 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 修改WiFi状态. 发起WiFi扫描, 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 访问网络状态, 检测网络的可用性. 需要网络运营商相关信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 访问手机当前状态, 需要device id用于网络定位 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 支持A-GPS辅助定位 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于 log 日志 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
说明:随着Android版本的升级,权限使用方面也有变动,具体可参考实用文档中针对Android各个版本的适配文档。
定位服务是一个重度依赖用户授权的功能,因此在App设计时必须充分考虑获取用户权限的方式,合理引导用户授予权限。
腾讯 iOS 定位 SDK 提供了不依赖于地图定位的定位功能,开发者可以无地图显示的场景中便捷地为应用程序添加定位功能。 iOS定位SDK提供了单次定位、连续定位、逆地理信息等功能。兼容iOS7.0 及以上版本。
定位权限申请
(1) 需要在https://lbs.qq.com/dev/console/key/add上面申请一个apiKey,对应在TencentLBSLocationManager的apiKey属性上设置才可以使用。
(2) 需要在info.plist中追加 NSLocationWhenInUseUsageDescription 或NSLocationAlwaysUsageDescription 字段,以申请定位权限。
(3) allowsBackgroundLocationUpdates表示是否允许后台定位。默认为 NO。只在iOS 9.0 及以后起作用。设置为 YES 的时候必须保证 Background Modes 中的 Location updates 处于选中状态,否则会抛出异常。注意,如果不设置为YES,不需要申请该权限,否则会审核不通过!
引入定位包: 将库文件 TencentLBS.framework 拷贝到您的APP的工程目录下,在Xcode的Target中选择 “Build Phases”->“Link Binary With Libraries”->“Add”->“Add Other…”-> 选择 TencentLBS.framework 目录并添加。
引入系统库文件:仿照上面的操作 ("Add"的时候直接在列表中查找选择 )添加系统库libz.1.2.5.tbd 在 Build Setting - Linking - Other Linker Flags 里 添加 -lstdc++.6.0.9, -lsqlite3(注意:在 Xcode9 以上,不再需要这两个库) 。
- (void)configLocationManager
{
self.locationManager = [[TencentLBSLocationManager alloc] init];
[self.locationManager setDelegate:self];
[self.locationManager setApiKey:@"对应于申请的apiKey "];
[self.locationManager setPausesLocationUpdatesAutomatically:NO];
// 需要后台定位的话,可以设置此属性为YES。
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
// 如果需要POI信息的话,根据所需要的级别来设定,定位结果将会根据设定的POI级别来返回,如:
[self.locationManager setRequestLevel:TencentLBSRequestLevelName];
// 申请的定位权限,得和在info.list申请的权限对应才有效
CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusNotDetermined) {
[self.locationManager requestWhenInUseAuthorization];
}
}
// 单次定位
- (void)startSingleLocation {
[self.locationManager requestLocationWithCompletionBlock:
^(TencentLBSLocation *location, NSError *error) {
NSLog(@"%@, %@, %@", location.location, location.name, location.address);
}];
}
// 连续定位
- (void)startSerialLocation {
//开始定位
[self.locationManager startUpdatingLocation];
}
- (void)stopSerialLocation {
//停止定位
[self.locationManager stopUpdatingLocation];
}
- (void)tencentLBSLocationManager:(TencentLBSLocationManager *)manager
didFailWithError:(NSError *)error {
CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusDenied ||
authorizationStatus == kCLAuthorizationStatusRestricted) {
[self.displayLabel setText:@"定位权限没开启!"];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
message:@"定位权限未开启,是否开启?"
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"是"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
if( [[UIApplication sharedApplication]canOpenURL:
[NSURL URLWithString:UIApplicationOpenSettingsURLString]] ) {
[[UIApplication sharedApplication] openURL:
[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"否"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
}]];
[self presentViewController:alert animated:true completion:nil];
} else {
[self.displayLabel setText:[NSString stringWithFormat:@"%@", error]];
}
}
- (void)tencentLBSLocationManager:(TencentLBSLocationManager *)manager
didUpdateLocation:(TencentLBSLocation *)location {
//定位结果
NSLog(@"location:%@", location.location);
}
报错状态提示:
typedef NS_ENUM(NSUInteger, TencentLBSLocationError) {
TencentLBSLocationErrorUnknown = 0, //!< 错误码,表示目前位置未知,但是会一直尝试获取
TencentLBSLocationErrorDenied = 1, //!< 错误码,表示定位权限被禁止
TencentLBSLocationErrorNetwork = 2, //!< 错误码,表示网络错误
TencentLBSLocationErrorHeadingFailure = 3, //!< 错误码,表示朝向无法确认
TencentLBSLocationErrorOther = 4, //!< 错误码,未知错误
};
地图SDK(Android地图SDK | IOS地图SDK)
用于手机端APP嵌入地图与应用。
安卓3D适用于对地图强依赖场景,如导航、打车、代驾等。也可用于可穿戴设备。2D适用于辅助位置展示场景,如选择发送位置、地址展示、轨迹展示等,建议对包大小敏感的开发者选择用。
AndroidStudio配置
第1步: 获取Key
[点我获取Key>>](/mobile/androidMapSDK/developerGuide/getKey)
第2步:创建AndroidStudio项目
在AndroidStudio中创建一个空的Android项目。
第3步:在项目中集成SDK
在 AndroidStudio 项目中集成腾讯地图 SDK 主要有两种方式:
1. 手动将腾讯地图 sdk 的 jar 包和 so 库导入到工程
2. 通过 Gradle 配置 maven 或 jcenter 仓库集成 SDK
我们更推荐用户使用第二种方式,即,通过 maven 导入腾讯地图 SDK,下面我们详细介绍下两种方式。
通过拷贝 jar 包、so 库添加 SDK
-
首先,请您在这里获取腾讯地图 SDK for Andorid 及其 demo。
-
解压下载的压缩包并拷贝文件
以4.3.4版本的地图功能为例,解压后,得到一个 libs文件夹,该文件夹中包含tencent-mapsdk-release-4.3.4.b8edc92f.jar文件和一个jniLibs文件夹(文件中包含所有的so库文件) -
将 libs 目录下的"*.jar"文件拷贝到 AndroidStudio 项目对应的 app/libs/ 文件夹下。
右键该jar包,选择add as library,弹出如下窗口:
点击OK即可,变成下图所示就是导入成功:
- 将 jniLibs 目录下的所有文件按照原目录格式,拷贝到AndroidStudio项目对应的 app/src/main/jniLibs/ 目录下。
腾讯地图Android SDK还提供了地图组件库TencentMapUtils,目前地图组件包含了点聚合组件、小车平滑移动组件。 组件
IOS自动部署如下:
用户使用腾讯地图 iOS SDK 支持项目开发时,可以通过 Cocoapods 自动部署将 SDK 添加到工程当中。自动部署目前仅支持 腾讯地图 iOS SDK 4.2.6.2 及以上版本。
获取CocoaPods
CocoaPods 是一种支持 Swift 和 Objective-C 项目的第三方库资源管理器,用户可通过 Cocoapods 获取腾讯地图 iOS SDK。
如果您已安装了CocoaPods,请直接跳到第二步:通过CocoaPods安装SDK。
1. 配置 ruby 的软件源
建议通过ruby安装CocoaPods。由于默认的 ruby 的软件源 “http://mirrors.tencent.com/rubygems/” 被墙阻拦导致 CocoaPods 安装失败,因此需要更新一下 ruby 的源。依次执行如下命令:
# 添加 TUNA 源并移除默认源
gem sources --add http://mirrors.tencent.com/rubygems/ --remove https://rubygems.org/
#(查看当前ruby的源是否成功更换)
gem sources -l
完成上述命令后,显示如下文字则表示更新成功
*** CURRENT SOURCES ***
http://mirrors.tencent.com/rubygems/
2. 升级 gem
将 gem 的版本更新到最新确保 Cocoapods 安装成功
sudo gem update --system
3. 安装 Cocoapods
请使用以下命令安装 Cocoapods:
sudo gem install -n /usr/local/bin cocoapods pod setup
注:Cocoapods 安装过程可能会耗时较长,也有可能受网络的状况导致失败,如果安装失败请再次尝试
通过 CocoaPods 安装 SDK
1. 创建 Podfile
在当前 工程文件 (.xcodeproj) 所在文件夹下创建一个名为 Podfile 的文件。Podfile 内容如下:
platform :ios, "8.0" # 手机系统版本
target "QMapKitDemo" do # 工程的名字
pod 'Tencent-MapSDK' # 地图SDK
end
#当有多个target时,不同的target也需要各自设置
#target "QMapKitDemo1" do # 工程的名字
# pod 'Tencent-MapSDK' # 地图SDK
#end
#target "QMapKitDemo2" do # 工程的名字
# pod 'Tencent-MapSDK' # 地图SDK
#end
2. 安装SDK
#用于保证本地地图相关 SDK 为最新版
pod repo update
#安装 SDK
pod install
命令执行成功后,会生成 .xcworkspace 文件,打开.xcworkspace 文件以启动工程(注意:此时不能同时开启.xcodeproj文件,示例:
3. 升级 SDK
若已通过自动部署安装了腾讯地图 iOS SDK,想要更新到最新版本,可在 Podfile 文件所在目录下执行以下指令:
pod repo update # 用于保证本地地图相关SDK为最新版
pod update
4. 安装指定版本 SDK
自动部署目前仅支持地图 iOS SDK 4.2.6.2及以上版本,使用指定版本 SDK,需修改 Podfile 文件,示例:
platform :ios, "8.0" # 手机系统版本
target "QMapKitDemo" do # 工程的名字
pod 'Tencent-MapSDK', '~> 4.2.6.2' # 在此修改或添加 3D SDK 版本号
end
然后执行命令:
#用于保证本地地图相关 SDK 为最新版
pod repo update
# 安装 SDK
pod install
WebService API:参考文档
腾讯地图WebService API 是基于HTTPS/HTTP协议的数据接口,开发者可以使用任何客户端、服务器和开发语言,按照腾讯地图WebService API规范,按需构建HTTPS请求,并获取结果数据(目前支持JSON/JSONP方式返回)。
注意:这个有调用 配额限制说明(其他产品均无调用限制):https://lbs.qq.com/service/webService/webServiceGuide/webServiceQuota
腾讯位置服务API Key,在调用时用于唯一标识开发者身份,API KEY是各产品通用的,也就是说同一个Key可以用在地图SDK,也可以用在JavascriptAPI,也可以用在WebServiceAPI以及其它各产品中,可针对不同产品可独立启用(开关)。
假设您的某个Key只会调用地图SDK,可在Key配置界面,将其它产品关闭,以降低安全风险。
在Key设置中,勾中WebService复选框,即为启用产品,该Key才可调用WebServiceAPI服务 未启用时请求服务,会返回:
{ "status": 199, "message": "此key未开启webservice功能" }
示例:
https://apis.map.qq.com/ws/place/v1/search?keyword=酒店&boundary=nearby(39.908491,116.374328,1000)&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
多种安全策略配置请参考:安全策略说明
地主认证通道:
如果你是某个地点的经营者,所有者等,可以自行申请认证,审核通过即可在地图上展示申请地点,入口
各类企事业单位、个体工商户,对自己的经营场所、实体店铺希望腾讯地图进行收录的,均可申请商户标注。提交商户标注后,您所填写的信息会被所有用户看到,因此请确认您提交的位置信息符合国家相关法律(例如军事设施,保密地点等信息根据国家相关法律不能提交)。已有商户标注存在有误的,可以提交地点纠错修改。
常见问题
腾讯位置服务控制台
行业解决方案
腾讯位置服务技术教程
腾讯位置特色产品实例
好啦,本期腾讯位置服务内容就分享到这里,我们下期见!
需要腾讯位置服务可以从下方通道快速进入,填写邀请码获得更多技术支持!
腾讯位置服务注册地址:https://lbs.qq.com?lbs_invite=3Z2RFL3
邀请码:3Z2RFL3