Google地图API:如何管理地理编码结果中的不同"address_components"?
Google Map API: How to manage different "address_components" in gecoding results?
考虑下面 JSON 对 google 地图地理编码响应的响应。
它由一个包含五个元素的 address_components
数组组成。
通常开发人员使用它的第一项(索引为 0 的项)来查找地址元素,例如 ac route
和 locality
和 formatted address
。但这不是最好的选择。例如,在这种情况下,第二项是比其他项更具描述性的地址。有时在同一个响应中有不同地区的相同地址。
我如何选择更好的(例如 Google Map API in android selects 可用项目之一,但它并不总是索引为 0 的项目,但它 select 在备选方案中,我想知道它将如何做到这一点和 select 最匹配)?
此外,我想遍历不同 address_components
的所有元素以提取和汇集更精细的信息,但问题是相同类型的元素的信息,如 locality
具有不同的信息在不同的 address_components
中,当从不同的 address_component
项收集信息元素时,会导致地址不一致。
例如,在下面的示例中,我们在不同的 locality
元素中有两个值 شهر جدید اندیشه
和 Karaj
,它们是两个不同的城市标签(在同一街区)。
{
"results" : [
{
"address_components" : [
{
"long_name" : "Unnamed Road",
"short_name" : "Unnamed Road",
"types" : [ "route" ]
},
{
"long_name" : "Karaj",
"short_name" : "Karaj",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Shahriar County",
"short_name" : "Shahriar County",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Tehran Province",
"short_name" : "Tehran Province",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "Tehran Province, Karaj, Unnamed Road, ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7221382,
"lng" : 51.0148178
},
"southwest" : {
"lat" : 35.716435,
"lng" : 51.0095103
}
},
"location" : {
"lat" : 35.719286,
"lng" : 51.012165
},
"location_type" : "GEOMETRIC_CENTER",
"viewport" : {
"northeast" : {
"lat" : 35.7221382,
"lng" : 51.0148178
},
"southwest" : {
"lat" : 35.716435,
"lng" : 51.0095103
}
}
},
"place_id" : "ChIJmf7_zEyTjT8RkM8-nK6dTm0",
"types" : [ "route" ]
},
{
"address_components" : [
{
"long_name" : "فاز ۶ شهر جدید اندیشه",
"short_name" : "فاز ۶ شهر جدید اندیشه",
"types" : [ "political", "sublocality", "sublocality_level_1" ]
},
{
"long_name" : "شهر جدید اندیشه",
"short_name" : "شهر جدید اندیشه",
"types" : [ "locality", "political" ]
},
{
"long_name" : "شهرستان شهریار",
"short_name" : "شهرستان شهریار",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "فاز ۶ شهر جدید اندیشه، شهر جدید اندیشه، استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7389537,
"lng" : 51.0349971
},
"southwest" : {
"lat" : 35.7039031,
"lng" : 51.0044146
}
},
"location" : {
"lat" : 35.7210753,
"lng" : 51.014934
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 35.7389537,
"lng" : 51.0349971
},
"southwest" : {
"lat" : 35.7039031,
"lng" : 51.0044146
}
}
},
"place_id" : "ChIJiYlwJLHsjT8RruE39U9NMoQ",
"types" : [ "political", "sublocality", "sublocality_level_1" ]
},
{
"address_components" : [
{
"long_name" : "شهر جدید اندیشه",
"short_name" : "شهر جدید اندیشه",
"types" : [ "locality", "political" ]
},
{
"long_name" : "شهرستان شهریار",
"short_name" : "شهرستان شهریار",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "شهر جدید اندیشه، استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7388144,
"lng" : 51.04460479999999
},
"southwest" : {
"lat" : 35.6838973,
"lng" : 50.9894371
}
},
"location" : {
"lat" : 35.7078282,
"lng" : 51.0227587
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 35.7388144,
"lng" : 51.04460479999999
},
"southwest" : {
"lat" : 35.6838973,
"lng" : 50.9894371
}
}
},
"place_id" : "ChIJIQwwRcnsjT8RnTJfLJ3QUAg",
"types" : [ "locality", "political" ]
},
{
"address_components" : [
{
"long_name" : "شهرستان شهریار",
"short_name" : "شهرستان شهریار",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "شهرستان شهریار، استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7389885,
"lng" : 51.23044970000001
},
"southwest" : {
"lat" : 35.5333437,
"lng" : 50.8859253
}
},
"location" : {
"lat" : 35.6096201,
"lng" : 51.03319330000001
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 35.7389885,
"lng" : 51.23044970000001
},
"southwest" : {
"lat" : 35.5333437,
"lng" : 50.8859253
}
}
},
"place_id" : "ChIJQ6KQjY7xjT8RoYD9gJh8_CY",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"address_components" : [
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 36.07789210000001,
"lng" : 53.216228
},
"southwest" : {
"lat" : 34.909543,
"lng" : 50.3186971
}
},
"location" : {
"lat" : 35.7248416,
"lng" : 51.381653
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 36.07789210000001,
"lng" : 53.216228
},
"southwest" : {
"lat" : 34.909543,
"lng" : 50.3186971
}
}
},
"place_id" : "ChIJf5Us9YQBjj8R0OohvHQms1U",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"address_components" : [
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 39.782056,
"lng" : 63.3333366
},
"southwest" : {
"lat" : 24.8066999,
"lng" : 44.0326949
}
},
"location" : {
"lat" : 32.427908,
"lng" : 53.688046
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 39.782056,
"lng" : 63.3333366
},
"southwest" : {
"lat" : 24.8066999,
"lng" : 44.0326949
}
}
},
"place_id" : "ChIJ8R1rwS7s9z4RzvpRntOVsEA",
"types" : [ "country", "political" ]
}
],
"status" : "OK"
}
一个问题好像是两个不同的问题,所以范围有点广。我会尽力解答你的疑惑。
首先,您正在使用反向地理编码请求将坐标 35.7163931455472,51.01335000246763 解析为街道地址。请注意,reverse geocoding 旨在将给定坐标解析为最近的可用地址。除了街道地址之外,该服务还将建议不同类型的结果:路线、次地区、地区、行政区域、国家/地区。
有时,如果给定点附近没有街道地址(距离该点约 50 米以内),则街道地址类型的结果不会出现在响应中。在您的示例中,街道地址类型的结果不可用,因此响应包含从路线级别开始的不同类型的结果。看看我的屏幕截图,它代表了您回复中的前三项。
如您所见,第一项具有类型路线,第二项具有类型子区域,第三项具有类型区域。
很难说选择地址的 "best" 标准是什么。你可以看到路线项是最近的,但不幸的是这条路没有命名,所以你把它定性为不够好。从技术上讲,这是最接近的项目,因此服务假定这是最佳匹配。我建议检查结果的类型,如果项目 0 的类型 street_address 应该足够好,如果项目 0 有类型路线,检查道路是否有名称,如果这是未命名的道路检查可能更详细的项目1。
无论如何,未命名的道路是数据问题,您可以通过帮助中心向 Google 数据团队报告:
https://support.google.com/maps/answer/3094088
其次,如果我没理解错的话,您注意到项目 0 和项目 1 具有不同的位置地址组件值,尽管它们(我屏幕截图中的标记 1 和标记 2)似乎都属于 Andisheh 新城。该路线(地点 ID ChIJmf7_zEyTjT8RkM8-nK6dTm0)被报告为 Karaj 地区的一部分。我可以在 Google 地图上看到 Karaj 的边界,如下面的屏幕截图
我可以看到安迪舍新城的边界,如下图所示
请注意,您回复的路线显然位于 Andisheh New Town 多边形内,因此目前看来我们也面临着数据问题。地点 ID ChIJmf7_zEyTjT8RkM8-nK6dTm0 应该包含 Andisheh New Town 的地区成分,而不是 Karaj。
随时使用此页面向 Google 发送反馈:
如果您想玩反向地理编码,请使用地理编码器工具:
https://google-developers.appspot.com/maps/documentation/utils/geocoder/#q%3D35.716393%252C51.01335
希望我的回答能解开你的疑惑!
考虑下面 JSON 对 google 地图地理编码响应的响应。
它由一个包含五个元素的 address_components
数组组成。
通常开发人员使用它的第一项(索引为 0 的项)来查找地址元素,例如 ac route
和 locality
和 formatted address
。但这不是最好的选择。例如,在这种情况下,第二项是比其他项更具描述性的地址。有时在同一个响应中有不同地区的相同地址。
我如何选择更好的(例如 Google Map API in android selects 可用项目之一,但它并不总是索引为 0 的项目,但它 select 在备选方案中,我想知道它将如何做到这一点和 select 最匹配)?
此外,我想遍历不同 address_components
的所有元素以提取和汇集更精细的信息,但问题是相同类型的元素的信息,如 locality
具有不同的信息在不同的 address_components
中,当从不同的 address_component
项收集信息元素时,会导致地址不一致。
例如,在下面的示例中,我们在不同的 locality
元素中有两个值 شهر جدید اندیشه
和 Karaj
,它们是两个不同的城市标签(在同一街区)。
{
"results" : [
{
"address_components" : [
{
"long_name" : "Unnamed Road",
"short_name" : "Unnamed Road",
"types" : [ "route" ]
},
{
"long_name" : "Karaj",
"short_name" : "Karaj",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Shahriar County",
"short_name" : "Shahriar County",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Tehran Province",
"short_name" : "Tehran Province",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "Tehran Province, Karaj, Unnamed Road, ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7221382,
"lng" : 51.0148178
},
"southwest" : {
"lat" : 35.716435,
"lng" : 51.0095103
}
},
"location" : {
"lat" : 35.719286,
"lng" : 51.012165
},
"location_type" : "GEOMETRIC_CENTER",
"viewport" : {
"northeast" : {
"lat" : 35.7221382,
"lng" : 51.0148178
},
"southwest" : {
"lat" : 35.716435,
"lng" : 51.0095103
}
}
},
"place_id" : "ChIJmf7_zEyTjT8RkM8-nK6dTm0",
"types" : [ "route" ]
},
{
"address_components" : [
{
"long_name" : "فاز ۶ شهر جدید اندیشه",
"short_name" : "فاز ۶ شهر جدید اندیشه",
"types" : [ "political", "sublocality", "sublocality_level_1" ]
},
{
"long_name" : "شهر جدید اندیشه",
"short_name" : "شهر جدید اندیشه",
"types" : [ "locality", "political" ]
},
{
"long_name" : "شهرستان شهریار",
"short_name" : "شهرستان شهریار",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "فاز ۶ شهر جدید اندیشه، شهر جدید اندیشه، استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7389537,
"lng" : 51.0349971
},
"southwest" : {
"lat" : 35.7039031,
"lng" : 51.0044146
}
},
"location" : {
"lat" : 35.7210753,
"lng" : 51.014934
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 35.7389537,
"lng" : 51.0349971
},
"southwest" : {
"lat" : 35.7039031,
"lng" : 51.0044146
}
}
},
"place_id" : "ChIJiYlwJLHsjT8RruE39U9NMoQ",
"types" : [ "political", "sublocality", "sublocality_level_1" ]
},
{
"address_components" : [
{
"long_name" : "شهر جدید اندیشه",
"short_name" : "شهر جدید اندیشه",
"types" : [ "locality", "political" ]
},
{
"long_name" : "شهرستان شهریار",
"short_name" : "شهرستان شهریار",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "شهر جدید اندیشه، استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7388144,
"lng" : 51.04460479999999
},
"southwest" : {
"lat" : 35.6838973,
"lng" : 50.9894371
}
},
"location" : {
"lat" : 35.7078282,
"lng" : 51.0227587
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 35.7388144,
"lng" : 51.04460479999999
},
"southwest" : {
"lat" : 35.6838973,
"lng" : 50.9894371
}
}
},
"place_id" : "ChIJIQwwRcnsjT8RnTJfLJ3QUAg",
"types" : [ "locality", "political" ]
},
{
"address_components" : [
{
"long_name" : "شهرستان شهریار",
"short_name" : "شهرستان شهریار",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "شهرستان شهریار، استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 35.7389885,
"lng" : 51.23044970000001
},
"southwest" : {
"lat" : 35.5333437,
"lng" : 50.8859253
}
},
"location" : {
"lat" : 35.6096201,
"lng" : 51.03319330000001
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 35.7389885,
"lng" : 51.23044970000001
},
"southwest" : {
"lat" : 35.5333437,
"lng" : 50.8859253
}
}
},
"place_id" : "ChIJQ6KQjY7xjT8RoYD9gJh8_CY",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"address_components" : [
{
"long_name" : "استان تهران",
"short_name" : "استان تهران",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "استان تهران، ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 36.07789210000001,
"lng" : 53.216228
},
"southwest" : {
"lat" : 34.909543,
"lng" : 50.3186971
}
},
"location" : {
"lat" : 35.7248416,
"lng" : 51.381653
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 36.07789210000001,
"lng" : 53.216228
},
"southwest" : {
"lat" : 34.909543,
"lng" : 50.3186971
}
}
},
"place_id" : "ChIJf5Us9YQBjj8R0OohvHQms1U",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"address_components" : [
{
"long_name" : "ایران",
"short_name" : "IR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "ایران",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 39.782056,
"lng" : 63.3333366
},
"southwest" : {
"lat" : 24.8066999,
"lng" : 44.0326949
}
},
"location" : {
"lat" : 32.427908,
"lng" : 53.688046
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 39.782056,
"lng" : 63.3333366
},
"southwest" : {
"lat" : 24.8066999,
"lng" : 44.0326949
}
}
},
"place_id" : "ChIJ8R1rwS7s9z4RzvpRntOVsEA",
"types" : [ "country", "political" ]
}
],
"status" : "OK"
}
一个问题好像是两个不同的问题,所以范围有点广。我会尽力解答你的疑惑。
首先,您正在使用反向地理编码请求将坐标 35.7163931455472,51.01335000246763 解析为街道地址。请注意,reverse geocoding 旨在将给定坐标解析为最近的可用地址。除了街道地址之外,该服务还将建议不同类型的结果:路线、次地区、地区、行政区域、国家/地区。 有时,如果给定点附近没有街道地址(距离该点约 50 米以内),则街道地址类型的结果不会出现在响应中。在您的示例中,街道地址类型的结果不可用,因此响应包含从路线级别开始的不同类型的结果。看看我的屏幕截图,它代表了您回复中的前三项。
如您所见,第一项具有类型路线,第二项具有类型子区域,第三项具有类型区域。
很难说选择地址的 "best" 标准是什么。你可以看到路线项是最近的,但不幸的是这条路没有命名,所以你把它定性为不够好。从技术上讲,这是最接近的项目,因此服务假定这是最佳匹配。我建议检查结果的类型,如果项目 0 的类型 street_address 应该足够好,如果项目 0 有类型路线,检查道路是否有名称,如果这是未命名的道路检查可能更详细的项目1。
无论如何,未命名的道路是数据问题,您可以通过帮助中心向 Google 数据团队报告:
https://support.google.com/maps/answer/3094088
其次,如果我没理解错的话,您注意到项目 0 和项目 1 具有不同的位置地址组件值,尽管它们(我屏幕截图中的标记 1 和标记 2)似乎都属于 Andisheh 新城。该路线(地点 ID ChIJmf7_zEyTjT8RkM8-nK6dTm0)被报告为 Karaj 地区的一部分。我可以在 Google 地图上看到 Karaj 的边界,如下面的屏幕截图
我可以看到安迪舍新城的边界,如下图所示
请注意,您回复的路线显然位于 Andisheh New Town 多边形内,因此目前看来我们也面临着数据问题。地点 ID ChIJmf7_zEyTjT8RkM8-nK6dTm0 应该包含 Andisheh New Town 的地区成分,而不是 Karaj。
随时使用此页面向 Google 发送反馈:
如果您想玩反向地理编码,请使用地理编码器工具:
https://google-developers.appspot.com/maps/documentation/utils/geocoder/#q%3D35.716393%252C51.01335
希望我的回答能解开你的疑惑!