前言:騰訊位置服務爲各類應用廠商和開發者提供領先的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