反向地理编码:如何获得准确的位置

Reverse Geocoding: How to get exact locality

我正在尝试在服务器端使用经度和纬度获取位置。

https://maps.googleapis.com/maps/api/geocode/json?latlng=28.520506,77.20151&key=AIzaSyCmh3btBq1PK-gx98R_akhab9xzRFjfAzc

它给出如下响应:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Mehrauli - Badarpur Road",
               "short_name" : "Mehrauli - Badarpur Rd",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Block A",
               "short_name" : "Block A",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "DDA Flats",
               "short_name" : "DDA Flats",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Saket",
               "short_name" : "Saket",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "South Delhi",
               "short_name" : "South Delhi",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "110044",
               "short_name" : "110044",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Mehrauli - Badarpur Road, Block A, DDA Flats, Saket, New Delhi, Delhi 110044, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.5207757,
                  "lng" : 77.20210809999999
               },
               "southwest" : {
                  "lat" : 28.5206053,
                  "lng" : 77.2013937
               }
            },
            "location" : {
               "lat" : 28.5206905,
               "lng" : 77.20175089999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.5220394802915,
                  "lng" : 77.2030998802915
               },
               "southwest" : {
                  "lat" : 28.5193415197085,
                  "lng" : 77.2004019197085
               }
            }
         },
         "place_id" : "ChIJBVdwbfvhDDkRPQndknfs_uY",
         "types" : [ "route" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Saket",
               "short_name" : "Saket Metro Station",
               "types" : [ "subway_station", "train_station", "transit_station", "establishment" ]
            },
            {
               "long_name" : "Mehrauli - Badarpur Road",
               "short_name" : "Mehrauli - Badarpur Rd",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Saiyad ul Ajaib",
               "short_name" : "Saiyad ul Ajaib",
               "types" : [ "neighborhood", "political" ]
            },
            {
               "long_name" : "Saiyad Ul Ajaib Village",
               "short_name" : "Saiyad Ul Ajaib Village",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Saket",
               "short_name" : "Saket",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "South Delhi",
               "short_name" : "South Delhi",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "110030",
               "short_name" : "110030",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Saket, Mehrauli - Badarpur Road, Saiyad ul Ajaib, Saiyad Ul Ajaib Village, Saket, New Delhi, Delhi 110030, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.5205491,
                  "lng" : 77.20161709999999
               },
               "southwest" : {
                  "lat" : 28.5204151,
                  "lng" : 77.20142389999999
               }
            },
            "location" : {
               "lat" : 28.5205063,
               "lng" : 77.2015098
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.5218310802915,
                  "lng" : 77.20286948029151
               },
               "southwest" : {
                  "lat" : 28.5191331197085,
                  "lng" : 77.20017151970849
               }
            }
         },
         "place_id" : "ChIJtRwRbfvhDDkRNdb4NK6iicg",
         "types" : [ "subway_station", "train_station", "transit_station", "establishment" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Saket Metro Station",
               "short_name" : "Saket Metro Station",
               "types" : [ "point_of_interest", "establishment" ]
            },
            {
               "long_name" : "Mehrauli - Badarpur Road",
               "short_name" : "Mehrauli - Badarpur Rd",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Saiyad ul Ajaib",
               "short_name" : "Saiyad ul Ajaib",
               "types" : [ "neighborhood", "political" ]
            },
            {
               "long_name" : "Saiyad Ul Ajaib Village",
               "short_name" : "Saiyad Ul Ajaib Village",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Sainik Farm",
               "short_name" : "Sainik Farm",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "South Delhi",
               "short_name" : "South Delhi",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "110017",
               "short_name" : "110017",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Saket Metro Station, Mehrauli - Badarpur Road, Saiyad ul Ajaib, Saiyad Ul Ajaib Village, Sainik Farm, New Delhi, Delhi 110017, India",
         "geometry" : {
            "location" : {
               "lat" : 28.520528,
               "lng" : 77.201505
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.5218769802915,
                  "lng" : 77.20285398029151
               },
               "southwest" : {
                  "lat" : 28.5191790197085,
                  "lng" : 77.2001560197085
               }
            }
         },
         "place_id" : "ChIJBzy8HfvhDDkRa124f53C6hI",
         "types" : [ "transit_station", "point_of_interest", "establishment" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Saiyad Ul Ajaib Village",
               "short_name" : "Saiyad Ul Ajaib Village",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Sainik Farm",
               "short_name" : "Sainik Farm",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "South Delhi",
               "short_name" : "South Delhi",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Saiyad Ul Ajaib Village, Sainik Farm, New Delhi, Delhi, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.5208191,
                  "lng" : 77.20672110000001
               },
               "southwest" : {
                  "lat" : 28.5159519,
                  "lng" : 77.1994859
               }
            },
            "location" : {
               "lat" : 28.5194062,
               "lng" : 77.2024306
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.5208191,
                  "lng" : 77.20672110000001
               },
               "southwest" : {
                  "lat" : 28.5159519,
                  "lng" : 77.1994859
               }
            }
         },
         "place_id" : "ChIJu3kI1uThDDkR7iU8hablnbU",
         "types" : [ "sublocality_level_2", "sublocality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Saiyad ul Ajaib",
               "short_name" : "Saiyad ul Ajaib",
               "types" : [ "neighborhood", "political" ]
            },
            {
               "long_name" : "Block E",
               "short_name" : "Block E",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "Saiyad Ul Ajaib Village",
               "short_name" : "Saiyad Ul Ajaib Village",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Sainik Farm",
               "short_name" : "Sainik Farm",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "South Delhi",
               "short_name" : "South Delhi",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Saiyad ul Ajaib, Block E, Saiyad Ul Ajaib Village, Sainik Farm, New Delhi, Delhi, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.520712,
                  "lng" : 77.2065688
               },
               "southwest" : {
                  "lat" : 28.5112375,
                  "lng" : 77.18968389999999
               }
            },
            "location" : {
               "lat" : 28.517186,
               "lng" : 77.20171189999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.520712,
                  "lng" : 77.2065688
               },
               "southwest" : {
                  "lat" : 28.5112375,
                  "lng" : 77.18968389999999
               }
            }
         },
         "place_id" : "ChIJnTMcyuThDDkRTUiS4Zu2qW4",
         "types" : [ "neighborhood", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Sainik Farm",
               "short_name" : "Sainik Farm",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "South Delhi",
               "short_name" : "South Delhi",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Sainik Farm, New Delhi, Delhi, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.5234901,
                  "lng" : 77.22944389999999
               },
               "southwest" : {
                  "lat" : 28.485256,
                  "lng" : 77.18350099999999
               }
            },
            "location" : {
               "lat" : 28.5068824,
               "lng" : 77.211229
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.5234901,
                  "lng" : 77.22944389999999
               },
               "southwest" : {
                  "lat" : 28.485256,
                  "lng" : 77.18350099999999
               }
            }
         },
         "place_id" : "ChIJZ2itOb_hDDkRTq6aivCYp_Q",
         "types" : [ "sublocality_level_1", "sublocality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "New Delhi, Delhi, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.889816,
                  "lng" : 77.3418147
               },
               "southwest" : {
                  "lat" : 28.4010669,
                  "lng" : 76.8396999
               }
            },
            "location" : {
               "lat" : 28.6139391,
               "lng" : 77.2090212
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.889816,
                  "lng" : 77.3418147
               },
               "southwest" : {
                  "lat" : 28.4010669,
                  "lng" : 76.8396999
               }
            }
         },
         "place_id" : "ChIJLbZ-NFv9DDkRzk0gTkm3wlI",
         "types" : [ "locality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "110030",
               "short_name" : "110030",
               "types" : [ "postal_code" ]
            },
            {
               "long_name" : "New Delhi",
               "short_name" : "New Delhi",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "New Delhi, Delhi 110030, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.5347099,
                  "lng" : 77.20646719999999
               },
               "southwest" : {
                  "lat" : 28.4761952,
                  "lng" : 77.1228993
               }
            },
            "location" : {
               "lat" : 28.4956835,
               "lng" : 77.1664945
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.5347099,
                  "lng" : 77.20646719999999
               },
               "southwest" : {
                  "lat" : 28.4761952,
                  "lng" : 77.1228993
               }
            }
         },
         "place_id" : "ChIJYaOVHDceDTkRyvLz3dSSVIk",
         "types" : [ "postal_code" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "South Delhi",
               "short_name" : "South Delhi",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "South Delhi, Delhi, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.6118999,
                  "lng" : 77.34496009999999
               },
               "southwest" : {
                  "lat" : 28.4041,
                  "lng" : 77.11156
               }
            },
            "location" : {
               "lat" : 28.5086497,
               "lng" : 77.2175223
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.6118999,
                  "lng" : 77.34496009999999
               },
               "southwest" : {
                  "lat" : 28.4041,
                  "lng" : 77.11156
               }
            }
         },
         "place_id" : "ChIJqX7ja73hDDkRRA9T2LXUAJg",
         "types" : [ "administrative_area_level_2", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Delhi",
               "short_name" : "DL",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Delhi, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 28.881338,
                  "lng" : 77.34845780000001
               },
               "southwest" : {
                  "lat" : 28.412593,
                  "lng" : 76.83806899999999
               }
            },
            "location" : {
               "lat" : 28.7040592,
               "lng" : 77.10249019999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 28.881338,
                  "lng" : 77.34845780000001
               },
               "southwest" : {
                  "lat" : 28.412593,
                  "lng" : 76.83806899999999
               }
            }
         },
         "place_id" : "ChIJLbZ-NFv9DDkRQJY4FbcFcgM",
         "types" : [ "administrative_area_level_1", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.5087008,
                  "lng" : 97.395561
               },
               "southwest" : {
                  "lat" : 6.7535159,
                  "lng" : 68.162386
               }
            },
            "location" : {
               "lat" : 20.593684,
               "lng" : 78.96288
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.5087008,
                  "lng" : 97.395561
               },
               "southwest" : {
                  "lat" : 6.7535159,
                  "lng" : 68.16288519999999
               }
            }
         },
         "place_id" : "ChIJkbeSa_BfYzARphNChaFPjNc",
         "types" : [ "country", "political" ]
      }
   ],
   "status" : "OK"
}

此响应包含多个位于经纬度指定位置附近的地址。我有兴趣从此响应中提取位置。

例如上述查询,位置是 Saket,位于印度德里。

如果我尝试根据地址类型过滤来限制结果,它只会限制响应中的地址数量,并且仍然 returns 个多个地址。

如何提取准确或大概的位置?

感谢任何帮助。

地理编码不是一对一的;单个 lat/lon 对应多个事物。您能做的最好的事情就是按重要性对它们进行排名(Google 已经这样做了)并选择最重要的一个。您还可以根据自己的参数对它们进行排序,例如到查询点的距离。但是没有办法保证一个结果。