Přejít na obsah


Fotka

SELECT ... ORDER BY Druh, Vzdálenost


  • Pokud chcete vložit odpověď, přihlašte se
22 odpovědí na toto téma

#1 ToRo61

ToRo61

    Advanced Member

  • Members
  • PipPipPip
  • 416 příspěvků(y)

Publikováno 18 únor 2011 - 23:21

Chtěl bych si přes SQLite udělat SELECT ID z geogetí DB a setřídit jej podle Druh, Vzdálenost. SELECT id FROM geocache ORDER BY cachetype Druh je mi jasný, ale nevím si rady s položkou Vzdalenost
  • 0

#2 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 18 únor 2011 - 23:23

vzdalenost tezko muze byt v dataazi, protoze by mohla byt jen vuci nejakemu pevne danemu bodu. k cemu by to bylo? Takze vzdalenost si musi spocitat a podle ni si ty data seradit sam.
  • 0

#3 ToRo61

ToRo61

    Advanced Member

  • Members
  • PipPipPip
  • 416 příspěvků(y)

Publikováno 18 únor 2011 - 23:47

Pevně daný bod je HOME COORDINATE. Nacpal jsem do GG různé kategorie bodů (cachetype) a chtěl bych (dle kategorie) ty nejblíže HOME COORDINATE navštívit. Představoval jsem si to tak, že si pomocí SELECTu vyberu setříděnou množinu bodů, která je nejblíže HOME COORDINATE. Je to realizovatelné?
  • 0

#4 Sally&eL

Sally&eL

    Sally

  • Members
  • PipPipPip
  • 823 příspěvků(y)

Publikováno 19 únor 2011 - 0:14

...nechápu proč si to nefiltruješ přímo v GG
  • 0

#5 mpistora

mpistora

    Advanced Member

  • Members
  • PipPipPip
  • 231 příspěvků(y)

Publikováno 19 únor 2011 - 1:13

Selectovat vzdálenost nejde, ledaže by se předem do databáze uložila. Pro HC by to asi i mělo smysl.
Obecnou vzdálenost dvou bodů (byť by jeden byl jako konstanta v selectu) pomocí SQLite selectovat nejde, protože pro vzdálenost na kouli (nemluvě o geoidu) jsou zapotřebí siny a cosiny a na to je její SQL příliš lite.

Přes GUI GeoGetu lze velmi pokročile filtrovat, zato řadit lze jen jednodušše - podle jednoho sloupce. Takže podle druhu a vzdálenosti nelze. V selectu takovéhle omezení není, zase tam ale chybí zrovna ta vzdálenost.

Řešení by bylo vlastním skriptem naplnit vlastní tag ve, kterém by ve vhodném formátu byly potřebné údaje v jednom textu. A pak podle sloupce s tímto tagem seznam setřídit.

Je to tady děsná skládačka ze spousty malých kousků :o
  • 0

#6 zLOST

zLOST

    Advanced Member

  • Members
  • PipPipPip
  • 778 příspěvků(y)

Publikováno 19 únor 2011 - 8:29

zlaty mysql :)
  • 0

#7 LudekV

LudekV

    Advanced Member

  • Members
  • PipPipPip
  • 1 771 příspěvků(y)

Publikováno 19 únor 2011 - 8:56

Přesnou vzdálenost skutečně v SELECTU nespočítáš, ale pro malé okolí stačí přiblížení podle Pythagorovy věty.

SELECT id FROM geocache WHERE ...
ORDER BY ((`x`-refX)*(`x`-refX)+(`y`-refY)*(`y`-refY))

Odmocnina už není nutná, ta ti pořadí nezmění. Může se stát, že se ti někde pořadí přehodí, ale asi to nebude nic fatálního. Přesnou vzdálenost si musíš přepočítat z načtených dat.
  • 0

a : Drake - vše potřebné pro (offline) geocaching na Android
Stránka projektu na GitHubu - požadavky a reklamace
PocketDrake - vše potřebné pro (offline) geocaching na PDA (WindowsMobile)


