2014-02-07 62 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))

相關問題