Diskuze: PSČ (datalist) a rozsah v km (google) - Skoro Hotovo
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Google Maps API(https://developers.google.com/…get-started/)
Četl jsi co jsem psal ? Tohle už mám hotové
Kdyby otázka nebyla jasná s rozsahem Km.
Aktuálně když zadám název místa, nebo PSČ, tak dokážu porovnat vzdálenost a vím, že rozdíl je xx Km. Pakliže bych to sypal přes foreach, tak se musím zeptat databáze na každé psč a z něho vypočítat vzdálenost, pakliže vzdálenost bude ok, tak si psč uložím (případně rovnou vypíšu) a tak to celé budu opakovat až dojdu na konec všemi PSČ ... Přijde mi to jako náročný proces a tak otázka ohledně tohoto je, zda-li je to takto v pořádku nebo jsou nějaké lepší způsoby ?
Samozřejmě za pomocí google API to tahám.
Dataz na databázi bys měl upravit tak, aby ti rovnou vracel počet kilometrů. Není to zas takový problém, ale bez návrhu databáze ti víc neporadím.
Jinak samozřejmě tvoje řešení není v pořádku. Databázi by měl odeslat co nejméně dotazů, jakmile máš dotazy v cyklu, je jasné, že tomu tak není.
Těch výsledků budou tisíce, protože se jedná o inzeráty. Takže uživatel zadá že v okruhu 20Km chce zobrazit tyto inzeráty.
Databáze psč:
PSČ z české pošty:
CREATE TABLE IF NOT EXISTS `psc` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`psc` int(6) DEFAULT NULL,
`mesto` varchar(30) COLLATE utf8_czech_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=3254 ;
A v databázi 'inzeráty' mám jen sloupec PSČ který je pro řešení důležitý..
Aktuálně jsem schopný zjistit vzdálenost mezi každým PSČ v PHP.
Ale nějak mě nenapadá lepší řešení než se každého PSČ v databázi "psc" optat -> převést na km v PHP a php si vybere co chce a znovu se půjde zeptat na inzeráty -> "hele máte tady tyhle psč ?" ...
Když to ale tak logicky beru, tak to stejně ani jinak ale jít nemůže, přeci jen databáze musí stejně vše projet a dotázat se a pak až bude mít přesné hodnoty, tak v dalším dotazu vytáhne přesně co je potřeba.
Možná nevím ani proč jsem se na tohle ptal... Nejdřív musím problém rozepsat a napsat abych si dokázal odpovědět ...
Jestliže nemáš souřadnice v databázi, a musíš se na vzdálenost mezi
dvěmi městy ptát přes API, potom jinou možnost nemáš. ALe dej si pozor,
co jsem se díval, tak je tam omezený počet dotazů za den (ve free verzi).
Nejde přes API zjistit města v okolí a z nich vytvořit PSČ? Ušetřilo by
to spoustu dotazů.
Eventuelně mě napadá, uložit do databáze i souřadnice měst (pro
přibližné výsledky by to štačilo). Mohl bys třeba ukládat číslo
reprezentující zeměpisnou šířku a délku - z ní bys poté mohl určit
vzdálenost mezi dvěma body vzdušnou čarou.
Tohle je celý kod a ano, google má omezení na klíč který získáš ale
tohle klíč ani nemá takže
sám ani nevím jestli se na to vztahuje limit, ale mělo by to být 25 tisíc
.. nebo 2,5 záleží na API
Ale bez toho klíče to nemají jak kontrolovat.
function get_vzdalenost($od, $do, $stat_od="Česká republika", $stat_do="Česká republika", $mode="driving", $language="cs", $avoid="tolls", $units="metrics"){
static $google_api = "http://maps.googleapis.com/maps/api/distancematrix/";
static $type = "json"; // json|xml
$res = json_decode(file_get_contents($google_api.$type."?origins=".urlencode($od.",".$stat_od)."&destinations=".urlencode($do.",".$stat_do)."&mode=$mode&language=$language&avoid=$avoid&units=$units&sensor=false"));
$ret = array();
$ret["vzd_text"] = ($res->rows[0]->elements[0]->distance->text);
$ret["vzd_val"] = ($res->rows[0]->elements[0]->distance->value);
$ret["cas_text"] = ($res->rows[0]->elements[0]->duration->text);
$ret["cas_val"] = ($res->rows[0]->elements[0]->duration->value);
$ret["ret_od"] = implode(" | ",$res->origin_addresses);
$ret["ret_do"] = implode(" | ",$res->destination_addresses);
return ($ret);
}
Víš že máš pravdu? to bych možná mohl ! Juknu na to ..
To zjištění těch PSČ v okolí by mě právě taky zajímalo a tak bych si to vlastně musel udělat těmi dotazy a pak si to vytahám, ale to se mi nelíbí no.
A nebo se vykašlat na google (API dalších stran) a udělat si nějakou rovnici a funkci, která to spočítá již z GPS údajů, které si budu muset obstarat ještě. Na druhou stranu to nese méně rizik
Myslel jsem že vyhledávání na webu bude to nejtěžší, to jsme kupodivu s fulltextovým vyhledáváním a za pomocí funkce match v mysql s foukl asi za 2h ... ale tohle? .... Je fakt, že aspoň jedno řešení mám no takže mám aspoň záchytný bod .
Tak zřejmě vyřešeno !
Ani google k tomu nepotřebuji...
Stačí si jen umět vypočítat GPS souřadnice + databáze měst s GPS
souřadnicemi a je to...
Což obojí již mám a databáze je z roku 2013 a to pro přibližnou
lokalizaci bohatě stačí, to co bude neznámé lze zase dohledat dle města a
okresu a přiřadit k okresu či kraji. Takže to má řešení a nemám
žádné limity
Tak děkuji za rady !
Patrik Valkovič Dodělám to a pakliže nebude nutné mít nějaký dotaz, tak ti dám řešení aspoň za snahu plnohodnotnou.
**Tak mám stále 1 problém a tak třeba než na něco přijdu, tak někdo
bude rychlejší a třeba i s lepším nápadem než bych přišel já.
**
Problém ale mám:
Je sice pěkné, že jsem schopný se všemi psč/gps porovnat vzdálenost a
vyházet si jen určitá psč co jsou v daném rozsahu, ale když už mám pole
s X psč, tak je potřebuji vyselectovat. Což bych možná v samotném selectu
nějak udělal, ale mám v tom další dotazy, protože se jedná o dotaz na
vyhledávač.
public function vyhledavacLVL1($text, $pocetOd, $pocetDo, $cenaOd, $cenaDo)
{
try{
$datasql = Db::dotazVsechny("SELECT * FROM inzeraty WHERE match (nadpis) against (?) AND cena1 BETWEEN ? AND ? limit ?, ?",
array($text, $cenaOd, $cenaDo, $pocetOd, $pocetDo));
return $datasql;
}catch(PDOException $e){
exit;
}
}
Takže dotaz zkráceně je, jak do tohoto vložit pole s psč, nebo jak by bylo možné v tomto spočítat díky souřadnicím vzdálenost rovnou a házet to ven.
Oprava: Výše ten kod není, to je na google. Mám normální rovnici, která to spočítá.
[Vyřešeno]
Omlouvám se že to vypadá jako spam...
Řešeni:
Ponaučení:
Řádná znalost MySQL jazyka může být velice dobrá a dokáže v PHP
ušetřit mnoho řádků. Nejen že ušetří spoustu času psaním, ale i
serveru pro zpracování dat a možná i financí na provoz serveru !
Zobrazeno 15 zpráv z 15.