Autor Zpráva
JichPavel
Profil *
Zdravím,
chtěl bych vytvořit něco, co funguje podobně jako toto. Zaměření bude úplně jiné, ale funkce by byly podobné. Nevím, zda použít nějaké API od Google maps, nebo je snad nějaký framework.

Je obtížné seřadit souřadnice podle podobnosti od středového bodu?

Prosím, poraďte :-)
Děkuji
ninja
Profil
I když budete počítat vzdálenost pytágorovou větou (což jde jen u malých vzdáleností, pak už je nepřesnost příliš velká), je to relativně velká zátež. Některé databáze ale mají přímo v sobě nástroje pro spaciální hledání.

Pokud budete mít body od sebe v řádu desítek a více kilometrů, musíte použít pro smysluplné výsledky nějaký složitějčí vzoreček. Těch je mnoho - různě přesné a různě náročné na výpočet. Také záleží jestli jsou všechny body v rámci jedné polokoule.
JichPavel
Profil *
Možná, že taky používají API od Googlu, jak tak koukám :-), ale na ten výpis asi googlovské api použít nepůjde :-(


Odkaz
JichPavel
Profil *
Ano, používá je :-)

Neporadily byste mi prosím, jaké přesně používá :-)

Tady je jich hodně :-)
Keeehi
Profil
$dotaz ="SELECT *,acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).")*cos(sirka)*cos(abs(".deg2rad($s_delka).
"-delka)))*6372.795 AS vzdalenost  FROM table WHERE acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).
")*cos(sirka)*cos(abs(".deg2rad($s_delka)."-delka)))*6372.795 <= $vzdalenost ORDER BY vzdalenost";

Toto jsem používal. V databázi jsou souřadnice uloženy v radiánech. Sever/Jih/Východ/Západ jsou rozlišené pomocí znamének. $s_sirka a $s_delka jsou ve stupních. Jsou to souřadnice referenčního bodu, vůči kterému se počítají vztahy. $vzdalenost je v km.
Při použití tohoto vzorce jsem dostával stejné vzdálenosti jako na stránkách geocachingu.

Prohledávání tabulky s 1 135 537 záznamy s indexy na šířce a délce trvá přibližně 1 sekundu.
JichPavel
Profil *
Díky moc, tohle sem potřeboval. Teď si to už nějak upravím :-)
JichPavel
Profil *
Teď jsem se nějak zamyslel, a nějak mi to nedochází :-)

$s_sirka a $s_delka jsou souřadnice bodů, které definuji na začátku php scriptu, a to je ten střed.
V databázi mám 3 sloupce např. nazev, sirka, delka.
a poté již vypisuji třeba takto?

include("db.php");
$dotaz ="SELECT *,acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).")*cos(sirka)*cos(abs(".deg2rad($s_delka).
"-delka)))*6372.795 AS vzdalenost  FROM table WHERE acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).
")*cos(sirka)*cos(abs(".deg2rad($s_delka)."-delka)))*6372.795 <= $vzdalenost ORDER BY vzdalenost";
while ($data = MySQL_Fetch_Array($data)) {
echo $data["nazev"];
echo $data["sirka"];
echo $data["delka"];
}


Momentálně to totiž nemohu vyzkoušet.
Mohlo by to takhle fungovat?
Díky :-)
Keeehi
Profil
JichPavel:
Mohlo by to takhle fungovat?
Ano, mělo by.
JichPavel
Profil *
Nemyslím si, že bych někde dělal chybu, ale bohužel mi to nejde :-(

$dotaz =MySQL_Query("SELECT *,acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).")*cos(sirka)*cos(abs(".deg2rad($s_delka).
"-delka)))*6372.795 AS vzdalenost  FROM tabule WHERE acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).
")*cos(sirka)*cos(abs(".deg2rad($s_delka)."-delka)))*6372.795 <= $vzdalenost ORDER BY vzdalenost DESC");
while ($dataa = MySQL_Fetch_Array($dotaz)) {
echo $dataa["nazev"];
echo $dataa["sirka"];
echo $dataa["delka"];
}


Všechno mám ve správných jednotkách apod.
Žádnou chybovou hlášku to nepíše, ale nevypisuje to vůbec nic....
Nevíte náhodou?
Keeehi
Profil
Přišlo mi to emailem, takže to sem nakopíruji:

jan vožeh napsal(a):
> Zpráva určena pro uživatele Keeehi na www.diskuze.jakpsatweb.cz, pokud to nejsi ty, tuto zprávu ignoruj!
>
> Zdravím,
> před nedávnem jsi mi doporučil vzoreček viz.(Řazení souřadnic, výpis, ukládání). Bohužel mi pořád nefunguje. Potřeboval bych poradit, jak má přesně vypadat tabulka v databázi a ostatní proměné. Potřeboval bych vědět zkrátka vše :-)
>
> Zatím to mám takhle:
>
> <?
> include("db.php");
> $s_sirka == 50;
> $s_delka == 14;
>
> $dotaz ="SELECT *,acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).")*cos(sirka)*cos(abs(".deg2rad($s_delka).
> "-delka)))*6372.795 AS vzdalenost FROM tabule WHERE acos(sin(".deg2rad($s_sirka).")*sin(sirka)+cos(".deg2rad($s_sirka).
> ")*cos(sirka)*cos(abs(".deg2rad($s_delka)."-delka)))*6372.795 <= $vzdalenost ORDER BY vzdalenost DESC";
> while ($dataa = MySQL_Fetch_Array($dotaz)) {
> echo $dataa["nazev"];
> echo $dataa["sirka"];
> echo $dataa["delka"];
> }
> ?>
>
> To mi ale háže: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource......
>
> a databáze vypadá takto:
>
> nazev sirka delka
> ---------------------------------------
> bod1 0.872664626 0.226892803
>
>
> Mohl bys mi poradit :-)
> Díky
> Přeji krásný zbytek dne.

1)
$s_sirka == 50;
$s_delka == 14;
-> 2 rovnítka provnávají. Přiřazuje se jedním rovnítkem!

2) chybí vám tam na začátku proměnná $vzdalenost, která určuje maximální poloměr

3) dotaz se ještě musí provést. Tzn. že před cyklem while má být ještě řádek $result = mysql_query($dotaz); a pak v cyklu by bylo while ($dataa = MySQL_Fetch_Array($result)) {


Mít nick JichPavel ale email Jan Vožeh je docela podivné :)
JichPavel
Profil *
Děkuji, na to s tím rovnítkem jsem přišel (původně jsem to vlastně měl správně, ale později jsem už zkoušel všechny varianty....) Jinak moc děkuji za ostatní rady....

S tím jménem se omlouvám, ale nerad prozrazuji svoje údaje, tak proto :-)


Dík
Keeehi
Profil
JichPavel:
S tím jménem se omlouvám, ale nerad prozrazuji svoje údaje, tak proto :-)
Chápu to a je mi to vlastně jedno, ale když už, tak si vytvořte i fiktivní email.
JichPavel
Profil *
Dobře, napravím to :-)
A ještě jednou moc děkuji

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: