cordova-plugin-geolocation 2.4.0

cordova-plugin-geolocation 2.4.0

测试测试
语言语言 Obj-CObjective C
许可 Apache 2
发布最后发布2016年11月

Holly SchinskyShazron Abdullah维护。



  • Adobe PhoneGap 团队

标题:地理位置

描述:访问 GPS 数据。

Android iOS Windows 8.1 Store Windows 8.1 Phone Windows 10 Store Travis CI
Build Status Build Status Build Status Build Status Build Status

cordova-plugin-geolocation

此插件提供有关设备位置的信息,例如纬度和经度。

位置信息的常见来源包括全球定位系统 (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

支持的平台

  • Amazon Fire OS
  • Android
  • BlackBerry 10
  • Firefox OS
  • iOS
  • Tizen
  • Windows Phone 7 和 8
  • Windows

方法

  • navigator.geolocation.getCurrentPosition
  • navigator.geolocation.watchPosition
  • navigator.geolocation.clearWatch

对象(只读)

  • 位置
  • 位置错误
  • 坐标

navigator.geolocation.getCurrentPosition

将设备的当前位置以一个 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);

Android 限制

如果地理定位服务已关闭,则在 timeout 时间间隔后(如果指定)调用 onError 回调。如果没有指定 timeout 参数,则不调用任何回调。

navigator.geolocation.watchPosition

在检测到位置变化时返回设备当前位置。当设备检索到新的位置时,geolocationSuccess 回调将执行并传递一个 Position 对象作为参数。如果出现错误,则执行 geolocationError 回调并传递一个 PositionError 对象。

var watchId = navigator.geolocation.watchPosition(geolocationSuccess,
                                                  [geolocationError],
                                                  [geolocationOptions]);

参数

  • geolocationSuccess:传递当前位置所需的回调。

  • geolocationError:(可选)当出现错误时执行的回调。

  • geolocationOptions:(可选)地理位置选项。

返回值

  • 字符串:返回的引用位置监测周期的 watch id。应使用 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 });

geolocationOptions

用于自定义地理定位 Position 获取的可选参数。

{ maximumAge: 3000, timeout: 5000, enableHighAccuracy: true };

选项

  • enableHighAccuracy:提供提示,表明应用程序需要尽可能最佳的成果。默认情况下,设备尝试使用基于网络的方法检索 Position。将此属性设置为 true 会提示框架使用更精确的方法,例如卫星定位。(布尔值)

  • timeout:从调用 navigator.geolocation.getCurrentPositiongeolocation.watchPosition 到相应的 geolocationSuccess 回调执行的允许最长时间(毫秒)。如果在指定时间内未调用 geolocationSuccess 回调,则将 geolocationError 回调传递一个 PositionError.TIMEOUT 错误代码。(注意:在 conjunction 与 geolocation.watchPosition 一起使用时,geolocationError 回调可每隔 timeout 毫秒调用一次!)。(数字)

  • maximumAge: 接受缓存位置,其年龄(毫秒)不超过指定的时限。(数字)

Android 的一些特性

如果地理定位服务已关闭,则在 timeout 时间间隔后(如果指定)调用 onError 回调。如果没有指定 timeout 参数,则不调用任何回调。

navigator.geolocation.clearWatch

停止对设备位置变化的监视,位置由watchID参数引用。

navigator.geolocation.clearWatch(watchID);

参数

  • 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: 设备的当前地面速度(米/秒)。(数字)

Amazon Fire OS的一些特性

**altitudeAccuracy**:Android设备不支持,返回null

Android 的一些特性

**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 });
}