|
Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема
|
Zip Code Search
|
|
Автор |
$burov (начинаещ) |
Публикувано | 26.05.03 18:33 |
|
Хайде пак по старата тема.
База данни с потребители. Трябва да има търсене по няколко критерия, включително и USA Zip Code. С помощта на google стигнах до това
CREATE TABLE dealers (
Dealer_ID int(11) NOT NULL auto_increment,
Dealer_Name varchar(50) NOT NULL default '',
Dealer_Address varchar(50) default NULL,
Dealer_City varchar(35) default NULL,
Dealer_State char(2) default NULL,
Dealer_Zip varchar(5) default NULL,
PRIMARY KEY (Dealer_ID),
KEY Dealer_Zip (Dealer_Zip),
KEY Dealer_Name (Dealer_Name),
KEY Dealer_Address (Dealer_Address),
KEY Dealer_City (Dealer_City)
) TYPE=MyISAM;
CREATE TABLE zipcode (
ZIPCodeID int(9) NOT NULL auto_increment,
ZIPCode varchar(5) NOT NULL default '',
Latitude double(7,5) NOT NULL default '0.00000',
Longitude double(7,5) NOT NULL default '0.00000',
PRIMARY KEY (ZIPCodeID),
KEY ZIPCode (ZIPCode),
KEY Latitude (Latitude),
KEY Longitude (Longitude)
) TYPE=MyISAM;
в тази последната таблица има над 42 000 записа с необходимата информация
след малко "орязване" на ненужните неща, заявката има следния вид:
"SELECT dealers. * ,
( 3963 * acos( truncate(sin( zipcodesearch.latitude / 57.2958 ) * sin( zipcode.latitude / 57.2958 ) + cos( zipcodesearch.latitude / 57.2958 ) * cos( zipcode.latitude / 57.2958 ) * cos( zipcode.longitude / 57.2958 - zipcodesearch.longitude / 57.2958 ),8) ) ) AS Dealer_Distance FROM dealers, zipcode, zipcode AS zipcodesearch
WHERE
(zipcodesearch.ZIPCode = '$MyZip'
AND (dealers.Dealer_Zip = zipcode.ZIPCode)
AND (( 3963 * acos( truncate(sin( zipcodesearch.latitude / 57.2958 ) * sin( zipcode.latitude / 57.2958 ) + cos( zipcodesearch.latitude / 57.2958 ) * cos( zipcode.latitude / 57.2958 ) * cos( zipcode.longitude / 57.2958 - zipcodesearch.longitude / 57.2958 ),8) ) ) < '$MyRadius' ";
$MyZip - zip code на потребителя
$MyRadius - колко miles около $MyZip да обхване търсенето
Обаче не работи! Дори когато въвеждам данните 1:1 във формата за търсене спрямо вече въведените в таблицата за дистрибуторите, не връща никакъв резултат. Някой би ли погледнал кода и да каже какво не е на ред?
| |
Тема
|
Re: Zip Code Search
[re: $burov]
|
|
Автор |
salle (член) |
Публикувано | 26.05.03 20:40 |
|
Извинявам се, че съм забравил много отдавна простите математически истини ама откъде идва 57.2958 ?
| |
Тема
|
Re: Zip Code Search
[re: salle]
|
|
Автор |
$burov (начинаещ) |
Публикувано | 26.05.03 20:44 |
|
Незнам откъде идва 57.2958 - така е написано в онзи скрипт.
а за версия 4.xx - то хубаво ги има тези функции, обаче на хоста все още съм с 3.xx
| |
Тема
|
Re: Zip Code Search
[re: $burov]
|
|
Автор |
salle (член) |
Публикувано | 26.05.03 21:07 |
|
Не 4.xx
4.1 е доста по-различна от 4.0
| |
Тема
|
Re: 57.2958
[re: salle]
|
|
Автор | s_dimi (Нерегистриран) |
Публикувано | 27.05.03 05:08 |
|
V ukazaniata kam doma6noto mi po bazi danni pi6e slednoto:
d = r*acos(
cos( p1.latitude*n /180 ) cos(p2.latitude*n/180)
cos( (p1.longtitude-p2.longtitude)*n/180 )
+
sin( p1.latitude*n/180) sin(p2.latitude*n/180)
)
e formulata za namirane na raztoianieto m/u 2 to4ki, kadeto
r = 6370 km
n = 3.14
| |
|
В случая r какво се явява, някаква константа ли е?
| |
|
r не е ли Радиуса в който се търси?
А в MySQL вместо n=3.14 можеш да използваш PI()
| |
Тема
|
Re: 57.2958
[re: $burov]
|
|
Автор |
mn_t (разпрашен) |
Публикувано | 27.05.03 18:17 |
|
6370km е приблизително средният радиус на Земята.
57,2958 = 180/pi
| |
Тема
|
Re: Zip Code Search
[re: $burov]
|
|
Автор |
fiffy () |
Публикувано | 27.05.03 21:27 |
|
Eto source-a na ne6to koeto bqh prawil predi i rabote6e... bazata e w po-razli4en wariant, no ideqta e sy6tata - zip sys latitude i longitude i tyrsene za nai-blizyk zip do daden takyw.... Koda e malko razpilqn, no ne e trudno da se sledwa logikata...
$userdata = mysql_query("SELECT ZIP_CODE, CITYSTNAME, STATE, LAT, LNG FROM ZIP_Database WHERE ZIP_CODE >=" . $zip . " LIMIT 1;")
or die ("Userdata query error.");
$userzip = mysql_result($userdata, 0, "ZIP_CODE");
if ($userzip <> $zip) print "$zip not found in database. Using <b>$userzip</b><p>";
$result = mysql_query("SELECT ID, Zip FROM ZIP_Stores")
or die ("Could not retrieve stores data");
$stores = array();
while($row = mysql_fetch_row($result))
{
$storedata = mysql_query("SELECT LAT, LNG FROM ZIP_Database WHERE ZIP_CODE=" . $row[1] . " LIMIT 1;")
or die ("Storedate query error.");
$lat1 = mysql_result($storedata, 0, "LAT");
$lng1 = mysql_result($storedata, 0, "LNG");
$lat2 = mysql_result($userdata, 0, "LAT");
$lng2 = mysql_result($userdata, 0, "LNG");
$a1 = sin($lat1/57.3) * sin($lat2/57.3);
$a2 = cos($lat1/57.3) * cos($lat2/57.3) * cos($lng2/57.3 - $lng1/57.3);
$a = $a1 + $a2;
$dist = 3959*atan(sqrt(1-$a*$a)/$a);
if ($dist <= $distance) $stores[$row[0]] = $dist;
}
asort ($stores);
reset ($stores);
?>
<b>Store Results:</b><p>
<table>
<tr><td width="270"><b>Address</b></td><td width="150"></td><td width="120" align="center"><b>Distance</b></td></tr>
<?php
while (list ($id, $dist) = each ($stores))
{
$thisstore = mysql_query("SELECT Address, City, State, Zip FROM ZIP_Stores WHERE ID=$id");
$addr = mysql_result($thisstore, 0, "Address");
$statezip = mysql_result($thisstore, 0, "City") . ", " . mysql_result($thisstore, 0, "State") . " " . mysql_result($thisstore, 0, "Zip");
?>
<tr><td><a href="store.php?storeID=<?php print $id; ?>"><?php print $addr; ?></a></td>
<td><?php print $statezip; ?></td>
<td align=center><?php print round($dist,2); ?></td></tr>
</table>
| |
Тема
|
Благодаря на всички
[re: $burov]
|
|
Автор |
$burov (начинаещ) |
Публикувано | 27.05.03 21:34 |
|
Благодаря Ви, определено ми се изясниха малко нещата. При първа възможност ще си направя някой преработки на кода и съответните тестове и ако се получи ще пусна един линк към скрипта за да се използва свободно.
| |
|
Страници по тази тема: 1 | 2 | >> (покажи всички)
|
|
|