#8 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 19 únor 2011 - 9:39

A pokud te zajimaji body do urcite vzdalenosti, tak pro nejaky konkretrni rozsah X a Y souradnic muzes pouzit subselect na dvourozmerny souradnicovy index, ktery v Geogetu je a je velmi rychly.
  • 0

#9 Pe_Bo

Pe_Bo

    Advanced Member

  • Members
  • PipPipPip
  • 432 příspěvků(y)

Publikováno 19 únor 2011 - 10:22

SQLite umí používat extension (pluginy). Takže by mělo jít vytvořit funkci, která z X a Y spočte vzdálenost a funkci lze pak použít pro třídění. Mám dojem, že GeoGet používá interně tento mechanismus pro kompresi dat. Jen nevím, jestli by šlo z GG pluginu takovou vlastnost použít.
Viz http://www.sqlite.or...dableExtensions
  • 0

#10 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 19 únor 2011 - 11:25

Samozrejmne, ze do SQLite jsou pridavat funkce. Uz ted tam ma geoget pridane funkce na odstraneni diakritiky, kompresi a dekompresi dat, na regularni vyrazy a na prevod ciselneho datumu do formy, se kterou umi pracovat date funkce v sqlite.

Pridat ale funkci primo ze skriptu nejde a je otazka, jestli to vubec nekdy pujde. Nicmene pokud mas extension DLL, ktera v sbe tu funkcima, pak by to zavedeni pres SELECT load_extension('filename'); melo fungovat.
  • 0

#11 ToRo61

ToRo61

    Advanced Member

  • Members
  • PipPipPip
  • 416 příspěvků(y)

Publikováno 19 únor 2011 - 13:27

Děkuji všem za rady, ale některé poněkud přesahují mé IQ ;) Zeptal bych se ještě takhle... pokud bych chtěl z aktuálního Seznamu v GG vyexportovat vlastním exportním skriptem (což jsem jakž takž zvládl) i sloupec Vzdálenost, tak to taky musím počítat? Nebo to dostanu z nějaké proměnné?
  • 0

#12 a5884773

a5884773

    Advanced Member

  • Members
  • PipPipPip
  • 65 příspěvků(y)

Publikováno 19 únor 2011 - 16:28

neni. v sqlite jdou definovat user funkce. ale asi to je zybtečně složité stačí zaregistrovat funkci function regexp($exp, $pattern) { return (bool) preg_match("/$pattern/i", $exp); }. Jinak se to obejde bez sinu a kosu, lze užít linearni aproximaci pro male vzdalenosit
  • 0
STF INDEXX 2% VOLE

#13 ToRo61

ToRo61

    Advanced Member

  • Members
  • PipPipPip
  • 416 příspěvků(y)

Publikováno 19 únor 2011 - 20:50

HaLuMa napsal/a:
Samozrejmne, ze do SQLite jsou pridavat funkce. Uz ted tam ma geoget pridane funkce ....


Tak jsem se vzepjal k výkonu ;) a vlastní fci na spočítání vzdálenosti mám hotovou.
Z SQLite shellu ji nalouduji, jak jsi psal - díky. Ještě by mě zajímalo jak to má GG s těmi vlastními přidanými fcemi - to je taky louduje při každém startu GG?

Jo, a ještě by mě zajímal ten 'subselect na dvourozmerny souradnicovy index' jak jsi psal o pár příspěvků výše. Byl by nějaký praktický příklad?
  • 0

#14 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 19 únor 2011 - 21:48

ToRo61 napsal/a:
Ještě by mě zajímalo jak to má GG s těmi vlastními přidanými fcemi - to je taky louduje při každém startu GG?

ANo. Ty funkce nejsou ulzoeny v databazi, po kazdem otevreni databaze se tam musi zaregistrovat.


ToRo61 napsal/a:
Jo, a ještě by mě zajímal ten 'subselect na dvourozmerny souradnicovy index' jak jsi psal o pár příspěvků výše. Byl by nějaký praktický příklad?


