Přejít na obsah






Fotka
* * * * * 1 hlasy

SQL&GG01: Challenge - 360 degrees of the Czech Republic

Příspěvek od tarmara , 14 leden 2014 · 13 258 Zobrazení

geoget návod

Bez dlouhých teoretických úvodů se pokusím poskytnout velmi jednoúčelové řešení, které vzniklo pro lepší plánování odlovu jedné jediné challnge keše GC4PCQB. Měl jsem problém s tím ověřovačem na project-cg.com, který sice umí zobrazit všechny keše v sektorech, ale jinak je uživatelsky velmi nepřívětivý. Seznam nelze nijak exportovat a pro mě jako uživatele GG je to skoro k ničemu. Databáze GG ale neumí jednoduše spustit SQL dotaz s goniometrickými funkcemi, takže bylo nutné vyřešit zabít dvě mouchy jednou ranou:

  • sepsat SQL dotaz, který bude umět vypsat keše v jednotlivých sektorech
  • výstup z tohoto dotazu nějak dostat do GG
První bod nebyl zase takový problém, znalosti SQL mám pro tehle případ dostatečné, do GG databáze se dostanu pohodlně pomocí http://www.sqliteexpert.com/ (stačí verze Personal) a níže uvedené knihovny s goniometrickými funkcemi.
Druhý bod se dal řešit exportem ID keší do ggt souboru a jeho otevřením v GG. Což ale není uživatelsky příjemné a neIT uživatel tím bude maličko trpět.
Takže následovalo přemýšlení, bádání, testování a objevování Ameriky. Nakonec se ale podařilo. U pluginu SmartFilter jsem maličko pozměnil jeho zdrojový kód, takže si uměl přilinkovat knihovnu a pak už jen stačilo uložit SQL dotaz do správného souboru a řešení je na světě. Snad se bude někomu hodit a třeba i někomu ukáže cestu k netušeným možnostem GG databáze.
Postup je následující:
  • nainstalovat do GG plugin SmartFilter (SF) - http://geoget.ararat...ipt:smartfilter
  • stáhnout zip soubor s knihovnou pro SQLite s goniometrickými funkcemi - http://cran.r-projec...tfuns_0.0.1.zip - informace o projektu na http://cran.r-projec...funs/index.html - na Rkovém serveru už bohužel není k dispozici - alternativní stažení (vč. knihovny na de-kompresi textů - např listingů) zde
  • otevřit si instalačni adresář SF - býva to <%datovy_adresar_GG%>\script\SmartFilter\ - pokud adresář nemužete najít, zkuste najít soubor SmartFilter.ggp.pas a naleznete i adresář
  • do tohoto adresáře nakopírujte celý adresář RSQLite.extfuns z výše staženého zip souboru
  • upravte zdrojový kód SF (soubor SmartFilter.ggp.pas) přidáním řádky obsahující nalinkování knihovny s goniometrickými funkcemi. Bez tohoto nebude SQLite schopen spustit níže uvedený SQL dotaz, protože SQLite v základu neobsahuje funkce jako sinus a cosinus. Toto provedete tak, že otevrete soubor SmartFilter.ggp.pas v nejakém textovém editoru (notepad, PSPad; nedoporučuji Word!) a najdete řádek obsahují následující príkaz:
    tabCache:=Geoget_DB.GetTable(Query, false);
    Měl by se nacházet někde kolem řádku 770. Přímo NAD! tento řádek přidejte následující příkaz:
  • tabCache:=Geoget_DB.GetTable('SELECT load_extension(''.\script\SmartFilter\RSQLite.extfuns\libs\i386\RSQLite.extfuns.dll'');', false);
    Nic nemažte, nic nepřepisujte, jen a pouze nakopírujte ten nový príkaz NAD ten stávající. A soubor uložte. Celá tahle operace umožní SQLite používat goniometrické funkce při spracování SQL dotazu.
  • Do stejného adresáře jako SmartFilter.ggp.pas uložte i nový textový soubor Challenge360.sql, do kterého v textovém editoru vložíte následující SQL dotaz:
    --TENTO SQL DOTAZ VRATI KESE ZE VSECH (POKUD SE NEUPRAVI, VIZ NIZE) SEKTORU, KTERE JESTE NEMATE ULOVENE
    --UVODNI SOURADNICE (X_BASE A Y_BASE) JSOU Z CHALLENGE KESE PRO KTEROU BYL TENTO DOTAZ PRIMARNE NAPSAN - GC4PCQB
    SELECT ID --, NAME, FLOOR(BEARING) SEKTOR, ROUND(BEARING, 5) BEARING
      FROM (SELECT ID,
                   NAME,
                   ANGLE / PI() * 180 A,
                   CASE
                     WHEN (ANGLE / PI() * 180) < 0 THEN
                      360 + (ANGLE / PI() * 180)
                     ELSE
                      ANGLE / PI() * 180
                   END BEARING
              FROM (SELECT ID,
                           NAME,
                           ATAN2(SIN((Y * PI() / 180) - (Y_BASE * PI() / 180)) *
                                 COS(X * PI() / 180), COS(X_BASE * PI() / 180) *
                                  SIN(X * PI() / 180) -
                                  SIN(X_BASE * PI() / 180) *
                                  COS(X * PI() / 180) *
                                  COS((Y * PI() / 180) -
                                      (Y_BASE * PI() / 180))) ANGLE
                      FROM (
                            --NOT FOUND AND NOT ARCHIVED
                            SELECT DISTINCT ID,
                                             NAME,
                                             X,
                                             Y,
                                             49.74375 X_BASE,
                                             15.33863 Y_BASE
                              FROM GEOCACHE
                             WHERE DTFOUND = 0 AND
                                   COUNTRY = 'Czech Republic' AND
                                   CACHESTATUS <> 2)))
     WHERE
    --FLOOR(BEARING) IN (90,5,132) AND --POKUD CHCETE JEN URCITE SEKTORY, ODKOMENTOVAT RADEK (SMAZTE PRVNÍ DVE POMLCKY NA ZACÁTKU) A ZAPSAT SEM CISLA SEKTORU ODDELOVAT CARKOU A NEZALEZI NA JEJICH PORADI  
     FLOOR(BEARING) NOT IN
     ( --NEZOBRAZI KESE V SEKTORECH VE KTERYCH UZ JE ZAZNAMENANY NALEZ UZIVATELEM
      --NALEZENE SEKTORY START---------------------------------- 
      SELECT DISTINCT FLOOR(BEARING)
      --ID,NAME
        FROM (SELECT ID,
                      NAME,
                      ANGLE / PI() * 180 A,
                      CASE
                        WHEN (ANGLE / PI() * 180) < 0 THEN
                         360 + (ANGLE / PI() * 180)
                        ELSE
                         ANGLE / PI() * 180
                      END BEARING
                 FROM (SELECT ID,
                              NAME,
                              ATAN2(SIN((Y * PI() / 180) - (Y_BASE * PI() / 180)) *
                                    COS(X * PI() / 180), COS(X_BASE * PI() / 180) *
                                     SIN(X * PI() / 180) -
                                     SIN(X_BASE * PI() / 180) *
                                     COS(X * PI() / 180) *
                                     COS((Y * PI() / 180) -
                                         (Y_BASE * PI() / 180))) ANGLE
                         FROM (
                               --FOUND
                               SELECT DISTINCT ID,
                                                NAME,
                                                X,
                                                Y,
                                                49.74375 X_BASE,
                                                15.33863 Y_BASE
                                 FROM GEOCACHE
                                WHERE DTFOUND <> 0 AND
                                      COUNTRY = 'Czech Republic')))
      --NALEZENE SEKTORY END-----------------------------------
      )
    --ORDER BY 3 DESC
  • Pak už stačí jen spustit GG, v nem SF a v dialogovém okně vlevo dole vybrat ze seznamu Vlastní SQL to správné Challenge360 a filtr aplikovat (Načíst, Přidat...)
  • Challenge360.sql lze pak bez problému editovat dle libosti, treba vybírat jen určité sektory, dle instrukcí v komentářích. Po každé změně je ale nutné znovu spustit SF s vybraným Vlastním SQL.
