如何使用 Google 地图 API 从地点获得一致的城市、州和国家/地区值?
How to get consistent City, State and Country values from Places with Google Maps API?
期望的行为
能够在从自动完成搜索框结果中选择地点后检索城市、州(地区)和国家/地区值。
实际行为
似乎每个 Place
在其 address_components
数组中可能有不同数量的值,因此无法通过数组中的位置直接引用城市、州和国家/地区。
问题
是否有既定惯例可以轻松地从 Places 获取一致的城市、州和国家/地区值?
我开始创建一个嵌套循环来检查 address_components
数组值中的 types
值,但感觉工作量太大,而且似乎 types
数组不需要是唯一的,例如 type > political
可以在 address_components
数组中出现多次。
我试过的
相关代码
<script src="https://maps.googleapis.com/maps/api/js?key=********&libraries=places"></script>
// restrict search results to the 'cities' type
// see: https://developers.google.com/places/supported_types?csw=1#table3
var options = {
types: ['(cities)']
};
// create autocomplete
const autocomplete = new google.maps.places.Autocomplete(input, options);
// do stuff when selecting a search result
autocomplete.addListener("place_changed", () => {
const place = autocomplete.getPlace();
console.log("here is the place!");
console.log(place);
});
我以为我可以获得这样的城市、州(地区)和国家/地区值:
var place_city = place.name;
var place_region = place.address_components[1].long_name;
var place_country = place.address_components[2].short_name;
但是,下面的示例表明地点可能具有 address_components
结构不同的属性:
搜索词:Townsville QLD, Australia
Returns address_components
作为 4 个值的数组 - 国家/地区作为第 4 个值包含在内:
[
{
"long_name": "Townsville",
"short_name": "Townsville",
"types": [
"colloquial_area",
"locality",
"political"
]
},
{
"long_name": "Townsville City",
"short_name": "Townsville",
"types": [
"administrative_area_level_2",
"political"
]
},
{
"long_name": "Queensland",
"short_name": "QLD",
"types": [
"administrative_area_level_1",
"political"
]
},
{
"long_name": "Australia",
"short_name": "AU",
"types": [
"country",
"political"
]
}
]
搜索词:Brisbane QLD, Australia
Returns address_components
作为 3 个值的数组 - 国家/地区作为第 3 个值包含在内:
[
{
"long_name": "Brisbane",
"short_name": "Brisbane",
"types": [
"colloquial_area",
"locality",
"political"
]
},
{
"long_name": "Queensland",
"short_name": "QLD",
"types": [
"administrative_area_level_1",
"political"
]
},
{
"long_name": "Australia",
"short_name": "AU",
"types": [
"country",
"political"
]
}
]
搜索词:Acton Park TAS, Australia
Returns address_components
作为 5 个值的数组 - 国家/地区作为第 4 个值包含在内:
[
{
"long_name": "Acton Park",
"short_name": "Acton Park",
"types": [
"locality",
"political"
]
},
{
"long_name": "Clarence City Council",
"short_name": "Clarence City",
"types": [
"administrative_area_level_2",
"political"
]
},
{
"long_name": "Tasmania",
"short_name": "TAS",
"types": [
"administrative_area_level_1",
"political"
]
},
{
"long_name": "Australia",
"short_name": "AU",
"types": [
"country",
"political"
]
},
{
"long_name": "7170",
"short_name": "7170",
"types": [
"postal_code"
]
}
]
似乎还有其他问题可以解决这个问题,正如对原始 post 的评论一样。
为了帮助其他人,熟悉这里的内容对我很有帮助:
Address types and address component types
link 不仅列出了不同的 types
,而且还解释了每个的含义。
在我的情况下,我得出了我主要对这些类型感兴趣的结论,希望是正确的:
- 地区(“城市”)
- administrative_area_level_1(“州”)
- 国家(“国家”)
我对新手友好的嵌套循环的初稿是:
var city = "";
var state = "";
var country = "";
$.each(my_place, function(index_1, value_1) {
var types = value_1.types;
$.each(types, function(index_2, value_2) {
if (value_2 === "locality") {
city = my_place[index_1]['long_name'];
} else if (value_2 === "administrative_area_level_1") {
state = my_place[index_1]['long_name'];
} else if (value_2 === "country") {
country = my_place[index_1]['short_name'];
}
});
});
console.log("city: " + city);
console.log("state: " + state);
console.log("country: " + country);
在 OP 中的每个 address_components
数组上测试它时似乎有效。
正如评论中所指出的,似乎有更复杂的解决方案 here and 。
期望的行为
能够在从自动完成搜索框结果中选择地点后检索城市、州(地区)和国家/地区值。
实际行为
似乎每个 Place
在其 address_components
数组中可能有不同数量的值,因此无法通过数组中的位置直接引用城市、州和国家/地区。
问题
是否有既定惯例可以轻松地从 Places 获取一致的城市、州和国家/地区值?
我开始创建一个嵌套循环来检查 address_components
数组值中的 types
值,但感觉工作量太大,而且似乎 types
数组不需要是唯一的,例如 type > political
可以在 address_components
数组中出现多次。
我试过的
相关代码
<script src="https://maps.googleapis.com/maps/api/js?key=********&libraries=places"></script>
// restrict search results to the 'cities' type
// see: https://developers.google.com/places/supported_types?csw=1#table3
var options = {
types: ['(cities)']
};
// create autocomplete
const autocomplete = new google.maps.places.Autocomplete(input, options);
// do stuff when selecting a search result
autocomplete.addListener("place_changed", () => {
const place = autocomplete.getPlace();
console.log("here is the place!");
console.log(place);
});
我以为我可以获得这样的城市、州(地区)和国家/地区值:
var place_city = place.name;
var place_region = place.address_components[1].long_name;
var place_country = place.address_components[2].short_name;
但是,下面的示例表明地点可能具有 address_components
结构不同的属性:
搜索词:Townsville QLD, Australia
Returns address_components
作为 4 个值的数组 - 国家/地区作为第 4 个值包含在内:
[
{
"long_name": "Townsville",
"short_name": "Townsville",
"types": [
"colloquial_area",
"locality",
"political"
]
},
{
"long_name": "Townsville City",
"short_name": "Townsville",
"types": [
"administrative_area_level_2",
"political"
]
},
{
"long_name": "Queensland",
"short_name": "QLD",
"types": [
"administrative_area_level_1",
"political"
]
},
{
"long_name": "Australia",
"short_name": "AU",
"types": [
"country",
"political"
]
}
]
搜索词:Brisbane QLD, Australia
Returns address_components
作为 3 个值的数组 - 国家/地区作为第 3 个值包含在内:
[
{
"long_name": "Brisbane",
"short_name": "Brisbane",
"types": [
"colloquial_area",
"locality",
"political"
]
},
{
"long_name": "Queensland",
"short_name": "QLD",
"types": [
"administrative_area_level_1",
"political"
]
},
{
"long_name": "Australia",
"short_name": "AU",
"types": [
"country",
"political"
]
}
]
搜索词:Acton Park TAS, Australia
Returns address_components
作为 5 个值的数组 - 国家/地区作为第 4 个值包含在内:
[
{
"long_name": "Acton Park",
"short_name": "Acton Park",
"types": [
"locality",
"political"
]
},
{
"long_name": "Clarence City Council",
"short_name": "Clarence City",
"types": [
"administrative_area_level_2",
"political"
]
},
{
"long_name": "Tasmania",
"short_name": "TAS",
"types": [
"administrative_area_level_1",
"political"
]
},
{
"long_name": "Australia",
"short_name": "AU",
"types": [
"country",
"political"
]
},
{
"long_name": "7170",
"short_name": "7170",
"types": [
"postal_code"
]
}
]
似乎还有其他问题可以解决这个问题,正如对原始 post 的评论一样。
为了帮助其他人,熟悉这里的内容对我很有帮助:
Address types and address component types
link 不仅列出了不同的 types
,而且还解释了每个的含义。
在我的情况下,我得出了我主要对这些类型感兴趣的结论,希望是正确的:
- 地区(“城市”)
- administrative_area_level_1(“州”)
- 国家(“国家”)
我对新手友好的嵌套循环的初稿是:
var city = "";
var state = "";
var country = "";
$.each(my_place, function(index_1, value_1) {
var types = value_1.types;
$.each(types, function(index_2, value_2) {
if (value_2 === "locality") {
city = my_place[index_1]['long_name'];
} else if (value_2 === "administrative_area_level_1") {
state = my_place[index_1]['long_name'];
} else if (value_2 === "country") {
country = my_place[index_1]['short_name'];
}
});
});
console.log("city: " + city);
console.log("state: " + state);
console.log("country: " + country);
在 OP 中的每个 address_components
数组上测试它时似乎有效。
正如评论中所指出的,似乎有更复杂的解决方案 here and