测试测试 | ✗ |
语言语言 | Obj-CObjective C |
许可 | Apache 2 |
发布最后发布 | 2016年11月 |
由Holly Schinsky,Shazron Abdullah维护。
标题:地理位置
Android | iOS | Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI |
---|---|---|---|---|---|
此插件提供有关设备位置的信息,例如纬度和经度。
位置信息的常见来源包括全球定位系统 (GPS) 以及从 IP 地址、RFID、WiFi 和蓝牙 MAC 地址以及 GSM/CDMA 基站 ID 等网络信号中推断出的位置。API 返回设备的确切位置没有保证。
此 API 基于 W3C 地理位置API规范,并且在没有已实现该功能的设备上执行。
警告:收集和使用地理位置数据会引发重要的隐私问题。您的应用程序隐私策略应该讨论应用程序如何使用地理位置数据,是否与其他任何方共享,以及数据的精度水平(例如,粗略的、细粒度的、ZIP 码级别等)。通常认为地理位置数据是敏感的,因为它可以揭示用户的行踪,如果存储,则可以保留他们旅行的历史记录。因此,除了应用程序隐私策略外,您还应强烈考虑在应用程序访问地理位置数据之前提供即时通知(如果设备操作系统尚未这样做)。此通知应提供上述所述信息,以及获得用户的许可(例如,通过提供 确定 和 不谢 的选择)。有关更多信息,请参阅隐私指南。
此插件定义了一个全局的 navigator.geolocation
对象(对于其他方案,它可能缺失)。
尽管对象在全局作用域中,但由该插件提供的功能仅在 deviceready
事件之后才可用。
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
console.log("navigator.geolocation works well");
}
此要求 cordova 5.0+(当前稳定版 1.0.0)
cordova plugin add cordova-plugin-geolocation
较旧版本的 cordova 可以通过已过时的 id(过时版本 0.3.12)安装
cordova plugin add org.apache.cordova.geolocation
还可以直接通过存储库 URL 进行安装(不稳定)
cordova plugin add https://github.com/apache/cordova-plugin-geolocation.git
将设备的当前位置以一个 Position
对象作为参数,返回给 geolocationSuccess
回调。如果出现错误,将执行 geolocationError
回调,并传递一个 PositionError
对象。
navigator.geolocation.getCurrentPosition(geolocationSuccess,
[geolocationError],
[geolocationOptions]);
geolocationSuccess:传递当前位置所需的回调。
geolocationError:(可选)如果出现错误,则执行回调。
geolocationOptions:(可选)地理位置选项。
// onSuccess Callback
// This method accepts a Position object, which contains the
// current GPS coordinates
//
var onSuccess = function(position) {
alert('Latitude: ' + position.coords.latitude + '\n' +
'Longitude: ' + position.coords.longitude + '\n' +
'Altitude: ' + position.coords.altitude + '\n' +
'Accuracy: ' + position.coords.accuracy + '\n' +
'Altitude Accuracy: ' + position.coords.altitudeAccuracy + '\n' +
'Heading: ' + position.coords.heading + '\n' +
'Speed: ' + position.coords.speed + '\n' +
'Timestamp: ' + position.timestamp + '\n');
};
// onError Callback receives a PositionError object
//
function onError(error) {
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
navigator.geolocation.getCurrentPosition(onSuccess, onError);
如果地理定位服务已关闭,则在 timeout
时间间隔后(如果指定)调用 onError
回调。如果没有指定 timeout
参数,则不调用任何回调。
在检测到位置变化时返回设备当前位置。当设备检索到新的位置时,geolocationSuccess
回调将执行并传递一个 Position
对象作为参数。如果出现错误,则执行 geolocationError
回调并传递一个 PositionError
对象。
var watchId = navigator.geolocation.watchPosition(geolocationSuccess,
[geolocationError],
[geolocationOptions]);
geolocationSuccess:传递当前位置所需的回调。
geolocationError:(可选)当出现错误时执行的回调。
geolocationOptions:(可选)地理位置选项。
navigator.geolocation.clearWatch
与 watch id 配合使用以停止观察位置变化。 // onSuccess Callback
// This method accepts a `Position` object, which contains
// the current GPS coordinates
//
function onSuccess(position) {
var element = document.getElementById('geolocation');
element.innerHTML = 'Latitude: ' + position.coords.latitude + '<br />' +
'Longitude: ' + position.coords.longitude + '<br />' +
'<hr />' + element.innerHTML;
}
// onError Callback receives a PositionError object
//
function onError(error) {
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
// Options: throw an error if no update is received every 30 seconds.
//
var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { timeout: 30000 });
用于自定义地理定位 Position
获取的可选参数。
{ maximumAge: 3000, timeout: 5000, enableHighAccuracy: true };
enableHighAccuracy:提供提示,表明应用程序需要尽可能最佳的成果。默认情况下,设备尝试使用基于网络的方法检索 Position
。将此属性设置为 true
会提示框架使用更精确的方法,例如卫星定位。(布尔值)
timeout:从调用 navigator.geolocation.getCurrentPosition
或 geolocation.watchPosition
到相应的 geolocationSuccess
回调执行的允许最长时间(毫秒)。如果在指定时间内未调用 geolocationSuccess
回调,则将 geolocationError
回调传递一个 PositionError.TIMEOUT
错误代码。(注意:在 conjunction 与 geolocation.watchPosition
一起使用时,geolocationError
回调可每隔 timeout
毫秒调用一次!)。(数字)
maximumAge: 接受缓存位置,其年龄(毫秒)不超过指定的时限。(数字)
如果地理定位服务已关闭,则在 timeout
时间间隔后(如果指定)调用 onError
回调。如果没有指定 timeout
参数,则不调用任何回调。
停止对设备位置变化的监视,位置由watchID
参数引用。
navigator.geolocation.clearWatch(watchID);
watchPosition
间隔的ID。(字符串) // Options: watch for changes in position, and use the most
// accurate position acquisition method available.
//
var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { enableHighAccuracy: true });
// ...later on...
navigator.geolocation.clearWatch(watchID);
包含由地理位置API创建的Position
坐标和时间戳。
coords: 一组地理坐标。(坐标)
timestamp: coords
的创建时间戳。(DOM时间戳)
一个Coordinates
对象附加到一个可用于请求当前位置的回调函数的Position
对象上。它包含一组描述位置地理坐标的属性。
latitude: 十进制度数的纬度。(数字)
longitude: 十进制度数的经度。(数字)
altitude: 位置相对于椭球体的高度(米)。(数字)
accuracy: 纬度和经度坐标的精度水平(米)。(数字)
altitudeAccuracy: 高度坐标的精度水平(米)。(数字)
heading: 旅行方向,以相对于真北的顺时针角度计数。(数字)
speed: 设备的当前地面速度(米/秒)。(数字)
**altitudeAccuracy**:Android设备不支持,返回null
。
**altitudeAccuracy**:Android设备不支持,返回null
。
当使用navigator.geolocation时出现错误时,将PositionError
对象传递给geolocationError
回调函数。
code: 下面列出的预定义错误代码之一。
message: 描述遇到错误细节的错误消息。
PositionError.PERMISSION_DENIED
PositionError.POSITION_UNAVAILABLE
PositionError.TIMEOUT
geolocationOptions
中的timeout
规定的时间内检索位置时返回。当与navigator.geolocation.watchPosition
一起使用时,此错误可能在每个timeout
毫秒重复传递给geolocationError
回调。使用此插件帮助用户查找附近的物品,例如GroupOn交易,出售的房屋,上映的电影,体育和娱乐活动等等。
以下是一些“食谱”创意,帮助您开始。在下面的代码片段中,我们将向您展示一些基本方法,将这些功能添加到您的应用程序中。
function getWeatherLocation() {
navigator.geolocation.getCurrentPosition
(onWeatherSuccess, onWeatherError, { enableHighAccuracy: true });
}
// Success callback for get geo coordinates
var onWeatherSuccess = function (position) {
Latitude = position.coords.latitude;
Longitude = position.coords.longitude;
getWeather(Latitude, Longitude);
}
// Get weather by using coordinates
function getWeather(latitude, longitude) {
// Get a free key at http://openweathermap.org/. Replace the "Your_Key_Here" string with that key.
var OpenWeatherAppKey = "Your_Key_Here";
var queryString =
'http://api.openweathermap.org/data/2.5/weather?lat='
+ latitude + '&lon=' + longitude + '&appid=' + OpenWeatherAppKey + '&units=imperial';
$.getJSON(queryString, function (results) {
if (results.weather.length) {
$.getJSON(queryString, function (results) {
if (results.weather.length) {
$('#description').text(results.name);
$('#temp').text(results.main.temp);
$('#wind').text(results.wind.speed);
$('#humidity').text(results.main.humidity);
$('#visibility').text(results.weather[0].main);
var sunriseDate = new Date(results.sys.sunrise);
$('#sunrise').text(sunriseDate.toLocaleTimeString());
var sunsetDate = new Date(results.sys.sunrise);
$('#sunset').text(sunsetDate.toLocaleTimeString());
}
});
}
}).fail(function () {
console.log("error getting location");
});
}
// Error callback
function onWeatherError(error) {
console.log('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
// Watch your changing position
function watchWeatherPosition() {
return navigator.geolocation.watchPosition
(onWeatherWatchSuccess, onWeatherError, { enableHighAccuracy: true });
}
// Success callback for watching your changing position
var onWeatherWatchSuccess = function (position) {
var updatedLatitude = position.coords.latitude;
var updatedLongitude = position.coords.longitude;
if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
Latitude = updatedLatitude;
Longitude = updatedLongitude;
// Calls function we defined earlier.
getWeather(updatedLatitude, updatedLongitude);
}
}
Bing和Google都有地图服务。我们将使用Google的。你需要一个密钥,但如果你只是尝试新事物,它是免费的。
添加对maps服务的引用。
<script src="https://maps.googleapis.com/maps/api/js?key=Your_API_Key"></script>
然后,添加使用它的代码。
var Latitude = undefined;
var Longitude = undefined;
// Get geo coordinates
function getMapLocation() {
navigator.geolocation.getCurrentPosition
(onMapSuccess, onMapError, { enableHighAccuracy: true });
}
// Success callback for get geo coordinates
var onMapSuccess = function (position) {
Latitude = position.coords.latitude;
Longitude = position.coords.longitude;
getMap(Latitude, Longitude);
}
// Get map by using coordinates
function getMap(latitude, longitude) {
var mapOptions = {
center: new google.maps.LatLng(0, 0),
zoom: 1,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map
(document.getElementById("map"), mapOptions);
var latLong = new google.maps.LatLng(latitude, longitude);
var marker = new google.maps.Marker({
position: latLong
});
marker.setMap(map);
map.setZoom(15);
map.setCenter(marker.getPosition());
}
// Success callback for watching your changing position
var onMapWatchSuccess = function (position) {
var updatedLatitude = position.coords.latitude;
var updatedLongitude = position.coords.longitude;
if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
Latitude = updatedLatitude;
Longitude = updatedLongitude;
getMap(updatedLatitude, updatedLongitude);
}
}
// Error callback
function onMapError(error) {
console.log('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
// Watch your changing position
function watchMapPosition() {
return navigator.geolocation.watchPosition
(onMapWatchSuccess, onMapError, { enableHighAccuracy: true });
}
你可以使用相同的Google密钥来做这件事。
添加对places服务的引用。
<script src=
"https://maps.googleapis.com/maps/api/js?key=Your_API_Key&libraries=places">
</script>
然后,添加使用它的代码。
var Map;
var Infowindow;
var Latitude = undefined;
var Longitude = undefined;
// Get geo coordinates
function getPlacesLocation() {
navigator.geolocation.getCurrentPosition
(onPlacesSuccess, onPlacesError, { enableHighAccuracy: true });
}
// Success callback for get geo coordinates
var onPlacesSuccess = function (position) {
Latitude = position.coords.latitude;
Longitude = position.coords.longitude;
getPlaces(Latitude, Longitude);
}
// Get places by using coordinates
function getPlaces(latitude, longitude) {
var latLong = new google.maps.LatLng(latitude, longitude);
var mapOptions = {
center: new google.maps.LatLng(latitude, longitude),
zoom: 15,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
Map = new google.maps.Map(document.getElementById("places"), mapOptions);
Infowindow = new google.maps.InfoWindow();
var service = new google.maps.places.PlacesService(Map);
service.nearbySearch({
location: latLong,
radius: 500,
type: ['store']
}, foundStoresCallback);
}
// Success callback for watching your changing position
var onPlacesWatchSuccess = function (position) {
var updatedLatitude = position.coords.latitude;
var updatedLongitude = position.coords.longitude;
if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
Latitude = updatedLatitude;
Longitude = updatedLongitude;
getPlaces(updatedLatitude, updatedLongitude);
}
}
// Success callback for locating stores in the area
function foundStoresCallback(results, status) {
if (status === google.maps.places.PlacesServiceStatus.OK) {
for (var i = 0; i < results.length; i++) {
createMarker(results[i]);
}
}
}
// Place a pin for each store on the map
function createMarker(place) {
var placeLoc = place.geometry.location;
var marker = new google.maps.Marker({
map: Map,
position: place.geometry.location
});
google.maps.event.addListener(marker, 'click', function () {
Infowindow.setContent(place.name);
Infowindow.open(Map, this);
});
}
// Error callback
function onPlacesError(error) {
console.log('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
// Watch your changing position
function watchPlacesPosition() {
return navigator.geolocation.watchPosition
(onPlacesWatchSuccess, onPlacesError, { enableHighAccuracy: true });
}
数字照片可以包含表示照片拍摄地点的地理坐标。
使用Flickr API查找你附近人们拍摄的照片。和Google服务一样,你需要一个密钥,但如果你只是想尝试,它是免费的。
var Latitude = undefined;
var Longitude = undefined;
// Get geo coordinates
function getPicturesLocation() {
navigator.geolocation.getCurrentPosition
(onPicturesSuccess, onPicturesError, { enableHighAccuracy: true });
}
// Success callback for get geo coordinates
var onPicturesSuccess = function (position) {
Latitude = position.coords.latitude;
Longitude = position.coords.longitude;
getPictures(Latitude, Longitude);
}
// Get pictures by using coordinates
function getPictures(latitude, longitude) {
$('#pictures').empty();
var queryString =
"https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=Your_API_Key&lat="
+ latitude + "&lon=" + longitude + "&format=json&jsoncallback=?";
$.getJSON(queryString, function (results) {
$.each(results.photos.photo, function (index, item) {
var photoURL = "http://farm" + item.farm + ".static.flickr.com/" +
item.server + "/" + item.id + "_" + item.secret + "_m.jpg";
$('#pictures').append($("<img />").attr("src", photoURL));
});
}
);
}
// Success callback for watching your changing position
var onPicturesWatchSuccess = function (position) {
var updatedLatitude = position.coords.latitude;
var updatedLongitude = position.coords.longitude;
if (updatedLatitude != Latitude && updatedLongitude != Longitude) {
Latitude = updatedLatitude;
Longitude = updatedLongitude;
getPictures(updatedLatitude, updatedLongitude);
}
}
// Error callback
function onPicturesError(error) {
console.log('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
// Watch your changing position
function watchPicturePosition() {
return navigator.geolocation.watchPosition
(onPicturesWatchSuccess, onPicturesError, { enableHighAccuracy: true });
}