Cordova - 获取真实的地理位置信息(通过自定义插件实现)
作者:hangge | 2016-05-15 10:50
在前文(Cordova - 使用Geolocation插件实现地理定位)中,我们通过 Cordova 的定位插件可以获取到当前的经纬度信息。但有时只获取到经纬度还不够直观,如果能再得到对应的地理位置信息就好了(比如:xx市xx区xx路)。既然 Geolocation 插件不提供这个功能,那我们自己实现一个好了。最终效果如下:
2,自定义插件的创建
3,自定义插件的安装
(1)由于插件是使用Swift语言写的,首先在“终端”中进入到项目文件夹,并运行如下命令添加 Swift 支持插件:

(3)以后如果想移除这个自定义插件,运行如下命令即可:
4,自定义插件的使用
HanggeCLGeocoderPlugin.zip
1,实现原理
我们使用 Swift 做一个转换插件,接收传入的经纬度坐标参数,然后返回对应的地理位置信息。
其内部通过 CLGeocoder 类来实现经纬度反编码成地址。
其内部通过 CLGeocoder 类来实现经纬度反编码成地址。
2,自定义插件的创建
我们随便在本地建立一个文件夹(比如叫 HanggeCLGeocoderPlugin),在里面放置插件的相关功能实现代码和配置文件。目录结构如下:

下面分别介绍各个文件的内容和功能
(1)src文件夹
这个下面就是放置插件的功能实现代码了,可以看到目前 src 文件夹下只有一个 ios 子文件夹。因为本文只实现了 iOS 版的插件,如果还有 Android 版的插件,那么可以在 src 文件夹下再创建个 android 文件夹,然后把相关的 java 代码放到里面。
由于功能比较简单,在 ios 文件夹下只有一个实现类 HanggeCLGeocoderPlugin.swift,具体代码如下:
JS模块文件,这里封装了插件的调用方法。
我们直接使用 插件名称.插件方法() 即可,这样使用起来更加方便,代码也更加清晰。其内容如下:
插件的配置文件。用来配置插件的名字,JS模块文件位置,以及各个平台的功能实现源码位置(这里只实现的iOS的功能,所以只配置了iOS平台相关内容)。

下面分别介绍各个文件的内容和功能
(1)src文件夹
这个下面就是放置插件的功能实现代码了,可以看到目前 src 文件夹下只有一个 ios 子文件夹。因为本文只实现了 iOS 版的插件,如果还有 Android 版的插件,那么可以在 src 文件夹下再创建个 android 文件夹,然后把相关的 java 代码放到里面。
由于功能比较简单,在 ios 文件夹下只有一个实现类 HanggeCLGeocoderPlugin.swift,具体代码如下:
import Foundation
import CoreLocation
import MapKit
@objc(HWPHanggeCLGeocoderPlugin) class HanggeCLGeocoderPlugin : CDVPlugin {
//地理信息反编码
func reverseGeocode(command:CDVInvokedUrlCommand)
{
//返回结果
var pluginResult:CDVPluginResult?
//获取参数
let latitude = command.arguments[0] as! Double
let longitude = command.arguments[1] as! Double
let geocoder = CLGeocoder()
let currentLocation = CLLocation(latitude: latitude, longitude: longitude)
geocoder.reverseGeocodeLocation(currentLocation, completionHandler: {
(placemarks:[CLPlacemark]?, error:NSError?) -> Void in
//强制转成简体中文
let array = NSArray(object: "zh-hans")
NSUserDefaults.standardUserDefaults().setObject(array, forKey: "AppleLanguages")
//获取失败
if error != nil {
pluginResult = CDVPluginResult(status: CDVCommandStatus_ERROR,
messageAsString: "错误:\(error!.localizedDescription))")
}
//获取成功
else {
var message = ""
if let p = placemarks?[0]{
//print(p) //输出反编码信息
message = p.name!
} else {
message = "未知位置"
}
pluginResult = CDVPluginResult(status:CDVCommandStatus_OK,
messageAsString: message)
}
//发送结果
self.commandDelegate.sendPluginResult(pluginResult, callbackId: command.callbackId)
})
}
}
(2)hangge-clgeocoder-plugin.jsJS模块文件,这里封装了插件的调用方法。
我们直接使用 插件名称.插件方法() 即可,这样使用起来更加方便,代码也更加清晰。其内容如下:
'use strict';
var exec = require('cordova/exec');
var HanggeCLGeocoderPlugin = {
reverseGeocode: function([latitude,longitude], onSuccess, onFail) {
return exec(onSuccess, onFail, 'HanggeCLGeocoderPlugin', 'reverseGeocode',
[latitude,longitude]);
}
};
module.exports = HanggeCLGeocoderPlugin;
(3)plugin.xml插件的配置文件。用来配置插件的名字,JS模块文件位置,以及各个平台的功能实现源码位置(这里只实现的iOS的功能,所以只配置了iOS平台相关内容)。
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
id="hangge-clgeocoder-plugin"
version="0.1">
<name>HanggeCLGeocoderPlugin</name>
<description>This plugin use to reverse geocode location</description>
<js-module src="hangge-clgeocoder-plugin.js">
<clobbers target="window.HanggeCLGeocoderPlugin" />
</js-module>
<!-- iOS -->
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="HanggeCLGeocoderPlugin">
<param name="ios-package" value="HWPHanggeCLGeocoderPlugin" />
</feature>
</config-file>
<source-file src="src/ios/HanggeCLGeocoderPlugin.swift" />
</platform>
</plugin>
3,自定义插件的安装
(1)由于插件是使用Swift语言写的,首先在“终端”中进入到项目文件夹,并运行如下命令添加 Swift 支持插件:
cordova plugin add cordova-plugin-add-swift-support(2)假设我们做的自定义插件是在用户“文稿”目录下,运行如下命令把这个插件添加到工程中来:
cordova plugin add ~/Documents/HanggeCLGeocoderPlugin
当然 Geolocation 插件我们也是要安装的,这里就不在多讲了。
进入项目文件夹下的 plugins 文件夹可以看到,自定义插件已经成功的添加进来。当然,这个自定义插件在各个平台工程下也同步安装了。
(3)以后如果想移除这个自定义插件,运行如下命令即可:
cordova plugin rm hangge-clgeocoder-plugin
4,自定义插件的使用
修改首页 index.html 为如下内容。当点击“获取位置”按钮后,除了弹出经纬度信息外还有具体的地理位置信息。
插件源码下载:<!DOCTYPE html>
<html>
<head>
<title>Capture Photo</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8">
document.addEventListener("deviceready",onDeviceReady,false);
//Cordova加载完成会触发
function onDeviceReady() {
}
function getCurrentPosition(){
//定位数据获取成功响应
var onSuccess = function(position) {
//获取位置信息
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
HanggeCLGeocoderPlugin.reverseGeocode([latitude,longitude],
function(address) {
alert('纬度: ' + latitude + '\n' +
'经度: ' + longitude + '\n' +
'位置: ' + address + '\n');
},
function(errorMessage){
alert("定位失败:"+errorMessage);
});
};
//定位数据获取失败响应
function onError(error) {
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
//开始获取定位数据
navigator.geolocation.getCurrentPosition(onSuccess, onError);
}
</script>
</head>
<body style="padding-top:50px">
<button style="font-size:23px;" onclick="getCurrentPosition();">获取位置</button>
</body>
</html>
全部评论(1)
厉害了,我的哥
站长回复:多谢夸奖:)