Google Maps API に問題があります。特定の場所の LatLong を (たとえば、都市の名前から) 決定し、その場所にマップの焦点を合わせたいと考えています。LatLong 部分は機能しており、その点を地図の中心にしています。ただし、その単一のポイントしかない場合に適切なズームレベルを判断する方法がわかりません。たとえば、ユーザーが「アムステルダム」ではなく「ロシア」と入力するとどうなるでしょうか? いくつかの助けをいただければ幸いです:)
7 に答える
Google IO でこの質問をしたところです。この機能は存在しますが、文書化されておらず、アクセサーもまだありません。あなたがしたいことは、構造化されたアドレスを取得することです。返された json 構造を調べて、これらの新しいパラメーターを探します。これを試す機会があれば、より多くの情報を投稿します。
質問に入力パラメータがありません。LatLonポイントと言っていますが、実際には、使用可能なマップウィンドウサイズのフォーカスを行うためにLatLonBoundsが必要です。公式のGoogleマップの動作を模倣したいと思います。ジオコーディングに加えて、GmapAPIがアクセスできない他のデータに依存しています。だからあなたはあなた自身を提供しなければなりません。
次の呼び出しは、適切な長方形の境界オブジェクトを提供できる場合、ズーム レベルを示します。
GMap2.getBoundsZoomLevel(bounds)
しかし、境界を計算する方法は?
マップを使用して「目で」決定した四角形で各ソース レコードに手動で注釈を付け、誰かに値を入力してもらうことができます。
理想的にはデータが必要ですが、幸いなことに、DBPedia には大量のデータが散らばっています。
私の幾何学と代数は少しさびていますが、両方を少し使えば、表示したい場所の面積から長方形を計算できると確信しています。(正方形の都市を想定する場合は平方根から始めるか、円形の都市を想定する場合はπr 2を再配置します)
このクエリを試して、領域の領域を抽出してください。
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia2: <http://dbpedia.org/property/>
SELECT ?url, ?label, ?lat, ?long, ?area WHERE {
?url geo:lat ?lat .
?url geo:lat ?long .
?url rdfs:label ?label . FILTER ( lang(?label) = 'en' ) .
?url dbpedia2:area ?area . FILTER ( datatype(?area) = xsd:double )
} LIMIT 10
DBPedia は数百万の非構造化データ (RDF データ) のトリプルを検索しているため、結果をキャッシュするか、より高速なローカル データソースにロードする必要があります。タイトル、インフォボックス、および座標データ セットを DBPedia からダウンロードして、Jena などにロードできます。読み込み中はすべての検証オプションをオフにすることを忘れないでください:-)
また、かなり使いやすい Web フォームを備えたRESTful APIを使用してこのデータにアクセスすることもできます。また、Firefox のダウンロード ウィンドウの [ダウンロード リンクのコピー] ボタンを使用するか、出力形式を HTML に設定して、生成された URL をプルすることができます。XML とJSONも生成します。
ぐらついた形の都市のマージンを追加することを忘れないでください...
同じ質問があり、Nick Retallack の回答が役に立ちました。詳細を説明すると、文書化されていないプロパティの名前は「ExtendedData」であり、その中には、適切なズーム レベルの北、南、東、西の境界を含む「LatLonBox」があります。
たとえば、「90210」を検索すると、出力は次のようになります (読みやすいように書式設定しています)。
{
"id":"p1",
"address":"Beverly Hills, CA 90210, USA",
"AddressDetails":{
"Accuracy":5,
"Country":{
"AdministrativeArea":{
"AdministrativeAreaName":"CA",
"SubAdministrativeArea":{
"Locality":{
"LocalityName":"Beverly Hills",
"PostalCode":{"PostalCodeNumber":"90210"}
},
"SubAdministrativeAreaName":"Los Angeles"
}
},
"CountryName":"USA",
"CountryNameCode":"US"
}
},
// This is what you're looking for "ExtendedData":{ "LatLonBox":{ "north":34.13919, "south":34.067018, "east":-118.38971, "west":-118.442796 } },
"Point":{
"coordinates":[-118.4104684,34.1030032,0]
}
}
ただし、これは文書化されていないため、API の変更後も存続するかどうかはわかりません。常にそこにあると想定せず、合理的なデフォルトのズーム値を定義してください。
ここでは、Objective-CにNickRetallackのソリューションのバージョンを実装しました。
Googleマップの同等のObjective-CコードGMap2.getBoundsZoomLevel(bounds)?
Geocoder から位置情報を取得していますか? そうである場合は、ポイントの精度を把握し、それに基づいてズームできます (精度が高い = ズームが高い)。