谷歌地理编码服务返回虚假地址的响应
Posted
技术标签:
【中文标题】谷歌地理编码服务返回虚假地址的响应【英文标题】:Google geocoding service returns response for fake address 【发布时间】:2009-07-21 19:06:45 【问题描述】:我正在使用谷歌地理编码服务来验证我们系统中输入的城市名称(加上地区和国家)是否存在,并获取纬度/经度。
但是,我发现它似乎会“猜测”您是否打错字,并且即使您犯了错误也会返回响应。
例如,对“加拿大安大略省贝弗顿”的请求会返回比弗顿的纬度/经度,但没有表明您提供了错误的城市名称。
我正在使用 CSV 响应类型,并且收到 200 响应代码。
我是否可以阻止该服务这样做,或者更好的是,找出它是否有?
编辑:澄清......谷歌正在纠正输入(当我预计它会失败时),我需要知道它是否已经这样做了。
【问题讨论】:
我认为 CSV 响应类型是所有选项中最不详细的。请参阅下面的答案以获取可能的替代方案。 我找不到任何地图服务的“安大略省贝弗顿”。你确定它是正确的吗? geonames.nrcan.gc.ca/search/search_e.php 对,没有“Beverton”……这个城镇是“Beaverton”(注意 A) 好的 - 我明白了。您得到了正确的结果,但您只想知道地理编码器是否确定您有错字。 【参考方案1】:地理编码器无法让您知道它是否认为您有错字。我同意 Saul 的回答,您最好的办法是检查您的查询是否与回复相符。
我只是想指出,您必须根据几个响应值检查输入的几个元素,才能找到应该匹配的元素。在这种情况下,在“DependentLocalityName”中找到了“Beaverton”。
<?xml version="1.0" encoding="UTF-8" ?>
<kml xmlns="http://earth.google.com/kml/2.0"><Response>
<name>Beverton, Ontario, Canada</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>
<Placemark id="p1">
<address>Beaverton, Brock, ON, Canada</address>
<AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CA</CountryNameCode><CountryName>Canada</CountryName><AdministrativeArea><AdministrativeAreaName>ON</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Durham Regional Municipality</SubAdministrativeAreaName><Locality><LocalityName>Brock</LocalityName><DependentLocality><DependentLocalityName>Beaverton</DependentLocalityName></DependentLocality></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails>
<ExtendedData>
<LatLonBox north="44.4502166" south="44.4183470" east="-79.1199562" west="-79.1839858" />
</ExtendedData>
<Point><coordinates>-79.1519710,44.4342840,0</coordinates></Point>
</Placemark>
</Response></kml>
更新:
这可能无法实际实施。如果您的输入是“加拿大安大略省贝弗顿”,您如何知道要检查这三个词中的哪一个?他们中的两个会很好地匹配。如果它们以不同的顺序输入怎么办?
【讨论】:
事实证明这是真的。就个人而言,我认为 API 返回与您提供的完全不同的请求的响应,而不告诉您,这很奇怪! 在我看来,Google 的地理编码服务还有改进的余地。也许他们可以以某种方式表明位置数据中提供了“模糊”响应。【参考方案2】:它是否以“200 成功代码”响应?它有可能会为您提供不同的状态代码。
以下是谷歌返回的不同状态码:http://code.google.com/apis/maps/documentation/reference.html#GGeoStatusCode
【讨论】:
是的,我得到了 200。更新的问题。【参考方案3】:注意:请参阅上面的answer by @Chris B。正如 Chris 指出的那样,这可能无法实现。
您必须使用 CSV 响应类型吗?如果不是,其他响应类型(例如 KML)会提供足够的详细信息来确定坐标所指的位置。您可以根据响应的 LocalityName 元素验证您的输入。
<kml xmlns="http://earth.google.com/kml/2.0">
<Response>
<name>1600 amphitheatre mountain view ca</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>
<Placemark>
<address>
1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA
</address>
<AddressDetails Accuracy="8">
<Country>
<CountryNameCode>US</CountryNameCode>
<AdministrativeArea>
<AdministrativeAreaName>CA</AdministrativeAreaName>
<SubAdministrativeArea>
<SubAdministrativeAreaName>Santa Clara</SubAdministrativeAreaName>
<Locality>
<LocalityName>Mountain View</LocalityName>
<Thoroughfare>
<ThoroughfareName>1600 Amphitheatre Pkwy</ThoroughfareName>
</Thoroughfare>
<PostalCode>
<PostalCodeNumber>94043</PostalCodeNumber>
</PostalCode>
</Locality>
</SubAdministrativeArea>
</AdministrativeArea>
</Country>
</AddressDetails>
<Point>
<coordinates>-122.083739,37.423021,0</coordinates>
</Point>
</Placemark>
</Response>
</kml>
【讨论】:
此外,您可以使用 JSON 或 XML 响应类型来获取相同的数据。以上是关于谷歌地理编码服务返回虚假地址的响应的主要内容,如果未能解决你的问题,请参考以下文章