【注意】 このドキュメントは、W3CのGeolocation API W3C Recommendation 01 September 2022の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2023年3月19日
翻訳版も参照してください。
Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
ジオロケーションAPIは、ホスティング・デバイスに関連付けられた地理的な位置情報へのアクセスを提供します。
この項は、このドキュメントの公開時のステータスについて記述しています。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、https://www.w3.org/TR/のW3C技術報告インデックスにあります。
デバイス・センサー・ワーキンググループ(Devices and Sensors Working Group)は、この仕様を「生活水準」にすることを目指し、更新を続けています。そのため、「版」を廃止し、新機能の追加やバグの修正に合わせて、この仕様の更新したW3C勧告を発行し続けることを目指しています。
このドキュメントは、デバイスおよびセンサー・ワーキンググループ(Devices and Sensors Working Group)が勧告トラックを用いて勧告として公開しました。
W3Cは、この仕様をウェブの標準として広く展開することを推奨します。
W3C勧告は、広範な合意形成の後、W3Cとそのメンバーの協賛を得て、ワーキンググループのメンバーから実装のためのロイヤルティ・フリーのライセンスを約束された仕様です。この勧告の将来の更新では、新しい機能を組み込む可能性があります。
このドキュメントは、W3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。
このドキュメントは、2021年11月2日のW3Cプロセス・ドキュメントによって管理されています。
この項は非規範的です。
ジオロケーションAPIは、実装を提供しているデバイスのみに関連付けられている位置情報に対する、ハイレベルなインターフェースを定義します。一般的な位置情報の情報源には、ユーザによる入力に加え、GPS(Global Positioning System)や、IPアドレス、RFID、WiFiやBluetooth MACアドレスなどのネットワーク信号から推測される位置情報、GSM/CDMAセルIDなどがあります。API自体は、基礎となる位置情報の情報源に依存せず、APIがデバイスの実際の位置を返す保証はありません。
エンドユーザが許可を与えた場合、ジオロケーションAPIは、
GeolocationPosition
インターフェースにより位置情を取得したおおよその時刻を提供します。getCurrentPosition
()
メソッドによる「単発の」の位置の更新と、watchPosition
()
メソッドによるホスティング・デバイスの位置情報が大きく変った場合の更新受信機能をサポートします。PositionOptions
のmaximumAge
を用いて、アプリケーションが、経過時間が指定値以下であるキャッシュされた位置をリクエストできるようにします(最後の位置情報のみがキャッシュされる)。GeolocationPositionError
として受信する方法を提供します。enableHighAccuracy
により、「高精度」な位置データのリクエストをサポートしますが、このリクエストはユーザ・エージェントによって無視される可能性があります。この項は非規範的です。
この仕様は、ホスティング・デバイスに関連付けられている地理的な位置情報を取得するためのスクリプトAPIの提供のみを範囲としています。地理的な位置情報は、世界測地系座標[WGS84]で提供されます。この仕様には、いかなる種類のマークアップ言語の提供も含まれておらず、地理的な位置を識別するURLを構築するための新たなURLスキームの定義も含まれていません。
この項は非規範的です。
2021年の最初の公開草案以後、ジオロケーションAPIに次の規範的な変更を行いました。
2016年の第2版の公開以降、この仕様に次の変更を行いました。
errorCallback
でヌル(null)が可能となりました。callbacks
は「EventHandler」オブジェクト(すなわち、.handleEvent()
メソッドを持つオブジェクト)として扱われなくなり、IDLコールバック関数として排他的に扱われるようになりました。[NoInterfaceObject]
を用いなくなったため、この仕様のGeolocation
などのインターフェースは、グローバルな範囲に入るようになりました。また、インターフェースの名前をNavigatorGeolocation*
から単なるGeolocation*
に変更しました。変更点の完全なリストは、コミット履歴をご覧ください。
この項は非規範的です。
このAPIは、「単発」の位置リクエストと、繰り返しの位置更新の両方を可能にすることを目指しています。次の例は、一般的なユースケースを示しています。
この項は非規範的です。
ユーザの現在位置をリクエストします。ユーザが許可すれば、位置オブジェクトが返されます。
この項は非規範的です。
ユーザの現在位置を監視する機能をリクエストします。ユーザが許可すれば、ユーザの位置の継続的な更新が返されます。
この項は非規範的です。
clearWatch
()
メソッドを呼び出すことにより、位置の変化の監視を停止します。
この項は非規範的です。
エラーが発生した場合、watchPosition
()
またはgetCurrentPosition
()
のメソッドの2番目の引数にGeolocationPositionError
というエラーが呼び出され、問題の内容が分かるようになります。
この項は非規範的です。
デフォルトでは、以前に取得した位置がある限り、APIは常にキャッシュされた位置を返そうとします。この例では、経過時間が10分以下である位置を受け入れます。ユーザ・エージェントが持っているキャッシュされた位置が十分に新しくない場合は、自動的に新しい位置を取得します。
時間的制約のある形で位置情報を求める場合、PositionOptions
timeout
メンバーを用いて、位置の取得までの待機時間を制限することができます。
この項は非規範的です。
'self'
というデフォルトの許可リストでは、同一オリジンの入れ子のフレーム内でジオロケーションAPIを使用できますが、サードパーティーのコンテンツがそのAPIを用いることはできません。
サードパーティーの使用は、iframe
要素にallow
="geolocation"
属性を追加することで選択的に有効にすることができます。
または、HTTPレスポンス・ヘッダーを指定することで、ファーストパーティのコンテキストでAPIを無効化することもできます。
Permissions-Policy
HTTPヘッダーの詳細については、許可ポリシーを参照してください。
この項は非規範的です。
この仕様で定義しているAPIは、ホスティング・デバイスの地理的な位置を取得するために用いられます。ほとんどの場合、この情報はそのデバイスのユーザの位置も開示するため、ユーザのプライバシーが危険にさらされる可能性があります。
この項は非規範的です。
ジオロケーションAPIは、位置データをウェブ・アプリケーションと共有する前に、エンドユーザからの明確な許可を必要とする強力な機能です。この要件は、getCurrentPosition
()
とwatchPosition
()
のメソッドが依存する許可チェックのステップによって規範的に強制されます。
エンドユーザは通常、ユーザ・インターフェースを通じて明確な許可を与えますが、その際に、エンドユーザが選択できる許可の有効期間の範囲が提示されます。有効期間の選択は、ユーザ・エージェントによって異なりますが、一般的に時間ベース(例えば「1日」)、またはブラウザが閉じられるまで、あるいは無期限の許可を得られるという選択肢がユーザに与えられる可能性さえあります。許可の有効期間は、ユーザ・エージェントが許可を与えてから、その許可が自動的にデフォルトの状態に戻り、その後の使用時にエンドユーザが新しい選択を促されるまでの時間を規定します。
許可の有効期間の粒度は、ユーザ・エージェントによって異なりますが、この仕様は、デフォルトで有効期間を1回のブラウジングに制限することをユーザ・エージェントに促します(規範的な要件については、3.4 APIの使用許可の確認を参照)。
この項は非規範的です。
この項は、一般的にジオロケーションAPIを利用する開発者を意味する「受信者」に適用されます。ユーザ・エージェントやこの仕様がこれらの要件を強制することは不可能ですが、開発者はこの項を注意深く読み、以下の提案に従うよう最善を尽くす必要があります。開発者は、ユーザの位置データの利用やアクセスを管理できるプライバシー保護法が、自身の管轄内に存在する可能性があることを認識する必要があります。
受信者は、���要な場合にのみ位置情報をリクエストし、与えられたタスクのためにのみ位置情報を用いるべきです。受信者は、ユーザから位置情報の保持を明確に許可されている場合を除き、そのタスクの完了時にその情報を廃棄すべきです。受信者は、この情報を不正なアクセスから保護するための措置を講じる必要もあります。位置情報を保存する場合は、ユーザがこの情報を更新・削除できるようにする必要があります。
位置情報の受信者は、ユーザの明確な許可なく位置情報を再送信しないようにする必要があります。再送信時には注意が必要であり、暗号化の利用が推奨されます。
受信者は、位置データを収集しているという事実、収集目的、データの保持期間、データの保護方法、データを共有する場合の共有方法、ユーザがデータにアクセス、更新、削除できる方法、データに関してユーザが有するその他の選択肢を明確かつ目立つように開示すべきです。この開示には、上記のガイドラインの例外に関する説明が含まれている必要があります。
この項は非規範的です。
実装者は、ユーザのプライバシーに悪影響を及ぼしうる次の点について考慮することが推奨されます。ユーザは、自分の位置をウェブサイトに開示する許可をユーザ・エージェントにうっかり与えてしまう場合があります。また、ユーザに関する限り、あるURLで提供されていたコンテンツが変更され、以前に与えられた位置に関する許可が適用されなくなる場合もあります。あるいは、単にユーザが考えを変えるかもしれません。
これらの状況を予測したり防止したりすることは本質的に困難です。緩和策や徹底的な防御策は実装の責任であり、この仕様では規定していません。しかし、実装者は、これらの対策を設計する際に、ユーザが位置情報の共有について意識できるようにし、許可の取り消しが可能なユーザ・インターフェースにアクセスできるようにすることをお勧めします。
ジオロケーションAPIは、"geolocation"
という名前で識別されるデフォルトの強力な機能です。
APIの使用許可の確認を行う際に、ユーザ・エージェン���は、「24時間」、「1週間」などの時間ベースの許可の有効期間を提案することや、その許可の付与を無期限に記憶することを選択できます(MAY)。しかし、ユーザ・エージェントは、許可の有効期間を1回のセッションに制限することを優先するようお勧めします(RECOMMENDED)。これは、例えば、領域が破棄されるまで、エンドユーザがオリジンから離れて移動するまで、または関連するブラウザのタブが閉じられるまででありえます。
ジオロケーションAPIに関連するセキュリティに関する留意点は、公開時点では存在しません。しかし、3. プライバシーに関する留意点を読まれることをお勧めします。
WebIDL[Exposed=Window]
interface Geolocation
{
undefined getCurrentPosition
(
PositionCallback
successCallback,
optional PositionErrorCallback
? errorCallback = null,
optional PositionOptions
options = {}
);
long watchPosition
(
PositionCallback
successCallback,
optional PositionErrorCallback
? errorCallback = null,
optional PositionOptions
options = {}
);
undefined clearWatch
(long watchId);
};
callback PositionCallback
= undefined (
GeolocationPosition
position
);
callback PositionErrorCallback
= undefined (
GeolocationPositionError
positionError
);
Geolocation
のインスタンスは、下記表の内部スロットを用いて作成されます。
内部スロット | 説明 |
---|---|
[[cachedPosition]] | GeolocationPosition 。ヌル(null)で初期化されます。これは、最後に取得した位置への参照であり、キャッシュとして機能します。ユーザ・エージェントは、ヌル(null)にリセットすることにより、いつでも理由を問わず、[[cachedPosition]] を削除できます(MAY)。 |
[[watchIDs]] | unsigned long 項目の空のリストとして初期化されます。 |
getCurrentPosition
(successCallback、errorCallback、 options)メソッドのステップは次の通りです。
Document
が完全にアクティブでなければ、
POSITION_UNAVAILABLE
のエラーでコールバックします。watchPosition
(successCallback、errorCallback、options)メソッドのステップは次の通りです。
Document
が完全にアクティブでなければ、
POSITION_UNAVAILABLE
を渡してエラーでコールバックします。unsigned long
とします。[[watchIDs]]
に追加します。clearWatch()
が呼び出された場合、ユーザ・エージェントは、次のことを行わなければなりません(MUST)。
[[watchIDs]]
から削除します。位置のリクエストを行うには、PositionCallback
successCallback、PositionErrorCallback?
errorCallback、PositionOptions
options、オプションのwatchIdを渡します。
[[watchIDs]]
とします。Document
とします。PERMISSION_DENIED
を渡してエラーでコールバックします。name
が"geolocation"
である新しいPermissionDescriptor
とします。PERMISSION_DENIED
を渡してエラーでコールバックします。位置の取得を行うには、PositionCallback
successCallback、PositionErrorCallback?
errorCallback、PositionOptions
options、オプションのwatchIdを渡します。
[[watchIDs]]
にwatchIdが含まれていなければ、このアルゴリズムを終了します。EpochTimeStamp
とします。timeout
の和とします。[[cachedPosition]]
とします。"geolocation"
の現在の許可状態を取得するとします。maximumAge
が0よりも大きければ、
maximumAge
メンバーの値を引いた値とします。timestamp
の値がcacheTimeより大きく、かつccachedPosition.[[isHighAccuracy]]
がoptions.enableHighAccuracy
と等しければ、positionをcachedPositionに設定します。enableHighAccuracy
の値を考慮して、基盤となるシステムからの位置データの取得を試みます。enableHighAccuracy
を渡して、positionを新しいGeolocationPosition
に設定します。[[cachedPosition]]
をpositionに設定します。errorCallbackとPERMISSION_DENIED
を渡してエラーでコールバックします。
TIMEOUT
を用いてエラーでコールバックします。POSITION_UNAVAILABLE
を渡してエラーでコールバックします。エラーでコールバックするように指示された場合、PositionErrorCallback?
callbackとunsigned short
codeを仮定すると、
code
属性がcodeに初期化された、新しく作成されたGeolocationPositionError
インスタンスとします。WebIDLdictionary PositionOptions
{
boolean enableHighAccuracy
= false;
[Clamp] unsigned long timeout
= 0xFFFFFFFF;
[Clamp] unsigned long maximumAge
= 0;
};
enableHighAccuracy
メンバーは、アプリケーションが最も正確な位置データの受信を望んでいることを示すヒントを提供します。このメンバーの目的は、アプリケーションが高精度なジオロケーションのfix解を求めないことを実装に通知できるようにすることです。したがって、実装では、大量の電力を消費するジオロケーション・プロバイダー(例えば、GPS)を避けることができます(MAY)。
timeout
メンバーは、位置の取得が期限切れになるまでの最長時間をミリ秒単位で示します。
ドキュメントが可視となるまでやAPIの使用許可を取得するまでの待機時間は、timeout
メンバーの対象期間には含まれません。timeout
メンバーは、位置の取得の開始時にのみ適用されます。
maximumAge
メンバーは、ウェブ・アプリケーションが、経過時間がミリ秒単位で指定時間以下である、キャッシュされた位置を受け入れることを示します。
WebIDL[Exposed=Window, SecureContext]
interface GeolocationPosition
{
readonly attribute GeolocationCoordinates
coords
;
readonly attribute EpochTimeStamp timestamp
;
};
coords
属性には、地理的な座標が含まれます。
timestamp
属性は、デバイスの地理的な位置を取得した時刻を表します。
GeolocationPositionError
のインスタンスは、次の表の内部スロットを用いて生成されます。
内部スロット | 説明 |
---|---|
[[isHighAccuracy]] | このGeolocationPosition が作成されたときのenableHighAccuracy メンバーの値を記録するboolean 。 |
この仕様では、次のタスク源を定義しています。
PositionCallback
とPositionErrorCallback
をキューに入れるために用います。WebIDL[Exposed=Window, SecureContext]
interface GeolocationCoordinates
{
readonly attribute double accuracy
;
readonly attribute double latitude
;
readonly attribute double longitude
;
readonly attribute double? altitude
;
readonly attribute double? altitudeAccuracy
;
readonly attribute double? heading
;
readonly attribute double? speed
;
};
latitude
とlongitude
の属性は、10進数の度数で指定される地理的な座標です。
accuracy
属性は、緯度と経度の座標の精度レベルをメートルで表します(例えば、65
メートル)。
altitude
属性は、位置の高さを示し、[WGS84]楕円体からの高さをメートルで指定します。
altitudeAccuracy
属性は、高度の精度をメートルで表します(例えば、10
メートル)。
heading
属性は、ホスティング・デバイスの移動方向を表し、真北に対して時計回りに、0° ≤ 方向 < 360°の範囲で、度数で指定します。
speed
属性は、ホスティング・デバイスの現在の速度の水平成分の大きさをメートル毎秒で表します。
新しいGeolocationPosition
は、EpochTimeStamp
timestampとブールのisHighAccuracyを用いて、次のステップを実行することで構築されます。
GeolocationCoordinates
のインスタンスとします。
latitude
属性を10進数の度数で地理座標に初期化します。longitude
属性を10進数の度数で地理座標に初期化します。accuracy
属性を負でない実数に初期化します。この値は、経度と緯度の値に対して95%の信頼度に対応しているべきです(SHOULD)。altitude
属性を[WGS84]楕円体からの高度で初期化するか、実装が高度の情報を提供できない場合はヌル(null
)にします。altitudeAccuracy
属性を負でない実数で初期化するか、実装が高度の情報を提供できない場合はヌル(null
)にします。高度の精度情報が提供される場合は、95%の信頼度に対応しているべきです(SHOULD)。speed
属性を負でない実数で初期化するか、実装が速度の情報を提供できない場合はヌル(null
)にします。heading
属性を度数で初期化するか、実装が方向の情報を提供できない場合はヌル(null
)にします。ホスティング・デバイスが静止している場合は(つまり、speed
属性の値が0)、heading
をNaN
に初期化します。coords
属性をcoordsに、timestamp
属性をtimestampに初期化し、その[[isHighAccuracy]]
内部スロットをisHighAccuracyに設定して新しく作成されたGeolocationPosition
インスタンスを返します。WebIDL[Exposed=Window]
interface GeolocationPositionError
{
const unsigned short PERMISSION_DENIED
= 1;
const unsigned short TIMEOUT
= 3;
readonly attribute unsigned short code
;
readonly attribute DOMString message
;
};
PERMISSION_DENIED
(数値1)POSITION_UNAVAILABLE
(数値2)TIMEOUT
(数値3)timeout
メンバーで指定された時間が経過した。message
属性は、code
属性を開発者が使いやすいようにテキストで記述したものです。
ジオロケーションAPIは、"geolocation"
というトークン文字列で識別されるポリシー制御の機能を定義します。そのデフォルトの許可リストは'self'
です。
非規範的と記している項と同じく、この仕様のすべての作成ガイドライン、図、例、注は、非規範的です。この仕様のその他の部分はすべて規範的です。
このドキュメント「することができる/してもよい(MAY)」、「しなければならない(MUST)」、「推奨される(RECOMMENDED)」、「すべきである/する必要がある(SHOULD)」というキーワードは、ここで示しているように、すべて大文字で表示されている場合にのみ、BCP 14[RFC2119] [RFC8174]で記述されているように解釈されるべきです。
WebIDLpartial interface Navigator {
[SameObject] readonly attribute Geolocation
geolocation
;
};
[Exposed=Window]
interface Geolocation
{
undefined getCurrentPosition
(
PositionCallback
successCallback,
optional PositionErrorCallback
? errorCallback = null,
optional PositionOptions
options = {}
);
long watchPosition
(
PositionCallback
successCallback,
optional PositionErrorCallback
? errorCallback = null,
optional PositionOptions
options = {}
);
undefined clearWatch
(long watchId);
};
callback PositionCallback
= undefined (
GeolocationPosition
position
);
callback PositionErrorCallback
= undefined (
GeolocationPositionError
positionError
);
dictionary PositionOptions
{
boolean enableHighAccuracy
= false;
[Clamp] unsigned long timeout
= 0xFFFFFFFF;
[Clamp] unsigned long maximumAge
= 0;
};
[Exposed=Window, SecureContext]
interface GeolocationPosition
{
readonly attribute GeolocationCoordinates
coords
;
readonly attribute EpochTimeStamp timestamp
;
};
[Exposed=Window, SecureContext]
interface GeolocationCoordinates
{
readonly attribute double accuracy
;
readonly attribute double latitude
;
readonly attribute double longitude
;
readonly attribute double? altitude
;
readonly attribute double? altitudeAccuracy
;
readonly attribute double? heading
;
readonly attribute double? speed
;
};
[Exposed=Window]
interface GeolocationPositionError
{
const unsigned short PERMISSION_DENIED
= 1;
const unsigned short POSITION_UNAVAILABLE
= 2;
const unsigned short TIMEOUT
= 3;
readonly attribute unsigned short code
;
readonly attribute DOMString message
;
};
accuracy
属性(GeolocationCoordinates
用) §9.1altitude
属性(GeolocationCoordinates
用) §9.2altitudeAccuracy
属性(GeolocationCoordinates
用) §9.2[[cachedPosition]]
内部スロット(Geolocation
用) §6.1clearWatch()
メソッド(Geolocation
用) §6.4code
属性(GeolocationPositionError
用) §10.2coords
属性(GeolocationPosition
用) §8.1enableHighAccuracy
member for PositionOptions
§7.1geolocation
属性(Navigator
用) §5.Geolocation
interface §6."geolocation"
§3.4GeolocationCoordinates
インターフェース §9.GeolocationPosition
インターフェース §8.GeolocationPositionError
インターフェース §10.getCurrentPosition
メソッド(Geolocation
用) §6.2heading
属性(GeolocationCoordinates
用) §9.3[[isHighAccuracy]]
internal slot for GeolocationPosition
§8.3latitude
属性(GeolocationCoordinates
用) §9.1longitude
属性(GeolocationCoordinates
用) §9.1maximumAge
メンバー(PositionOptions
用) §7.3message
属性(GeolocationPositionError
用) §10.3PERMISSION_DENIED
§10.1POSITION_UNAVAILABLE
§10.1PositionCallback
§6.PositionErrorCallback
§6.PositionOptions
辞書 §7.speed
属性(GeolocationCoordinates
用) §9.4timeout
メンバー(PositionOptions
用) §7.2TIMEOUT
§10.1timestamp
属性(GeolocationPosition
用) §8.2[[watchIDs]]
内部スロット(Geolocation
用) §6.1watchPosition
メソッド(Geolocation
用) §6.3この項は非規範的です。
この仕様は、Aza Raskin氏、Google Gears Geolocation API、LocationAware.orgによる研究など、業界における初期の取り組みを基礎としています。
Alec Berntson、Alissa Cooper、Steve Block、Greg Bolsinga、Lars Erik Bolstad、Aaron Boodman、Dave Burke、Chris Butler、Max Froumentin、Shyam Habarakada、Marcin Hanclik、Ian Hickson、Brad Lassey、Angel Machin、Cameron McCormack、Daniel Park、Stuart Parmenter、Olli Pettay、Chris Prince、Arun Ranganathan、Carl Reed、Thomas Roessler、Dirk Segers、Allan Thomson、Martin Thomson、Doug Turner、Erik Wilde、Matt Womer、Mohamed Zergaouiにも感謝申し上げます。
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先:
参照先: