php lat长半径搜索邮政编码

时间:2014-02-07 01:33:42

标签: php latitude-longitude

在堆栈溢出和其他地方阅读了这个,并试图将一些编码放在一起完成我需要的工作。我将有一个邮政编码(出于测试目的,它固定在28752)我希望该页面给我50英里的邮政编码位置。我阅读的大部分内容都是我的想法,但我拼凑了以下内容,并且尽我所知,它应该有效(给我一个参数内的记录列表),但事实并非如此。

首先,我使用以下内容设置参数...

$zipcode="28752";
$url = "http://maps.googleapis.com/maps/api/geocode/json?address=".$zipcode."&sensor=false";
$details=file_get_contents($url);
$result = json_decode($details,true);

$lat=$result['results'][0]['geometry']['location']['lat'];

$lng=$result['results'][0]['geometry']['location']['lng'];

$range = 50;  

       // Find Max - Min Lat / Long for Radius and zero point and query  
       $lat_range = $range/69.172;  
       $lon_range = abs($range/(cos($latitude) * 69.172));  
       $min_lat = number_format($lat - $lat_range, "4", ".", "");  
       $max_lat = number_format($lat + $lat_range, "4", ".", "");  
       $min_lon = number_format($lng - $lon_range, "4", ".", "");  
       $max_lon = number_format($lng + $lon_range, "4", ".", "");  

然后我按如下方式设置sql查询......

$LA1_RESULTS = "-1";
if (isset($min_lat)) {
$LA1_RESULTS = $min_lat;
}
$LO1_RESULTS = "-1";
if (isset($min_long)) {
$LO1_RESULTS = $min_long; 
}
$LO2_RESULTS = "-1";
if (isset($max_long)) {
$LO2_RESULTS = $max_long;
}
$LA2_RESULTS = "-1";
if (isset($max_lat)) {
$LA2_RESULTS = $max_lat;
}
mysql_select_db($database_XMASTREE, $XMASTREE);
$query_RESULTS = sprintf("SELECT * FROM zip_code WHERE zip_code.latitude BETWEEN %s AND      %s AND zip_code.longitude BETWEEN %s AND %s", GetSQLValueString($LA1_RESULTS, "int"),GetSQLValueString($LA2_RESULTS, "int"),GetSQLValueString($LO1_RESULTS, "int"),GetSQLValueString($LO2_RESULTS, "int"));
$RESULTS = mysql_query($query_RESULTS, $XMASTREE) or die(mysql_error());
$row_RESULTS = mysql_fetch_assoc($RESULTS);
$totalRows_RESULTS = mysql_num_rows($RESULTS);

输出可以在http://signature-online.net/xmastrees/zipsearch.php看到,它可以正确地给出lat和long变量。我在数据库中将lat和long设置为十进制(小数点后6位)。

我是原来的“知道足够危险”!任何人都能弄清楚我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

您是否意识到此方法会返回边长为50的正方形中的点,而不是半径为50的圆?

Equation for testing if a point is inside a circle涵盖了基本数学。

因此,您可以让服务器完成大部分工作,而不是计算您的地理位置的最大/最小值:

SELECT * 
FROM zip_code 
WHERE 
    (
        POWER(latitude - "INPUT LATITUDE", 2) 
        + 
        POWER(longitude - "INPUT LONGITUDE", 2) 
    ) 
    < POWER("RADIUS",2)

答案 1 :(得分:0)

尝试将小数设置为8位。