autor SF o téhle editaci ví, souhlasí s ní. Neplánuje žádny dalši vývoj, ale kdyby přeci jen, tak se po aktualizaci bude muset znovu upravit zdroják SF přidáním té řádky kódu. A velké díky patří testovací veverce - kolombovi.

 

Pokud by byl v kačerské komunitě zájem o seriál na téma SQL a jeho použití v GeoGetu, tak zkusím sepsat nějaké základy. Pokud by měl někdo námět na podobný jednoúčelový návod jako je v tomto příspěvku, tak se také ozvěte. Z témat které mám v zásobě: dohledání chybějících pro GC4HZQ8; chybějící položky v D/T81 matrixu - oboje vztažené na již nalezené keše aktuálního uživatele GG.

 

Doplnění po tom co jsem zjistil, že v Praze vznikla podobná keš s omezením na vybrané okresy. Pro http://coord.info/GC56R49 použijte následující dotaz (omezení na CZ Okres tag je uděláno takto humpolácky, protože SF měl nějaký problém s kódováním, ale na funkci to nemá vliv):

--TENTO SQL DOTAZ VRATI KESE ZE VSECH (POKUD SE NEUPRAVI, VIZ NIZE) SEKTORU, KTERE JESTE NEMATE ULOVENE
--UVODNI SOURADNICE (X_BASE A Y_BASE) JSOU Z CHALLENGE KESE PRO KTEROU BYL TENTO DOTAZ PRIMARNE NAPSAN - GC56R49
SELECT ID, NAME, FLOOR(BEARING) SEKTOR, ROUND(BEARING, 5) BEARING, OKRES
  FROM (SELECT ID,
               NAME,
               ANGLE / PI() * 180 A,
               CASE
                 WHEN (ANGLE / PI() * 180) < 0 THEN
                  360 + (ANGLE / PI() * 180)
                 ELSE
                  ANGLE / PI() * 180
               END BEARING,
               OKRES
          FROM (SELECT ID,
                       NAME,
                       ATAN2(SIN((Y * PI() / 180) - (Y_BASE * PI() / 180)) *
                             COS(X * PI() / 180), COS(X_BASE * PI() / 180) *
                              SIN(X * PI() / 180) -
                              SIN(X_BASE * PI() / 180) *
                              COS(X * PI() / 180) *
                              COS((Y * PI() / 180) -
                                  (Y_BASE * PI() / 180))) ANGLE,
                       OKRES
                  FROM (
                        --NOT FOUND AND NOT ARCHIVED
                        SELECT DISTINCT C.ID,
                                         C.NAME,
                                         C.X,
                                         C.Y,
                                         50.07977 X_BASE,
                                         14.42973 Y_BASE,
                                         T.ID,
                                         V.VALUE  OKRES
                          FROM GEOCACHE C
                          LEFT JOIN (SELECT *
                                       FROM GEOTAG
                                      WHERE PTRKAT = 11 /*key CZ Okres*/
                                     ) T
                            ON C.ID = T.ID
                          LEFT JOIN GEOTAGVALUE V
                            ON T.PTRVALUE = V.KEY
                         WHERE DTFOUND = 0 AND
                               COUNTRY = 'Czech Republic' AND
                               CACHESTATUS <> 2)))
 WHERE OKRES LIKE '%Praha%' AND
      --FLOOR(BEARING) IN (90,5,132) AND --POKUD CHCETE JEN URCITE SEKTORY, ODKOMENTOVAT RADEK (SMAZTE PRVNÍ DVE POMLCKY NA ZACÁTKU) A ZAPSAT SEM CISLA SEKTORU ODDELOVAT CARKOU A NEZALEZI NA JEJICH PORADI  
       FLOOR(BEARING) NOT IN
       ( --NEZOBRAZI KESE V SEKTORECH VE KTERYCH UZ JE ZAZNAMENANY NALEZ UZIVATELEM
        --NALEZENE SEKTORY START---------------------------------- 
        SELECT DISTINCT FLOOR(BEARING)
        --ID,NAME
          FROM (SELECT ID,
                        NAME,
                        ANGLE / PI() * 180 A,
                        CASE
                          WHEN (ANGLE / PI() * 180) < 0 THEN
                           360 + (ANGLE / PI() * 180)
                          ELSE
                           ANGLE / PI() * 180
                        END BEARING
                   FROM (SELECT ID,
                                NAME,
                                ATAN2(SIN((Y * PI() / 180) -
                                          (Y_BASE * PI() / 180)) *
                                      COS(X * PI() / 180), COS(X_BASE * PI() / 180) *
                                       SIN(X * PI() / 180) -
                                       SIN(X_BASE * PI() / 180) *
                                       COS(X * PI() / 180) *
                                       COS((Y * PI() / 180) -
                                           (Y_BASE * PI() / 180))) ANGLE
                           FROM (
                                 --FOUND
                                 SELECT DISTINCT ID,
                                                  NAME,
                                                  X,
                                                  Y,
                                                  50.07977 X_BASE,
                                                  14.42973 Y_BASE
                                   FROM GEOCACHE
                                  WHERE DTFOUND <> 0 AND
                                        COUNTRY = 'Czech Republic')))
        --NALEZENE SEKTORY END-----------------------------------
        )
--ORDER BY 3 DESC
;


Protože někteří kačeři měli s tímto řešením počáteční problémy doplňuji i nějaký ten troubleshooting (budu průběžně doplňovat):
  • Project-gc.com chekery a moje řešení používá k výpočtu úhlů metodu zvanou Great Circle. Je to medoda výpočetně nenáročná, vyjádřitelná jedním vzorcem. Geoget a nad ním postavený Stator (a možná i jiné pluginy) používají Vincentyho metodu. Ta je výpočetně mnohem náročnější, protože je iterační a nedá se tak zapsat jedním vzorcem. Je však mnohem přesnější, protože místo aproximace Země koulí používá WGS84 geoid. Rozdíly ve vysledcích jsou pozorovatelné už i na České republice. Funkce pro Vincentyho metodu pro SQLite jsem zatím neobjevil a ani ji nevytvořil....ale přijde den...
  • Pokud se Vám objeví následující chyba
    [Script Runtime Error]: SmartFilter.ggp.pas
    Exception: Could not retrieve data
    SQLITE_ERROR [1]: The specified module could not be found.
    SELECT load_extension('.\script\SmartFilter\RSQLite.extfuns\libs\i386\RSQLite.extfuns.dll');
    Routine: PLUGINSTART
    
    tak máte špatně umístěnou RSQLite knihovnu. Zkontrolujte zda máte správně nakopírovaný adresář z bodu 4, případně upravte cestu ke knihovně v bodu 5. Tohle je hodně obecná věc, ale nejsem schopen postihnout všechny možné varianty jak máte nakonfigurovaný GG.
  • Objevila se i chyba
    SmartFilter.ggp.pas,
    Exception: index seznamu je mimo hranice (-1),
    Routine: Pluginstart.
    
    zde uživateli pomohlo přepnout v SF volbu "Keše" (ne defaultní "Keše a waypointy"). Nevím proč a neříkám, že to na tuhle chybu pomůže vždy, protože mě to například funguje i s "Keše a waypointy".



  • 4



