69 lines
1.9 KiB
JavaScript
69 lines
1.9 KiB
JavaScript
/*
|
|
* Provides L.Map with convenient shortcuts for W3C geolocation.
|
|
*/
|
|
|
|
L.Map.include({
|
|
locate: function(/*Object*/ options) {
|
|
// W3C Geolocation API Spec position options, http://dev.w3.org/geo/api/spec-source.html#position-options
|
|
var opts = {timeout: 10000};
|
|
L.Util.extend(opts, options);
|
|
|
|
if (navigator.geolocation) {
|
|
navigator.geolocation.getCurrentPosition(
|
|
L.Util.bind(this._handleGeolocationResponse, this),
|
|
L.Util.bind(this._handleGeolocationError, this),
|
|
opts);
|
|
} else {
|
|
this.fire('locationerror', {
|
|
code: 0,
|
|
message: "Geolocation not supported."
|
|
});
|
|
}
|
|
return this;
|
|
},
|
|
|
|
locateAndSetView: function(maxZoom, options) {
|
|
this._setViewOnLocate = true;
|
|
this._maxLocateZoom = maxZoom || Infinity;
|
|
return this.locate(options);
|
|
},
|
|
|
|
_handleGeolocationError: function(error) {
|
|
var c = error.code,
|
|
message = (c == 1 ? "permission denied" :
|
|
(c == 2 ? "position unavailable" : "timeout"));
|
|
|
|
if (this._setViewOnLocate) {
|
|
this.fitWorld();
|
|
this._setViewOnLocate = false;
|
|
}
|
|
|
|
this.fire('locationerror', {
|
|
code: c,
|
|
message: "Geolocation error: " + message + "."
|
|
});
|
|
},
|
|
|
|
_handleGeolocationResponse: function(pos) {
|
|
var latAccuracy = 180 * pos.coords.accuracy / 4e7,
|
|
lngAccuracy = latAccuracy * 2,
|
|
lat = pos.coords.latitude,
|
|
lng = pos.coords.longitude;
|
|
|
|
var sw = new L.LatLng(lat - latAccuracy, lng - lngAccuracy),
|
|
ne = new L.LatLng(lat + latAccuracy, lng + lngAccuracy),
|
|
bounds = new L.LatLngBounds(sw, ne);
|
|
|
|
if (this._setViewOnLocate) {
|
|
var zoom = Math.min(this.getBoundsZoom(bounds), this._maxLocateZoom);
|
|
this.setView(bounds.getCenter(), zoom);
|
|
this._setViewOnLocate = false;
|
|
}
|
|
|
|
this.fire('locationfound', {
|
|
latlng: new L.LatLng(lat, lng),
|
|
bounds: bounds,
|
|
accuracy: pos.coords.accuracy
|
|
});
|
|
}
|
|
}); |