NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
katrincsak
Člen
Avatar
katrincsak:19.9.2015 1:43

Zdravím,

měl bych možná 2 drobné dotazy:

  1. Vyhledávání v rozsahu km

Již mám kompletní script co mi spočítá vzdálenost mezi 2 body a otázka zní -> To fakt musím všechny PSČ v databázi selectnout, spočítat vzdálenost a pak teprve vyselectovat? Nebo to jde nějak rovnou ? (Samozřejmě mi to nedělá problém, ale zda-li to není až moc náročné) ?

  1. Automatické doplňování psč

Zkusil jsem to pomocí datalistu, ale nelíbí se mi že vyjede dlouhý seznam a kdyby se mi na monitor vešlo přes 3 tisíce řádků, tak mi vyjede vše. Pak se samozřejmě při zadávání okno zmenšuje, ale nelíbí se mi to první kliknutí. nějaké rady jak to obejít (zatím JS a JQ neovládám a tak ho tam moc cpát nechci, ale asi jiná možnost nebude)

 
Odpovědět
19.9.2015 1:43
Avatar
Nahoru Odpovědět
19.9.2015 2:00
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Neaktivní uživatel
katrincsak:19.9.2015 7:48

Četl jsi co jsem psal ? Tohle už mám hotové :-)

 
Nahoru Odpovědět
19.9.2015 7:48
Avatar
katrincsak
Člen
Avatar
katrincsak:19.9.2015 8:01

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.

Editováno 19.9.2015 8:02
 
Nahoru Odpovědět
19.9.2015 8:01
Avatar
Odpovídá na katrincsak
Patrik Valkovič:19.9.2015 8:19

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í.

Nahoru Odpovědět
19.9.2015 8:19
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
katrincsak
Člen
Avatar
Odpovídá na Patrik Valkovič
katrincsak:19.9.2015 9:45

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.

Editováno 19.9.2015 9:47
 
Nahoru Odpovědět
19.9.2015 9:45
Avatar
katrincsak
Člen
Avatar
katrincsak:19.9.2015 9:57

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 :D...

 
Nahoru Odpovědět
19.9.2015 9:57
Avatar
Odpovídá na katrincsak
Patrik Valkovič:19.9.2015 10:08

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.

Nahoru Odpovědět
19.9.2015 10:08
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
katrincsak
Člen
Avatar
Odpovídá na Patrik Valkovič
katrincsak:19.9.2015 10:20

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 :D
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 ..

 
Nahoru Odpovědět
19.9.2015 10:20
Avatar
katrincsak
Člen
Avatar
Odpovídá na Patrik Valkovič
katrincsak:19.9.2015 10:27

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.

 
Nahoru Odpovědět
19.9.2015 10:27
Avatar
katrincsak
Člen
Avatar
katrincsak:19.9.2015 11:10

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 .

 
Nahoru Odpovědět
19.9.2015 11:10
Avatar
katrincsak
Člen
Avatar
Odpovídá na Neaktivní uživatel
katrincsak:19.9.2015 13:17

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.

 
Nahoru Odpovědět
19.9.2015 13:17
Avatar
katrincsak
Člen
Avatar
katrincsak:20.9.2015 12:53

**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á.
**

  1. Mám databázi měst, obcí a okresů s psč i se souřadnicemi.
  2. Umím vypočítat vzdálenost mezi "jakoukoli" gps souřadnicí. Používám na to již výše vypsaný script.

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.

Editováno 20.9.2015 12:56
 
Nahoru Odpovědět
20.9.2015 12:53
Avatar
katrincsak
Člen
Avatar
katrincsak:20.9.2015 13:00

Oprava: Výše ten kod není, to je na google. Mám normální rovnici, která to spočítá.

Editováno 20.9.2015 13:01
 
Nahoru Odpovědět
20.9.2015 13:00
Avatar
katrincsak
Člen
Avatar
katrincsak:20.9.2015 16:31

[Vyřešeno]

Omlouvám se že to vypadá jako spam...

  • Vzhledem k tomu, že i když neznám řešení tak se furt snažím nějaké zjistit a stále zkouším, přemýšlím ! Proto ho dost často najdu dříve než mi někdo dokáže odpovědět. Samozřejmě dotaz pokládám až když si nevím rady.

Řešeni:

  • Použil jsem v MySQL příkaz "in()". Do něj jsem vložil PSČ ve kterých se to má prohledávat.
  • Abych ale do toho mohl vložit pole, musel jsem pole převést na textový řetězec aby s tím sql příkaz uměl pracovat.

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 !

Editováno 20.9.2015 16:32
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
20.9.2015 16:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.