我有这个地址:
Grimshaw Lane, Bollington, Macclesfield SK10 5JB,
在寻找这个地址时,我(从API获得):
Bollington Wharf, Grimshaw Lane, Bollington, United Kingdom
我知道如何工作preg_match,但我相信无论如何必须比较两个类似的文本(相似,不一样),并确定它们是否是相同的地址(即使它们有点不同)
答案 0 :(得分:6)
显然没有解决方案可以让您获得100%可靠的结果,但为什么不试试这个:通过wget将两个字符串发送到Google地图并比较结果。谷歌至少投入了数万个工时来解决你正在寻找的问题,为什么不让他们处理呢?
答案 1 :(得分:2)
我不确定这是否有帮助,但我会考虑结合使用explode在数组中创建多个字符串levenshtein()来比较数组的不同元素()。
这取决于您需要比较多少个数组,但如果您只有几个(不是数千个)
Psudo代码将是这样的:
$search_address = "Bollington Wharf, Grimshaw Lane, Bollington, United Kingdom";
$my_addresses = Array("Grimshaw Lane, Bollington, Macclesfield SK10 5JB",
"Different Lane, YabbaDabbaDoo, Otherfield SK12 6BJ",
...);
$search_array = explode(',', $search_address);
$best_address = array();
$lowest_compare_value = 1000;
$lowest_compare_address = array();
foreach($my_addresses as $key => $my_address) {
$current_address_array = explode(',', $value);
$compare_value = 0;
foreach(<elements in $my_address>) {
$lowest_value = 1000;
foreach(<elements in $search_array) {
$new_value = levenshtein($search_element, $my_element);
if ($new_value < $lowest_value) { $lowest_value = $new_value; }
}
$compare_value += $lowest_value;
}
if($compare_value < $lowest_compare_value) {
$lowest_compare_value = $compare_value
$lowest_compare_address = $my_address;
}
}
现在你还应该考虑最大似是否合理的levenshtein值来检查相比的地址是否太远了。
如上所述,此方法需要时间,不应在需要大量速度的应用程序中使用,或者如果您有许多本地地址。
答案 2 :(得分:1)
我创建了这个实用程序,它已经为我工作了一段时间。当然,如果Google地图更改其API界面,则必须对其进行修改。
<?php
// Queries google maps for the address components
function utl_GetAddressComponents( $location )
{
$components = file_get_contents('http://maps.google.com/maps/api/geocode/json?address='.urlencode($location).'&sensor=false');
$output = json_decode($components);
return $output->results[0];
}
?>
这是我用来从命令行运行它的测试文件:
tst_MatchingAddresses.php:
<?php
require_once( "utl_GetAddressComponents.php" );
$addr1 = $argv[1];
$addr2 = $argv[2];
$gmapsResult1 = utl_GetAddressComponents( $addr1 );
$gmapsResult2 = utl_GetAddressComponents( $addr2 );
$gmapsAddr1 = $gmapsResult1->formatted_address;
$gmapsAddr2 = $gmapsResult2->formatted_address;
print("Gmap1: ".$gmapsAddr1." ----- argv[1]: ".$argv[1]."\n");
print("Gmap2: ".$gmapsAddr2." ----- argv[2]: ".$argv[2]."\n");
if ( strcmp($gmapsAddr1,$gmapsAddr2) )
{
print("==> Addresses match!\n");
}
else
{
print("==> Addresses DO NOT MATCH!\n");
}
?>
以下是一个示例命令行:
php tst_MatchingAddresses.php "1600 Pennsylvania Ave, Washington DC" "1600 Pennsylvania Avenue, 20500"
示例输出:
Gmap1: 1600 Pennsylvania Avenue Northwest, President's Park, Washington, DC 20500, USA ----- argv[1]: 1600 Pennsylvania Ave, Washington DC
Gmap2: 1600 Pennsylvania Avenue Northwest, President's Park, Washington, DC 20500, USA ----- argv[2]: 1600 Pennsylvania Avenue, 20500
==> Addresses match!
注意:您可以输入file_get_contents的参数,用地址替换urlencode等,直接进入浏览器,它将显示json结果。