SELECT key FROM coord_index WHERE minx>=:minx AND maxx<=:maxx AND miny>=:miny AND maxy<=:maxy

kde :minx :maxx :miny :maxy urcuji pozadovane rozsahy soyradnic Vlastne tak specifikujes obdelnik, a ono ti to vrati klice z tabulky Geocache tech kesi, ktere jsou uvnitr toho obdelniku.
  • 0

#15 mpistora

mpistora

    Advanced Member

  • Members
  • PipPipPip
  • 231 příspěvků(y)

Publikováno 22 únor 2011 - 21:48

'subselect na dvourozmerny souradnicovy index' je pozoruhodná věc. Zdá se, že je SQLite pro GeoGet jako dělaná.
Nenašel jsem tu o tom žádné zmínky, jen popis na http://www.sqlite.org/rtree.html. Nicmeně to je jen pro výběr, pro řazení, což byl původní dotaz, to asi moc použít nejde.

S řazením dle vzdálenosti, které se běžně používá i na gc.com, je ještě jiný praktický problém: Čím dále od počátku, tím více je nepěkné, že po sobě následují od sebe hodně vzdálené keše. Např. po keši vzdálené 5 km je keš vzdálená 5,1 km, ale protože je na zcela opačné straně, je od předešlé keše vzdálená 10 km.
Pro praktické použití by bylo lepší keše v seznamech řadit tak, že by nemusela strikně narůstat jejich vzdálenost od referenčního bodu, ale zato by platilo, že keše blízko u sebe ve výpisu, jsou i blízko ve skutečnosti. Řešit by to šlo procházením po nějaké vhodné spirále:
např. logaritmické:
Vložený obrázek
nebo dokonce Daisy:
Vložený obrázek
Jak to ale provést prakticky je trochu oříšek. :)
  • 0

#16 Pe_Bo

Pe_Bo

    Advanced Member

  • Members
  • PipPipPip
  • 432 příspěvků(y)

Publikováno 23 únor 2011 - 8:09

Zkusil jsem napsal SQLite extension jako DLL, je to celkem jednoduché. V SQLite Expert ho bez problému zavedu a použiju, ale v GG mi příkaz SELECT load_extension ('xxxx.dll') vrátí chybu "not authorized". Šlo by nějak zařídit, aby natažení fungovalo?
  • 0

#17 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 23 únor 2011 - 8:34

Aha, zapomnel jsem, ze tenhle druh nahravani musim nejdrive povolit. ;) Takze by to melo jit. Zkusim do pristi verze nezapomenout.
  • 0

#18 Pe_Bo

Pe_Bo

    Advanced Member

  • Members
  • PipPipPip
  • 432 příspěvků(y)

Publikováno 23 únor 2011 - 8:40

HaLuMa napsal/a:
Aha, zapomnel jsem, ze tenhle druh nahravani musim nejdrive povolit. ;) Takze by to melo jit. Zkusim do pristi verze nezapomenout.


To by bylo skvělé! Tím se otevírají netušené možnosti :)
  • 0

#19 mpistora

mpistora

    Advanced Member

  • Members
  • PipPipPip
  • 231 příspěvků(y)

Publikováno 23 únor 2011 - 10:14

Užitečné by bylo doplnit, jako externí, funkci PointDistance, aby se podmínka na vzdálenost, příp. řazení dle vzdálenosti, dalo dělat přímo v selectech.
  • 0

#20 HaLuMa

HaLuMa

    Autor Geogetu

  • Members
  • PipPipPip
  • 11 450 příspěvků(y)

Publikováno 23 únor 2011 - 10:18

PointDistance je pro tento ucel zbytecne presna a pomala funkce. Nicmene kdyz budes moci zavest vlastni extension, tak si tam muzes pridat i libovolnou vlastni funkci. Krom toho, kdyz budes mit tu extension DLL hotovou, tak si ji zavedes treba z konzole, nebo v libovolnem jinem programu.
  • 0




1 uživatel(ů) prochází toto téma

0 uživatelů, 1 návštěvníků 0 anonymních uživatelů

Reklama