Opravdu je nutne linkovat knihovnu pomoci SELECTu? A dochazi nekde k uvolneni tabCache?

 

Asi by nemel byt problem doplnit do Combine prikaz pro prilinkovani "libovolne" knihovny a pak by to mohlo byt relativne univerzalni. SQL jde ulozit do souboru, spustit v davce, ...

    • 0

Ano, mohl jsem se naucit delat s Combine, stjne jako jsem mohl oprasit a rozsirit sve znalosti Pascalu a udelat to cele bez pouziti te knihovny jen nejakym skriptem. K obojimu mozna casem dojde u nejakeho slozitejsiho problemu. Ale v beznem zivote se zivim jako DB/BI specialista a proto je mi psani SQL dotazu nejblizsi a zvolil jsem tuto cestu. Nerikam, ze je nejefektivnejsi, ale z uzivatelskeho hlediska se mi zda celkem prijemna a po pocatecnim nastaveni (prilinkovani knihovny do SF) lze cele reseni pouzivat (v kombinaci s vlastnimi SQL dotazy) celkem univerzalne.

    • 0

Abychom si rozumneli, ja ti to nevytykam. Dokonce jsem ani nemyslel, ze v tom Combine bys to mel delat ty. Myslel jsem to jako praci pro sebe - vysledkem by byl obecny mechanismus pro jakoukoli knihovnu, ne jen pro tuto. To bylo mysleno tou univerzalitou. V kazdem pripade jsi udelal kus prace a prinejmensim proslapal dalsi cesticku k rozvoji.

    • 0

