Googleのジオコーダーを使用して、指定された住所の緯度経度座標を検索しています。
var geocoder = new google.maps.Geocoder();
geocoder.geocode(
{
'address': address,
'region': 'uk'
}, function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
lat: results[0].geometry.location.lat(),
lng: results[0].geometry.location.lng()
});
address
変数は入力フィールドから取得されます。
場所を検索したい英国のみ。 'region': 'uk'
で十分ですが、それだけでは不十分です。 「ボストン」と入力すると、米国でボストンが見つかり、英国でボストンが見つかりました。
ジオコーダーを制限して、1つの国から、または特定の緯度経度範囲からのみ場所を返す方法は?
ありがとう
UPDATE:この答えは、もはや最善のアプローチではない可能性があります。詳細については、回答の下のコメントを参照してください。
次の例のように、 Pekkaがすでに提案したもの に加えて、', UK'
をaddress
に連結することができます。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps Geocoding only in UK Demo</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
</head>
<body>
<div id="map" style="width: 400px; height: 300px"></div>
<script type="text/javascript">
var mapOptions = {
mapTypeId: google.maps.MapTypeId.TERRAIN,
center: new google.maps.LatLng(54.00, -3.00),
zoom: 5
};
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
var geocoder = new google.maps.Geocoder();
var address = 'Boston';
geocoder.geocode({
'address': address + ', UK'
},
function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
new google.maps.Marker({
position:results[0].geometry.location,
map: map
});
}
});
</script>
</body>
</html>
スクリーンショット:
これは非常に信頼できると思います。一方、次の例は、region
パラメータもbounds
パラメータも、この場合には効果がないことを示しています。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps Geocoding only in UK Demo with Bounds</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
</head>
<body>
<div id="map" style="width: 500px; height: 300px"></div>
<script type="text/javascript">
var mapOptions = {
mapTypeId: google.maps.MapTypeId.TERRAIN,
center: new google.maps.LatLng(50.00, -33.00),
zoom: 3
};
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
var geocoder = new google.maps.Geocoder();
// Define north-east and south-west points of UK
var ne = new google.maps.LatLng(60.00, 3.00);
var sw = new google.maps.LatLng(49.00, -13.00);
// Define bounding box for drawing
var boundingBoxPoints = [
ne, new google.maps.LatLng(ne.lat(), sw.lng()),
sw, new google.maps.LatLng(sw.lat(), ne.lng()), ne
];
// Draw bounding box on map
new google.maps.Polyline({
path: boundingBoxPoints,
strokeColor: '#FF0000',
strokeOpacity: 1.0,
strokeWeight: 2,
map: map
});
// Geocode and place marker on map
geocoder.geocode({
'address': 'Boston',
'region': 'uk',
'bounds': new google.maps.LatLngBounds(sw, ne)
},
function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
new google.maps.Marker({
position:results[0].geometry.location,
map: map
});
}
});
</script>
</body>
</html>
次のコードは、住所を変更する必要なく、英国で最初に一致する住所を取得します。
var geocoder = new google.maps.Geocoder();
geocoder.geocode(
{
'address': address,
'region': 'uk'
}, function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
for (var i=0; i<results.length; i++) {
for (var j=0; j<results[i].address_components.length; j++) {
if ($.inArray("country", results[i].address_components[j].types) >= 0) {
if (results[i].address_components[j].short_name == "GB") {
return_address = results[i].formatted_address;
return_lat = results[i].geometry.location.lat();
return_lng = results[i].geometry.location.lng();
...
return;
}
}
}
}
});
componentRestrictions 属性を使用します。
geocoder.geocode({'address': request.term, componentRestrictions: {country: 'GB'}}
これを行う正しい方法は、 componentRestrictions を提供することです
例えば:
var request = {
address: address,
componentRestrictions: {
country: 'UK'
}
}
geocoder.geocode(request, function(results, status){
//...
});
docs によると、リージョンパラメータはbiasのみを設定しているようです(そのリージョンに対する実際の制限ではなく)。 APIが英国の場所で正確な住所を見つけられない場合、入力した地域に関係なく検索が拡張されると思います。
address(地域に加えて)で国コードを指定することで、以前はかなりうまくいきました。しかし、異なる国で同じ地名を使った経験はまだありません。それでも、一撃の価値はあります。試す
'address': '78 Austin Street, Boston, UK'
no address(US Bostonの代わり)を返し、そして
'address': '78 Main Street, Boston, UK'
それは実際にメインストリートを持っているので、英国でボストンを返すべきです。
更新:
ジオコーダーを制限して、1つの国から、または特定の緯度経度範囲からのみ場所を返す方法は?
bounds
パラメータを設定できます。 こちら を参照
もちろん、そのために英国サイズの長方形を計算する必要があります。
"、UK"の配置、リージョンの英国への設定、境界の設定で問題が見つかりました。ただし、ALL THREEを実行すると、問題が解決するようです。これがスニペットです:-
var sw = new google.maps.LatLng(50.064192, -9.711914)
var ne = new google.maps.LatLng(61.015725, 3.691406)
var viewport = new google.maps.LatLngBounds(sw, ne);
geocoder.geocode({ 'address': postcode + ', UK', 'region': 'UK', "bounds": viewport }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
.....etc.....
私は次のことを試しました:
geocoder.geocode( {'address':request.term + ', USA'}
そして、それは私のために特定の地域(米国の国)のために働いています。
結果は変化する可能性があり、地域が機能していないように見えるため、これをフィルターするのはかなり簡単であることが常にわかりました。
response( $.map( results, function( item ) {
if (item.formatted_address.indexOf("GB") != -1) {
return {
latitude: item.geometry.location.lat(),
longitude: item.geometry.location.lng()
}
}
}
私は ハイブリッドアプローチ。
それでも十分な結果が得られない場合は、より広く検索します(必要に応じてバイアスを再導入します)。
function MyGeocoder(address,region)
{
geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address, 'componentRestrictions': { 'country': region } }, function (r, s) {
if (r.length < 10) geocoder.geocode({ 'address': address /* could also bias here */ }, function (r2, s2) {
for (var j = 0; j < r2.length; j++) r.Push(r2[j]);
DoSomethingWithResults(r);
});
else DoSomethingWithResults(r);
});
}
function DoSomethingWithResults(r)
{
// Remove Duplicates
var d = {};
r = r.filter(function (e) { var h = e.formatted_address.valueOf(); var isDup = d[h]; d[h] = true; return !isDup; });
// Do something with results
}
</ code>
イギリス全土にボーダーを作成し、緯度と経度が範囲内にあるかどうかを確認します。3kアドレスの場合、米国には約10から最大20のアドレスがあります。それらを無視するだけです(私の場合はそうすることができます) )自動ズームを使用して静的マップ上にマルチマーカーを作成するためにlatとlngを使用しています。私のソリューションを共有します。これは誰かの助けになるかもしれません。また、私のケースの異なるソリューションを聞いてうれしいです。
private static string ReturnLatandLng(string GeocodeApiKey, string address)
{
string latlng = "";
Geocoder geocoder = new Geocoder(GeocodeApiKey);
var locations = geocoder.Geocode(address);
foreach (var item in locations)
{
double longitude = item.LatLng.Longitude;
double latitude = item.LatLng.Latitude;
double borderSouthLatitude = 49.895878;
double borderNorthLatitude = 62.000000;
double borderWestLongitude = -8.207676;
double borderEastLongitude = 2.000000;
//Check If Geocoded Address is inside of the UK
if (( (borderWestLongitude < longitude) && (longitude < borderEastLongitude) ) && ( (borderSouthLatitude < latitude) && (latitude < borderNorthLatitude) ) )
{
latlng = item.LatLng.ToString();
}
else
{
latlng = "";
Console.WriteLine("GEOCODED ADDRESS IS NOT LOCATED IN UK ADDRESSES LIST. DELETING MARKER FROM MAP.....");
}
}
return latlng;
}
多くのあいまいなクエリについては、どこを見ればよいかを伝えようとしても、米国が常にGoogleで優先されます。応答を見て、出力国= USの場合はおそらく無視できますか?
それが私がしばらく前にGoogle Geocoderの使用をやめ、2年前に自分自身の作成を始めた主な理由です。
https://geocode.xyz/Boston,%20UK は常に英国の場所を返します。 region = UK: https://geocode.xyz/Boston,%20UK?region=UK を追加することで、さらに確実にすることができます。