在堆栈溢出和其他地方阅读了这个,并试图将一些编码放在一起完成我需要的工作。我将有一个邮政编码(出于测试目的,它固定在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位)。
我是原来的“知道足够危险”!任何人都能弄清楚我做错了什么吗?
答案 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位。