Ja bych to i klidne jako opravnenou vytku bral, protoze chapu, ze vy lidicky co se kolem GG motate mate svoje zabehane procesy a kdyz vam zacne do dila nekdo dupat jak slon v porcelanu, tak se tomu budete malicko branit. A z meho pohledu opravnene. Taky nemam rad, kdyz mi nekdo rusi zabehane poradky a navic vil, ze jako bastlir-eklektik obcas jdu sice cestou nejmensiho odporu, ale ne tou nejlepsi. A pak se rad od zkusenejsich priucim.

Treba ted zrovna zjistuju, co by mohlo znamenat "SmartFilter.ggp.pas, Exception: index seznamu je mimo hranice (-1), Routine: Pluginstart." pri spusteni vyse uvedeneho dotazu v SF. U me i u kolomba to funguje, ale ted se mi ozval uzivatel, ze mu to vraci tuhle chybu (po aplikaci filtru pomoci SF). Knihovnu ma nalinkovanou zda se spravne (to by vracelo jinou chybu). Ma sice 64b win7 a cesta ke knihovne je k 32b ale to by taky vracelo jinou chybu.

    • 0

Jednoznacne to znamena, ze se vyvolava prvek pole s indexem -1, coz je mimo hlanice. Ovsem proc a kde, to fakt na dalku muze rict akorat Sybila.

 

Ad knihovna: zabehane procesy jsou fajn, ale toto podle me do toho nespada. Navic vubec neni na skodu novy pohled "nezasveceneho". Casto to prinese necekane vysledky. Za sebe - jsem rad, ze se nekdo pusti do vyvoje, je ochoten pro ostatni take neco udelat. Tvuj prispevek, kdyz nikde jinde, tak je prave na poli te nove proslapane cesticky k nalinkovani knihovny. Pokud si o tom chces povidat, nebranim se. Ale do blogu uz to asi nepatri.

    • 0
Fotka
Bubaczech Gang
led 15 2014 22:40

Tak se mi to podařilo rozchodit, pořád mi to nešlo, až jsem upravil cestu k tomu RSQLite.extfuns.dll

 

Dík.

    • 0

Je, z toho by mohl byt klidne samostatny plugin. Jen to vhodne parametrizovat a uz tu je plugin pro 360 degrees chalange kese ;-)

    • 0

Díky za návod. Podařilo se mi to rozchodit na první pokus... Teď už jen vybrat právě tu jednu keš z každé "červené" výseče k odlovu. Jde to udělat nějak automaticky (např. vybrat z každé výseče tu nejbližší ke středu) nebo už nezbývá nic jinýho než ruční mravenčí práce?

    • 0

 Jde to udělat nějak automaticky (např. vybrat z každé výseče tu nejbližší ke středu)

Všechno jde, jen je potřeba naspecifikovat co bys chtěl. Nejblíže k jakému středu?? Středu challenge?? Má to být 1/1 tradička. Nebo tomá být z každého sektoru 2/2 mysterka nejbližší tvým HC?? Jen se bojím, že v SQLite budu při vývoji asi pronášet spoustu nehezkých slov, protože v Oraclu jde vše a ještě trochu víc... :)

    • 0

Střed - střed ČR = výchozí souřadnice challenge.

