ÐÑполÑзование Geolocation API
Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.
Geolocation API позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿ÑедоÑÑавлÑÑÑ ÑÐ²Ð¾Ñ Ð¼ÐµÑÑоположение web-пÑиложениÑ, еÑли полÑзоваÑÐµÐ»Ñ ÑоглаÑиÑÑÑ Ð¿ÑедоÑÑавиÑÑ ÐµÐ³Ð¾. Ðз ÑообÑажений конÑиденÑиалÑноÑÑи, Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð¿ÑоÑено ÑазÑеÑение на пÑедоÑÑавление инÑоÑмаÑии о меÑÑоположении.
ÐбÑÐµÐºÑ Ð³ÐµÐ¾Ð»Ð¾ÐºÐ°Ñии
API геолокаÑии доÑÑÑпен ÑеÑез обÑÐµÐºÑ navigator.geolocation.
ÐÑли обÑÐµÐºÑ ÑÑÑеÑÑвÑеÑ, ÑÑнкÑии опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÑÑÐ¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпнÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ ÑÑо ÑледÑÑÑим обÑазом:
if ("geolocation" in navigator) {
/* меÑÑоположение доÑÑÑпно */
} else {
/* меÑÑоположение ÐРдоÑÑÑпно */
}
ÐолÑÑение ÑекÑÑего меÑÑоположениÑ
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑекÑÑее меÑÑоположение полÑзоваÑелÑ, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑзваÑÑ Ð¼ÐµÑод getCurrentPosition(). ÐÑо иниÑииÑÑÐµÑ Ð°ÑинÑ
ÑоннÑй запÑÐ¾Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð°ÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¼ÐµÑÑÐ¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, и запÑаÑÐ¸Ð²Ð°ÐµÑ Ð°Ð¿Ð¿Ð°ÑаÑнÑе ÑÑедÑÑва позиÑиониÑованиÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾ÑледнÑÑ Ð°ÐºÑÑалÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ. Ðогда меÑÑоположение опÑеделено, вÑполнÑеÑÑÑ callback. Ðо Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑказаÑÑ Ð²ÑоÑÑÑ callback ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки оÑибки, коÑоÑÐ°Ñ Ð·Ð°Ð¿ÑÑÑиÑÑÑ Ð² ÑлÑÑае оÑибки. ТÑеÑий, опÑионалÑнÑй паÑамеÑÑ - обÑÐµÐºÑ Ñ Ð¾Ð¿ÑиÑми, где Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе наÑÑÑоиÑÑ Ð¼Ð°ÐºÑималÑное знаÑение возвÑаÑаемÑÑ
даннÑÑ
, вÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾ÑвеÑа на запÑоÑ, и, пÑи желании, ÑоÑноÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑÑ
даннÑÑ
.
ÐÑимеÑание:
Ðо ÑмолÑÐ°Ð½Ð¸Ñ getCurrentPosition() пÑÑаеÑÑÑ Ð²ÐµÑнÑÑÑ ÑезÑлÑÑÐ°Ñ Ñак бÑÑÑÑо, как ÑÑо возможно, за ÑÑÑÑ Ñего даÑÑ Ð½Ðµ оÑÐµÐ½Ñ ÑоÑнÑй ÑезÑлÑÑаÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, еÑли вам нÑжно бÑÑÑÑо полÑÑиÑÑ Ð¾ÑвеÑ, пÑи ÑÑом не важна ÑоÑноÑÑÑ. УÑÑÑойÑÑва Ñ GPS, напÑимеÑ, могÑÑ Ð¿ÑÑаÑÑÑÑ ÑкоÑÑекÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе GPS около минÑÑÑ Ð¸ даже болÑÑе, поÑÑÐ¾Ð¼Ñ Ð² Ñамом наÑале могÑÑ Ð²ÐµÑнÑÑÑÑÑ Ð¼ÐµÐ½ÐµÐµ ÑоÑнÑе даннÑе (меÑÑоположение IP или wifi-ÑеÑи), полÑÑеннÑе getCurrentPosition().
navigator.geolocation.getCurrentPosition(function (position) {
do_something(position.coords.latitude, position.coords.longitude);
});
ФÑнкÑÐ¸Ñ do_something(), в пÑимеÑе вÑÑе, бÑÐ´ÐµÑ Ð²Ñзвана лиÑÑ Ñогда, когда даннÑе о меÑÑоположении бÑдÑÑ Ð¿Ð¾Ð»ÑÑенÑ.
ÐаблÑдение за ÑекÑÑим меÑÑоположением
ÐÑли даннÑе о меÑÑоположении менÑÑÑÑÑ (либо ÑÑÑÑойÑÑво наÑ
одиÑÑÑ Ð² движении, либо пÑиÑли более ÑоÑнÑе даннÑе о геопозиÑии), Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑказаÑÑ callback ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваеÑÑÑ Ð¿Ñи лÑбом обновлении даннÑÑ
о меÑÑоположении. ÐÑо делаеÑÑÑ Ñ Ð¸ÑполÑзованием ÑÑнкÑии watchPosition(), коÑоÑÐ°Ñ Ð¸Ð¼ÐµÐµÑ Ð½ÐµÑколÑко вÑ
однÑÑ
паÑамеÑÑов: getCurrentPosition(). ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Ñаз, позволÑÑ Ð±ÑаÑзеÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑ Ð´Ð°Ð½Ð½Ñе о ÑекÑÑей локаÑии либо во вÑÐµÐ¼Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ, либо поÑле полÑÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ ÑоÑной инÑоÑмаÑии о меÑÑоположении (поÑле пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ ÑоÑнÑÑ
пÑиÑмов). ФÑнкÑиÑ, коÑоÑÐ°Ñ Ð²ÑзÑваеÑÑÑ Ð¿Ñи оÑибке, Ð´Ð»Ñ getCurrentPosition(), пÑи желании, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана неоднокÑаÑно.
ÐÑимеÑание:
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ watchPosition() без вÑзова getCurrentPosition().
var watchID = navigator.geolocation.watchPosition(function (position) {
do_something(position.coords.latitude, position.coords.longitude);
});
ÐеÑод watchPosition() возвÑаÑÐ°ÐµÑ ÑиÑловой ID, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован Ð´Ð»Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑии наблÑдаÑÐµÐ»Ñ Ð·Ð° меÑÑоположением; иÑполÑзÑйÑе его вмеÑÑе Ñ Ð¼ÐµÑодом clearWatch(), ÑÑÐ¾Ð±Ñ Ð¿ÐµÑеÑÑаÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð½Ð¾Ð²Ñе даннÑе о меÑÑоположении.
navigator.geolocation.clearWatch(watchID);
ТоÑÐ½Ð°Ñ Ð½Ð°ÑÑÑойка оÑклика
getCurrentPosition() и watchPosition() пÑинимаÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑÐ¸Ñ Ð¿Ñи ÑÑпеÑ
е, необÑзаÑелÑнÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑÐ¸Ñ Ð¿Ñи оÑибке и необÑзаÑелÑнÑй обÑÐµÐºÑ PositionOptions.
ÐÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð²Ð°Ð¼ вклÑÑиÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð¸Ñии Ñ Ð²ÑÑокой ÑоÑноÑÑÑÑ, ÑказаÑÑ Ð¼Ð°ÐºÑималÑное вÑÐµÐ¼Ñ ÐºÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð¸Ñии (пÑи повÑоÑнÑÑ Ð·Ð°Ð¿ÑоÑÐ°Ñ , пока вÑÐµÐ¼Ñ Ð½Ðµ вÑÑло, вам бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ ÐºÐµÑиÑованное знаÑение; поÑле бÑаÑÐ·ÐµÑ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð¿ÑаÑиваÑÑ Ð°ÐºÑÑалÑнÑе даннÑе), а Ñакже ÑказаÑÑ Ð·Ð½Ð°Ñение, ÑÑÑанавливаÑÑее инÑеÑвал â как ÑаÑÑо бÑаÑÐ·ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑÑаÑÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð°Ð½Ð½Ñе о меÑÑоположении, пÑежде Ñем вÑÐ¹Ð´ÐµÑ Ð²ÑемÑ.
ÐÑзов watchPosition Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:
function geo_success(position) {
do_something(position.coords.latitude, position.coords.longitude);
}
function geo_error() {
alert("ÐзвиниÑе, Ð½ÐµÑ Ð´Ð¾ÑÑÑпной позиÑии.");
}
var geo_options = {
enableHighAccuracy: true,
maximumAge: 30000,
timeout: 27000,
};
var wpid = navigator.geolocation.watchPosition(
geo_success,
geo_error,
geo_options,
);
ÐпиÑание позиÑии
ÐеÑÑоположение полÑзоваÑÐµÐ»Ñ ÑодеÑжиÑÑÑ Ð² ÑкземплÑÑе обÑекÑа GeolocationPosition, ÑодеÑжаÑего внÑÑÑи ÑкземплÑÑ Ð´ÑÑгого обÑекÑа â GeolocationCoordinates.
ÐкземплÑÑ GeolocationPosition ÑодеÑÐ¶Ð¸Ñ ÑолÑко две веÑи, ÑвойÑÑво coords, внÑÑÑи коÑоÑого GeolocationCoordinates и ÑвойÑÑво timestamp, внÑÑÑи коÑоÑого ÑкземплÑÑ DOMTimeStamp, пÑедоÑÑавлÑÑÑее меÑÐºÑ Ð²Ñемени, ÑозданнÑÑ Ð¿Ñи полÑÑении даннÑе.
ÐкземплÑÑ GeolocationCoordinates ÑодеÑÐ¶Ð¸Ñ Ð½ÐµÐºÐ¾ÑоÑое колиÑеÑÑво ÑвойÑÑв, двое из коÑоÑÑÑ
Ð²Ñ Ð±ÑдеÑе ÑаÑе вÑего иÑполÑзоваÑÑ: latitude и longitude, коÑоÑÑе помогÑÑ Ð²Ð°Ð¼ оÑобÑазиÑÑ Ð¿Ð¾Ð»ÑÑеннÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð½Ð° каÑÑе. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ð½Ð¾Ð³Ð¸Ðµ колбÑк-ÑÑнкÑии Ñ ÑÑпеÑнÑм полÑÑением позиÑии вÑглÑдÑÑ Ð¾ÑÐµÐ½Ñ Ð¿ÑоÑÑо:
function success(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
// ÐалÑÑе код, коÑоÑÑй ÑÑо-Ñо Ð´ÐµÐ»Ð°ÐµÑ Ñ ÑиÑоÑой(latitude) и долгоÑой(longitude)
}
Ðднако, Ð²Ñ Ñакже можеÑе полÑÑиÑÑ Ð¸ дÑÑгÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· обÑекÑа GeolocationCoordinates, ÑакÑÑ ÐºÐ°Ðº вÑÑоÑа над ÑÑовнем моÑÑ, ÑкоÑоÑÑÑ, напÑавление ÑÑÑÑойÑÑва и ÑоÑнÑе даннÑе о вÑÑоÑе, долгоÑе и ÑиÑоÑе.
ÐбÑабоÑка оÑибок
Callback-ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ñибок, еÑли она бÑла пеÑедана в getCurrentPosition() или watchPosition(), Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑкземплÑÑ Ð¾Ð±ÑекÑа GeolocationPositionError в каÑеÑÑве пеÑвого аÑгÑменÑа. Ðн бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð´Ð²Ð° ÑвойÑÑва, code, коÑоÑÑй ÑÐºÐ°Ð¶ÐµÑ Ð½Ð° Ñо, ÐºÐ°ÐºÐ°Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ оÑибка пÑоизоÑла и понÑÑное Ð´Ð»Ñ Ñеловека message, опиÑÑваÑÑее знаÑение Ð¿Ð¾Ð»Ñ code.
ФÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ð¿ÑимеÑно Ñак:
function errorCallback(error) {
alert("ERROR(" + error.code + "): " + error.message);
}
ÐÑимеÑÑ
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзÑÐµÑ Geolocation API Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑиÑоÑÑ Ð¸ долгоÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. ÐÑи ÑÑпеÑном вÑполнении, ÑÑÑлка бÑÐ´ÐµÑ Ð²ÐµÑÑи на openstreetmap.org, коÑоÑÑй оÑобÑÐ°Ð·Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð½Ð° каÑÑе.
HTML
<button id="find-me">Show my location</button><br />
<p id="status"></p>
<a id="map-link" target="_blank"></a>
JavaScript
function geoFindMe() {
const status = document.querySelector("#status");
const mapLink = document.querySelector("#map-link");
mapLink.href = "";
mapLink.textContent = "";
function success(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
status.textContent = "";
mapLink.href = `https://www.openstreetmap.org/#map=18/${latitude}/${longitude}`;
mapLink.textContent = `ШиÑоÑа: ${latitude} °, ÐолгоÑа: ${longitude} °`;
}
function error() {
status.textContent = "Ðевозможно полÑÑиÑÑ Ð²Ð°Ñе меÑÑоположение";
}
if (!navigator.geolocation) {
status.textContent = "Geolocation не поддеÑживаеÑÑÑ Ð²Ð°Ñим бÑаÑзеÑом";
} else {
status.textContent = "ÐпÑеделение меÑÑоположениÑâ¦";
navigator.geolocation.getCurrentPosition(success, error);
}
}
document.querySelector("#find-me").addEventListener("click", geoFindMe);