2014-02-07 66 views
1

搜索堆栈溢出和其他地方,并试图把一些编码做我需要的工作。我将有一个邮政编码(为了测试目的,它被固定在28752),我希望该页面能够给我邮政编码50英里以内的位置。我读的大部分内容都超出了我的想法,但我拼凑了下面的内容,并且尽我所能知道它应该工作得很好(给我参数中的记录列表),但事实并非如此。php lat长半径从邮政编码

首先我使用以下设置参数的...

$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设置为十进制(小数点后6位)。

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

回答

0

尝试将小数点设置为8位。

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) 
+0

谢谢大家谁回答。在解决方案看起来像这样复杂的工作方式上,我的头脑一直很低调,它一直告诉我存在编码错误。因此,由于这是一个非常小的数据库(只有30条记录),我实际上查找了半径内的邮政编码,并将它们作为列表添加到单独的字段中。然后,我能够在有限的知识范围内创建搜索参数。我非常感谢你们给出的答案!我非技术人员的解决方法可能会让你咯咯笑! –

+0

错误信息是什么? –

+0

以及我使用DW CS6添加了查询,它告诉我$ query_ZIPLOCATE =“SELECT * FROM MEMBERS WHERE(POWER(纬度 - ”输入纬度“,2)+ POWER(经度 - ”输入长度“, 2))

相关问题