Vlastně mám 3 další omezující podmínky pro výběr keší: 1. jen tradiční, 2. terén max 4, 3. nejbližší k výchozím souřadnicím challenge. Body 1 a 2 jsem se svými povrchními znalostmi sql zvládl, ale bod 3 už asi bude vyšší dívčí...

    • 0

tak na to uz je nutne pouzivat agregace a cely dotaz priohnout. Zacnu sepisovat SQL teorii od zakladu, a urcite se k tomu dostaneme...nejdrive musis najit pro kazdy sektor vzdalenost nejblizsi kese a pak tu kes dohledat...bohuzel zadne OVER PARTITION konstrukce nejdou v sqlite (pokud to zase nebude podporovat nejaka pridana knihovna) pouzit, takze zpatky na SQL stromy

    • 0

Abychom si rozumneli, ja ti to nevytykam. Dokonce jsem ani nemyslel, ze v tom Combine bys to mel delat ty. Myslel jsem to jako praci pro sebe - vysledkem by byl obecny mechanismus pro jakoukoli knihovnu, ne jen pro tuto. To bylo mysleno tou univerzalitou. V kazdem pripade jsi udelal kus prace a prinejmensim proslapal dalsi cesticku k rozvoji.

 

Pokuid budes delat v combine (nebo kdekoliv jinde) linkovani knihoven, pridej tam i moznost nastaveni promennych prostredi pro danou davku kombine, protoze nektere knihovny bohuzel bez toho nerozjedes :-(

    • 0

Ahoj, zkousel jsi udelat to same i pro 360 st. Prahy? Respektive nekdo jiny? Presto ze jsem tohle nedokazala zcela ovladat (dost mozna na vine i to, ze si moc nerozumim s geogetem), tak se mi podarilo diky tvemu navodu vydolovat z GG pouzitelne vysledky a moc by se mi to hodilo i na Prahu :-). Diky!

    • 0

Pro GeoGet existuje plugin, ktery to dela. Jako souradnice pouziva referencni bod, takze si to muzes udelat odkud se ti zlibi.

    • 0

Majus, pro Prazskou challnge uz tu je asi 14 dnidoplneny SQL dotaz. Zkus ji jeste jednou precist cely prispevek.... pokud bys mela jeste nejake problemy, tak dej vedet.

    • 0

A Gordma pravdu,pro GG je plužin,ale je dulezite v nem vybrat spravnou metodu vypoctu aby topak sedelo na project-gc.com,ktery obsluhuje ten challenge checker a ktery pouziva Great Circle metodu. I kdyz u Prahy zase takova odchylka nebude.

    • 0

Majus, pro Prazskou challnge uz tu je asi 14 dnidoplneny SQL dotaz. Zkus ji jeste jednou precist cely prispevek.... pokud bys mela jeste nejake problemy, tak dej vedet.

Tak to jsme uplne prehlidla, snazila jsem se to hledat na foru pomoci vyhledavani, ale to se nedarilo, omlouvam se a diky :-).

    • 0

Po přečtení druhého dílu jsem se podíval na první. Knihovny v SQL mi moc neříkají, ale řešily by to, o co jsem se snažil, výpočet vzdálenosti, kdy SQlite neumí v základu ani mocninu a odmocnicnu. Mocninu jsem nahradil a odmocninu jsem nakonec nepotřeboval.

Ale já to nechtěl v SQliteExpertPersonal, ale přímo v Geogetu.

    • 0

V GG je tu popsano pouziti pomoci SmartFiltru. Tam si muzes prilinkovat knihoven co hrdlo raci. Ale je to omezene tim, ze pak muzes pouzivat sve SQL dotazy pouze pres SF. Na co presne bys to nekde jinde v GG potreboval??

    • 0

V GG se s knihovnami da take pracovat, Combine ti umozni knihovnu prilinkovat a pak mohou SQL knihovnu pouzivat.

    • 1

Březen 2024

P Ú S Č P S N
    123
45678910
11121314151617
18192021222324
252627 28 293031

Poslední komentáře

Reklama