使ç¨å°çä½ç½® API
å®å ¨ä¸ä¸æ: æ¤ç¹æ§ä» å¨ä¸äºæ¯æçæµè§å¨çå®å ¨ä¸ä¸æï¼HTTPSï¼ä¸å¯ç¨ã
å°çä½ç½® API ç¨äºæ£ç´¢ç¨æ·çä½ç½®ï¼å æ¤ï¼å©ç¨å°å¾ APIï¼å¯ä»¥æ¾ç¤ºç¨æ·çä½ç½®ãæ¬æå°éè¿°åºç¡çä½¿ç¨æ¹æ³ã
geolocation 对象
å°çä½ç½® API éè¿ navigator.geolocation 对象æä¾ã
å¦æè¯¥å¯¹è±¡åå¨ï¼é£ä¹å°çä½ç½®æå¡å¯ç¨ãä½ å¯ä»¥æµè¯ geolocation æ¯å¦åå¨ï¼
if ("geolocation" in navigator) {
/* geolocation åå¨ */
} else {
/* geolocation ä¸åå¨ */
}
è·åå½åä½ç½®
ä½ å¯ä»¥è°ç¨ getCurrentPosition() 彿°è·åç¨æ·å½åå®ä½ä½ç½®ãè¿ä¼å¼æ¥å°è¯·æ±è·åç¨æ·ä½ç½®ï¼å¹¶æ¥è¯¢å®ä½ç¡¬ä»¶æ¥è·åææ°ä¿¡æ¯ãå½å®ä½è¢«ç¡®å®åï¼å®ä¹çåè°å½æ°å°±ä¼è¢«æ§è¡ãä½ å¯ä»¥éæ©æ§å°æä¾ç¬¬äºä¸ªåè°å½æ°ï¼å½æé误æ¶ä¼è¢«æ§è¡ã第ä¸ä¸ªåæ°ä¹æ¯å¯éçï¼ä½ å¯ä»¥éè¿è¯¥å¯¹è±¡åæ°è®¾å®æé¿å¯æ¥åçå®ä½è¿åæ¶é´ãçå¾
请æ±çæ¶é´åæ¯å¦è·åé«ç²¾åº¦å®ä½ã
夿³¨ï¼é»è®¤æ
åµä¸ï¼getCurrentPosition() ä¼å°½å¿«è¿åä¸ä¸ªä½ç²¾åº¦ç»æï¼è¿å¨ä½ ä¸å
³å¿å确度åªå
³å¿å¿«éè·åç»æçæ
åµä¸å¾æç¨ãæ GPS ç设å¤å¯è½éè¦ä¸åéææ´ä¹
æ¥è·å GPS å®ä½ï¼å¨è¿ç§æ
åµä¸ getCurrentPosition() ä¼è¿åä½ç²¾åº¦æ°æ®ï¼åºäº IP çå®ä½æ Wi-Fi å®ä½ï¼ã
navigator.geolocation.getCurrentPosition((position) => {
doSomething(position.coords.latitude, position.coords.longitude);
});
ä¸è¿°ç¤ºä¾ä¸ï¼å½è·åä½ç½®å doSomething() 彿°ä¼è¢«æ§è¡ã
çè§å®ä½
ä½ å¯ä»¥è®¾å®ä¸ä¸ªåè°å½æ°æ¥ååºå®ä½æ°æ®åççåæ´ï¼è®¾å¤åçäºç§»å¨ï¼æè·åå°äºæ´é«ç²¾åº¦çå°çä½ç½®ä¿¡æ¯ï¼ãä½ å¯ä»¥éè¿ watchPosition() 彿°å®ç°è¯¥åè½ãå®ä¸ getCurrentPosition() æ¥åç¸åçåæ°ï¼ä½åè°å½æ°ä¼è¢«è°ç¨å¤æ¬¡ãé误åè°å½æ°ä¸ getCurrentPosition() ä¸ä¸æ ·æ¯å¯éçï¼ä¹ä¼è¢«å¤æ¬¡è°ç¨ã
夿³¨ï¼ä½ å¯ä»¥ç´æ¥è°ç¨ watchPosition() 彿°ï¼ä¸éè¦å
è°ç¨ getCurrentPosition() 彿°ã
const watchID = navigator.geolocation.watchPosition((position) => {
doSomething(position.coords.latitude, position.coords.longitude);
});
watchPosition() 彿°ä¼è¿åä¸ä¸ª IDï¼å¯ä¸å°æ 记该ä½ç½®çè§å¨ãä½ å¯ä»¥å°è¿ä¸ª ID ä¼ ç» clearWatch() 彿°æ¥åæ¢çè§ç¨æ·ä½ç½®ã
navigator.geolocation.clearWatch(watchID);
è°æ´è¿åç»æ
getCurrentPosition() å watchPosition() 齿¥åä¸ä¸ªæååè°ãä¸ä¸ªå¯éç失败åè°åä¸ä¸ªå¯éç options 对象ã
该对象å è®¸ä½ æå®æ¯å¦å¯ç¨é«ç²¾åº¦ãè¿åä½ç½®æ°æ®çæé¿ç¼åæ¶é´ï¼å¨è¾¾å°æé¿ç¼åæ¶é´ä¹åï¼ç»æä¼è¢«ç¼åï¼ä¸å¨è¯·æ±æ¶çä½ç½®ç¸åæ¶ï¼ä¼è¿åç¼åçç»æï¼å¨è¿æåï¼æµè§å¨ä¼è¯·æ±å·æ°ä½ç½®æ°æ®ï¼ï¼ä»¥åè¶ æ¶æ¶é´ï¼ç¨äºè¡¨ç¤ºæµè§å¨å¨è¶ æ¶åæå¤§çå°è¯è·åä½ç½®æ°æ®çæ¶é´ï¼ã
对 watchPosition çè°ç¨ç±»ä¼¼äºè¿æ ·ï¼
function success(position) {
doSomething(position.coords.latitude, position.coords.longitude);
}
function error() {
alert("Sorry, no position available.");
}
const options = {
enableHighAccuracy: true,
maximumAge: 30000,
timeout: 27000,
};
const watchID = navigator.geolocation.watchPosition(success, error, options);
æè¿°ä½ç½®
ç¨æ·çä½ç½®ç±ä¸ä¸ªå
å« GeolocationCoordinates 对象å®ä¾ç GeolocationPosition 对象å®ä¾æè¿°ã
GeolocationPosition å®ä¾å
å«ä¸¤ä¸ªå±æ§ï¼coords å
å«ä¸ä¸ª GeolocationCoordinates å®ä¾ï¼timestamp 屿§åå
å«ä¸ä¸ª DOMTimeStamp å®ä¾ï¼ç¨äºè¡¨ç¤ºæ£ç´¢ä½ç½®æ°æ®è±è´¹çæ¶é´ã
GeolocationCoordinates å®ä¾å
å«å¤ä¸ªå±æ§ï¼ä½ä¸»è¦ä½¿ç¨çæ¯å
¶ä¸çä¸¤ä¸ªå±æ§ï¼latitudeï¼çº¬åº¦ï¼å longitudeï¼ç»åº¦ï¼ï¼å®ä»¬æ¯ä½ å¨å°å¾ä¸ç»å¶ä½ç½®æéçãå æ¤ï¼è®¸å¤å°çå®ä½æåçåè°çèµ·æ¥ç¸å½ç®åï¼
function success(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
// ä½¿ç¨ latitude å longitude åäºä»ä¹
}
ä½ ä¹å¯ä»¥ä» GeolocationCoordinates 对象ä¸è·å许å¤å
¶ä»çä¿¡æ¯ï¼å
æ¬é«åº¦ãé度ã设å¤é¢æçæ¹åï¼ä»¥å对é«åº¦ãç»çº¬åº¦æ°æ®çç²¾åæµéå¼ã
é误å¤ç
妿è°ç¨ getCurrentPosition() æ watchPosition() æ¶æä¾äºé误åè°å½æ°ï¼åè°å½æ°ç第ä¸ä¸ªåæ°å°ä¼æ¯ä¸ä¸ª GeolocationPositionError 对象å®ä¾ã该对象å
å«ä¸¤ä¸ªå±æ§ï¼code 表示è¿åçé误类åï¼message 表示人类å¯è¯»çã对é误ç ï¼codeï¼çæè¿°ã
ä½ å¯ä»¥åè¿æ ·ä½¿ç¨å®ï¼
function errorCallback(error) {
alert(`ERROR(${error.code}): ${error.message}`);
}
示ä¾
å¨ä»¥ä¸ç¤ºä¾ä¸ï¼Geolocation API ç¨äºæ£ç´¢ç¨æ·çç»çº¬åº¦ã妿æ£ç´¢æåï¼åå¨è¶
龿¥ä¸å¡«å
ä¸ä¸ªå¯ä»¥æ¾ç¤ºç¨æ·ä½ç½®ç openstreetmap.org ç URLã
HTML
<button id="find-me">æ¾ç¤ºæçä½ç½®</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 = "ä½ çæµè§å¨ä¸æ¯æå°çä½ç½®";
} else {
status.textContent = "å®ä½ä¸â¦â¦";
navigator.geolocation.getCurrentPosition(success, error);
}
}
document.querySelector("#find-me").addEventListener("click", geoFindMe);