Přejít na obsah


Fotka

Vincenty SQL

geoget

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

#21 HaLuMa

HaLuMa

    Autor Geogetu

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

Publikováno 01 November 2017 - 12:33

Kdybych byl byval nekdy nejakou tu Sqlite extension v DLL delal, tak bych ti tu knihopvnu bleskurychle vyrobil.

Sice v GG rozsiruji funkce Sqlite, ale nemam nastudovano, co obnasi ta separe DLL knihovna.

 

Mrknu se na to, pokud by to nebylo neco sileneho, tak by to nemusel byt velky problem. Pokud to ale bude slozitejsi, tak na to asi nenajdu cas. :-/


  • 0

#22 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 12:36

Zkoušel jsem to PDF přilinkovat a nic... :)


:P :D


Tohle už jsem četl před 2 lety, problem je v tom, že je to knihovna ze specializovaného SW, nikde jsem ji nenašel jako binární soubor. A ani jsem nikde nenašel ten SW ke stažení (i ilegálně). Pokud by se mezi kačery našel letecký inženýr používající tenhle telemetrický SW (nebo co je to zač), tak by mohl tu knihovnu vyextrahovat....


Co tohle, je tam i dll: http://www.gavaghan....centys-formula/


  • 0

#23 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 12:43

Céčkové zdrojáky jsou i zde: https://github.com/pkohut/GeoFormulas


  • 0

#24 HaLuMa

HaLuMa

    Autor Geogetu

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

Publikováno 01 November 2017 - 12:44

hm, tak nejmene prace bude, kdyz to nekdo vysmahne v Ccku. Ja bych musel nekdriv trochu rozlousknout potrebny SQlite API a prelozit to do pascalu. Cckovy programator muze pouzit pripravena makra...


  • 0

#25 tarmara

tarmara

    Air-cooled

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

Publikováno 01 November 2017 - 12:46

:P :D



Co tohle, je tam i dll: http://www.gavaghan....centys-formula/

DLL tam je...ale asi jen s třídama a já jsem starej procedurální dinosaurus, který se do objektového věku ještě neevolvoval. Takže i kdybych tu extension k SQLite připojil, tak bych třídu neuměl zavolat (natož naplnit parametry)...prostě tam nejsou funkce..

Koukal jsem na Visual Studio Code, jestli by tam neslo neco napsat a pak zkompilovat do dll. S tim asi nikdo zkusenosti nemate, co? Asi bych se to i naucil, ale nechci nejaky SW co se musi instalovat a pak v nem nastavovat milion veci abych udelal jednu knihovnu s max 10 funkcemi...


  • 0

#26 HaLuMa

HaLuMa

    Autor Geogetu

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

Publikováno 01 November 2017 - 12:47

aby nedoslo k nedorozumneji... tam nejde o to to sehnat v nejakem DLL. Ale o tom, to sehnat jako Loadable Extension pro SQlite, ktere je sice v podobe DLL, ale musi mit nejaky konkretni interface, aby to Sqlite pobralo.

 

Samotne vypocetni rutiny jsou k dispozici v mnoha jazycich...


  • 0

#27 tarmara

tarmara

    Air-cooled

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

Publikováno 01 November 2017 - 12:52

aby nedoslo k nedorozumneji... tam nejde o to to sehnat v nejakem DLL. Ale o tom, to sehnat jako Loadable Extension pro SQlite, ktere je sice v podobe DLL, ale musi mit nejaky konkretni interface, aby to Sqlite pobralo.

AHA, dobrá a důležitá připomínka. Jinak pokud byste se někdo do vývoje pouštěl, tak dejte vědět Gordovi...asi na tom začne dělat taky...časem...až bude mít čas....


Tento příspěvek byl upraven od tarmara: 01 November 2017 - 12:54

  • 0

#28 Pe_Bo

Pe_Bo

    Advanced Member

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

Publikováno 01 November 2017 - 13:05

Napiš mi jaké funkce chceš (jména + parametry) a já ti to DLL udělám.

 

Ale nemám ověřené C funkce toho algoritmu (jsou dvě, jestli se nepletu - direct a inverse).


  • 0

#29 gord

gord

    Advanced Member

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

Publikováno 01 November 2017 - 14:03

AHA, dobrá a důležitá připomínka. Jinak pokud byste se někdo do vývoje pouštěl, tak dejte vědět Gordovi...asi na tom začne dělat taky...časem...až bude mít čas....

 

Neni treba mi davat extra vedet, sleduju to tady :-) Kdyz se toho Pe_Bo ujme, s velkou pravdepodovnosti to bude driv nez se k tomu vubec dostanu.


  • 0

MHD/PID vybranych mest CR jako POI (diskuse)
GeoGet:
- Combine - automatizace opakovanych cinnosti (diskuse, dávky)

Stator - statistiky y GeoGetu (diskuse)

- Spoiler - uložení spoilerů do GPS jako POI (diskuse)

- Náhrada GJ legálními postupy

 


#30 tarmara

tarmara

    Air-cooled

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

Publikováno 01 November 2017 - 14:27

@Pe_Bo - Ideálně udělat funkce vracející jednu hodnotu - nevím jestli SQLite zvládne jako výsledek pole. Pokud to umí a uděláš k tomu pak příklad tak klidně udělej dvě fce co budou vracet pole.

 

distance(lat_start, lon_start, lat_end, lon_end) - vrací vzdálenost mezi body - jednotky nechám na autorovi, každopádně klidně nechat vyšší přesnost, nezaokrouhlovat výsledek

azimut_start(lat_start, lon_start, lat_end, lon_end) - výchozí azimut, hodnota ideálně ve stupních mezi 0 a 360 - nezaokrouhlovat

azimut_end(lat_start, lon_start, lat_end, lon_end) - koncový azimut, hodnota ideálně ve stupních mezi 0 a 360 - nezaokrouhlovat

project_lat(lat, lon, azimut_start, distance) - projekce bodu - latitude - hodnota ideálně ve stupních mezi -180 a 180 - nezaokrouhlovat

project_lon(lat, lon, azimut_start, distance) - projekce bodu - longitude - hodnota ideálně ve stupních mezi -180 a 180 - nezaokrouhlovat

 

A jako teaser. Vincentyho metoda v aplikaci nad GG db a GC4PCQB

WITH/* --360°challenge CZ */ params AS (
   SELECT id,
          7 cnt,/* počet Vincentyho iterací - lambdaDiff by mělo být <1E-12 */
          49.74375 x1,
          15.33863333 y1,/* CZ N 49° 44.625 E 015° 20.318 - 49.74375 15.33863333 */
          x x2,
          y y2,
          6378.137 a,
          6356.752314245 b/* Semi-major axis	a	= 6378137.0	metres
Semi-minor axis	b	≈ 6356752.314245	metres
Inverse flattening	1/f	= 298.257223563 
kontrola výpočtu provedena https://www.ngs.noaa.gov/cgi-bin/Inv_Fwd/inverse2.prl
http://www.movable-type.co.uk/scripts/latlong-vincenty.html */
     FROM geocache/* WHERE cachestatus<>2-- <> 0 */
    WHERE country = 'Czech Republic'
),
iteration (
   id,
   cnt,
   a,
   b,
   f,
   x1,
   y1,
   x2,
   y2,
   fi1,
   lambda1,
   fi2,
   lambda2,
   L,
   tanU1,
   tanU2,
   cosU1,
   cosU2,
   sinU1,
   sinU2,
   lambda,
   sinSigma,
   cosSigma,
   sigma,
   sinAlfa,
   cosSqAlfa,
   cos2SigmaM,
   C,
   lambdaIter,
   lambdaDiff
)
AS (
   SELECT id,
          1 cnt,
          a,
          b,
          ( (a - b) / a) f,
          x1,
          y1,
          x2,
          y2,
          (x1 * PI() / 180) fi1,/* fí latitude */
          (y1 * PI() / 180) lambda1,/* lambda longitude */
          (x2 * PI() / 180) fi2,
          (y2 * PI() / 180) lambda2,
          ( (y2 * PI() / 180) - (y1 * PI() / 180) ) L,
          (1 - ( (a - b) / a) ) * tan( (x1 * PI() / 180) ) tanU1,
          (1 - ( (a - b) / a) ) * tan( (x2 * PI() / 180) ) tanU2,
          1 / (sqrt(1 + ( (1 - ( (a - b) / a) ) * tan( (x1 * PI() / 180) ) ) * ( (1 - ( (a - b) / a) ) * tan( (x1 * PI() / 180) ) ) ) ) cosU1,
          1 / (sqrt(1 + ( (1 - ( (a - b) / a) ) * tan( (x2 * PI() / 180) ) ) * ( (1 - ( (a - b) / a) ) * tan( (x2 * PI() / 180) ) ) ) ) cosU2,
          ( (1 - ( (a - b) / a) ) * tan( (x1 * PI() / 180) ) ) * (1 / (sqrt(1 + ( (1 - ( (a - b) / a) ) * tan( (x1 * PI() / 180) ) ) * ( (1 - ( (a - b) / a) ) * tan( (x1 * PI() / 180) ) ) ) ) ) sinU1,
          ( (1 - ( (a - b) / a) ) * tan( (x2 * PI() / 180) ) ) * (1 / (sqrt(1 + ( (1 - ( (a - b) / a) ) * tan( (x2 * PI() / 180) ) ) * ( (1 - ( (a - b) / a) ) * tan( (x2 * PI() / 180) ) ) ) ) ) sinU2,
          ( (y2 * PI() / 180) - (y1 * PI() / 180) ) lambda,
          0 sinSigma,
          0 cosSigma,
          0 sigma,
          0 sinAlfa,
          0 cosSqAlfa,
          0 cos2SigmaM,
          0 C,
          ( (y2 * PI() / 180) - (y1 * PI() / 180) ) lambdaIter,
          0 lambdaDiff
     FROM params
   UNION ALL
   SELECT id,
          cnt + 1 cnt,
          a,
          b,
          f,
          x1,
          y1,
          x2,
          y2,
          fi1,
          lambda1,
          fi2,
          lambda2,
          L,
          tanU1,
          tanU2,
          cosU1,
          cosU2,
          sinU1,
          sinU2,
          lambdaIter lambda,
          (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) sinSigma,
          (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) cosSigma,
          (atan2( (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ), (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) ) ) sigma,
          (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ) sinAlfa,
          (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) cosSqAlfa,
          (CASE/* osetreni pokud se pocita czdalenost na rovniku -> deleni nulou */ WHEN (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) = 0 THEN 0 ELSE ( (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) - 2 * ( (sinU1 * sinU2) / (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) END) cos2SigmaM,
          f / 16 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) * (4 + f * (4 - 3 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) C,
          (L + (1 - (f / 16 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) * (4 + f * (4 - 3 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) ) ) * f * (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ) * ( (atan2( (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ), (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) ) ) + (f / 16 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) * (4 + f * (4 - 3 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) ) * (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) * ( (CASE/* osetreni pokud se pocita czdalenost na rovniku -> deleni nulou */ WHEN (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) = 0 THEN 0 ELSE ( (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) - 2 * ( (sinU1 * sinU2) / (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) END) + (f / 16 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) * (4 + f * (4 - 3 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) ) * (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) * ( -1 + 2 * power( (CASE/* osetreni pokud se pocita czdalenost na rovniku -> deleni nulou */ WHEN (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) = 0 THEN 0 ELSE ( (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) - 2 * ( (sinU1 * sinU2) / (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) END), 2) ) ) ) ) lambdaIter,
          (L + (1 - (f / 16 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) * (4 + f * (4 - 3 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) ) ) * f * (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ) * ( (atan2( (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ), (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) ) ) + (f / 16 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) * (4 + f * (4 - 3 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) ) * (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) * ( (CASE/* osetreni pokud se pocita czdalenost na rovniku -> deleni nulou */ WHEN (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) = 0 THEN 0 ELSE ( (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) - 2 * ( (sinU1 * sinU2) / (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) END) + (f / 16 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) * (4 + f * (4 - 3 * (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) ) * (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) * ( -1 + 2 * power( (CASE/* osetreni pokud se pocita czdalenost na rovniku -> deleni nulou */ WHEN (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) = 0 THEN 0 ELSE ( (sinU1 * sinU2 + cosU1 * cosU2 * cos(lambdaIter) ) - 2 * ( (sinU1 * sinU2) / (1 - power( (cosU1 * cosU2 * sin(lambdaIter) / (sqrt(power( (cosU2 * sin(lambdaIter) ), 2) + power( (cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ), 2) ) ) ), 2) ) ) ) END), 2) ) ) ) ) - lambda lambdaDiff
     FROM iteration
    WHERE cnt < (
                   SELECT DISTINCT cnt
                     FROM params
                )
),
vincenty AS (
   SELECT id,
          x1,
          y1,
          x2,
          y2,
          distance,
          bearing,
          floor(bearing) bearing_int,
          bearing_fin/* hodnota je ve směru DO cílového bodu - pro zpětný nutno připočíst 180st */,
          lambdaDiff
     FROM (
             SELECT *,
                    (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) uSq,
                    (1 + ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 16384) * (4096 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -768 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (320 - 175 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) bigA,
                    ( ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 1024) * (256 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -128 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (74 - 47 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) bigB,
                    ( ( ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 1024) * (256 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -128 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (74 - 47 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) * sinSigma * (cos2SigmaM + ( ( ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 1024) * (256 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -128 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (74 - 47 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) / 4) * (cosSigma * ( -1 + 2 * power(cos2SigmaM, 2) ) - ( ( ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 1024) * (256 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -128 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (74 - 47 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) / 6) * cos2SigmaM * ( -3 + 4 * power(sinSigma, 2) ) * ( -3 + 4 * power(cos2SigmaM, 2) ) ) ) ) deltaSigma,
                    b * (1 + ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 16384) * (4096 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -768 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (320 - 175 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) * (sigma - ( ( ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 1024) * (256 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -128 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (74 - 47 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) * sinSigma * (cos2SigmaM + ( ( ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 1024) * (256 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -128 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (74 - 47 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) / 4) * (cosSigma * ( -1 + 2 * power(cos2SigmaM, 2) ) - ( ( ( (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) / 1024) * (256 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * ( -128 + (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) * (74 - 47 * (cosSqAlfa * ( (power(a, 2) - power(b, 2) ) / power(b, 2) ) ) ) ) ) ) / 6) * cos2SigmaM * ( -3 + 4 * power(sinSigma, 2) ) * ( -3 + 4 * power(cos2SigmaM, 2) ) ) ) ) ) distance,
                    CASE WHEN (180 / PI() * atan2(cosU2 * sin(lambdaIter), cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ) ) < 0 THEN 360 + (180 / PI() * atan2(cosU2 * sin(lambdaIter), cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ) ) ELSE (180 / PI() * atan2(cosU2 * sin(lambdaIter), cosU1 * sinU2 - sinU1 * cosU2 * cos(lambdaIter) ) ) END bearing,
                    CASE WHEN (180 / PI() * atan2(cosU1 * sin(lambdaIter), -sinU1 * cosU2 + cosU1 * sinU2 * cos(lambdaIter) ) ) < 0 THEN 360 + (180 / PI() * atan2(cosU1 * sin(lambdaIter), -sinU1 * cosU2 + cosU1 * sinU2 * cos(lambdaIter) ) ) ELSE (180 / PI() * atan2(cosU1 * sin(lambdaIter), -sinU1 * cosU2 + cosU1 * sinU2 * cos(lambdaIter) ) ) END bearing_fin
               FROM iteration
              WHERE cnt = (
                             SELECT DISTINCT cnt
                               FROM params
                          )
          )
),
loop (
   cnt
)
AS (
   SELECT 0 cnt
   UNION ALL
   SELECT cnt + 1/* čítač */
     FROM loop
    WHERE cnt < 359
),
found_sector AS (
   SELECT l.cnt
     FROM (
             SELECT *
               FROM loop
          )
          l
          LEFT JOIN
          (
             SELECT DISTINCT bearing_int
               FROM (
                       SELECT *
                         FROM geocache g
                        WHERE dtfound <> 0 AND 
                              country = 'Czech Republic'
                    )
                    g
                    LEFT JOIN
                    vincenty v ON g.id = v.id
          )
          f ON l.cnt = f.bearing_int
    WHERE f.bearing_int IS NULL
)
SELECT g.id,
       g.name,
       v.bearing_int,
       v.distance
  FROM (
          SELECT *
            FROM geocache g
           WHERE dtfound = 0 AND 
                 cachestatus <> 2 AND 
                 country = 'Czech Republic'
       )
       g
       LEFT JOIN
       vincenty v ON g.id = v.id
       JOIN
       found_sector s ON s.cnt = v.bearing_int
 ORDER BY v.distance,
          v.bearing_int,
          g.id;

  • 1

#31 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 14:30

V tom mém posledním odkazu je inverzní funkce ( ze 2 bodů určí vzdálenost a azimut) jako GeoFormulas - VincentyDistance. Dal bych tam i VincentyDestination...


Tento příspěvek byl upraven od kiReGPS: 01 November 2017 - 14:31

  • 0

#32 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 14:35

WITH/* --360°challenge CZ */ params AS ...

Ufff... B)


  • 1

#33 Pe_Bo

Pe_Bo

    Advanced Member

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

Publikováno 01 November 2017 - 18:06

V tom mém posledním odkazu je inverzní funkce ( ze 2 bodů určí vzdálenost a azimut) jako GeoFormulas - VincentyDistance. Dal bych tam i VincentyDestination...

 

Díky, to jsem potřeboval.

 

 

 

@Pe_Bo - Ideálně udělat funkce vracející jednu hodnotu - nevím jestli SQLite zvládne jako výsledek pole. Pokud to umí a uděláš k tomu pak příklad tak klidně udělej dvě fce co budou vracet pole.

 

distance(lat_start, lon_start, lat_end, lon_end) - vrací vzdálenost mezi body - jednotky nechám na autorovi, každopádně klidně nechat vyšší přesnost, nezaokrouhlovat výsledek

azimut_start(lat_start, lon_start, lat_end, lon_end) - výchozí azimut, hodnota ideálně ve stupních mezi 0 a 360 - nezaokrouhlovat

azimut_end(lat_start, lon_start, lat_end, lon_end) - koncový azimut, hodnota ideálně ve stupních mezi 0 a 360 - nezaokrouhlovat

project_lat(lat, lon, azimut_start, distance) - projekce bodu - latitude - hodnota ideálně ve stupních mezi -180 a 180 - nezaokrouhlovat

project_lon(lat, lon, azimut_start, distance) - projekce bodu - longitude - hodnota ideálně ve stupních mezi -180 a 180 - nezaokrouhlovat

 

A jako teaser. Vincentyho metoda v aplikaci nad GG db a GC4PCQB

 

...

 

Tak jsem spáchal SQLIte extension  :P Obsahuje všechny zmíněné funkce, zadávají se stupně a metry, bearing může být záporný i větší než 180.

 SQLite neumožňuje vracet pole, takže se to musí počítat zvlášť. Šlo by udělat nějaké stringové spojení (místo pole), ale to je spíš komplikace pro další zpracování.

 

Zběžně porovnáno s kalkulačkou na http://www.movable-t...g-vincenty.html

Ale chtělo by to pořádně otestovat.

 

Jo a ten SQL příkaz je teda něco. Ani jsem se nesnažil ho porovnávat s předlohou  :D

Přiložený soubor (y)


  • 4

#34 tarmara

tarmara

    Air-cooled

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

Publikováno 01 November 2017 - 18:59

Pane jo, to byl fofr. První testovací kolo dopadlo skvěle, lišíme se na kontrolních datech někde za desátým desetinným místem. Zítra ještě dotestuju data přes "půl zeměkoule" - N/S, E/W, projekci bodu a výkon. 

Jak je nastavené iterování? Do nějaké velikosti rozdílu, nebo natvrdo určitý počet iterací (kolik)? Pro obecné řešení (nacelou zeměkouli) je lepší do co nejmenšího rozdílu při iteraci, protože pro "nearly antipodal" body konverguje iterační rozdíl velmi pomalu. Po naši kotlinu bohatě stačí 10 iterací.

Dík moc.


  • 0

#35 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 19:35

Je to na velikost rozdílu < 0.5e-15 a zároveň je omezen maximální počet iterací na 40.

Tento příspěvek byl upraven od kiReGPS: 01 November 2017 - 19:37

  • 0

#36 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 19:43

Mimochodem projekci bodu na geoidu jsem našel i v SQLite rozšíření SpatiaLite https://www.gaia-gis...patialite/index

Hovořit o kanónu na vrabce je asi zbytečné, ale kdyby chtěl tarmara zase s něčím experimentovat... ;)

Tento příspěvek byl upraven od kiReGPS: 01 November 2017 - 21:09

  • 1

#37 Pe_Bo

Pe_Bo

    Advanced Member

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

Publikováno 01 November 2017 - 19:44

Vyšel jsem z

https://github.com/p...e/GeoFormulas.h

https://github.com/p...Destination.cpp

https://github.com/p...ntyDistance.cpp

 

 

 

Je to na velikost rozdílu < 0.5e-15 a zároveň je omezen maximální počet iterací na 40.

 

To platí pro inverzní funkci, pro přímou je počet omezen na 100.


  • 0

#38 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 20:00

Jo, tam jsem nekoukal. Ale tarmara používá tu inverzní.
  • 0

#39 tarmara

tarmara

    Air-cooled

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

Publikováno 01 November 2017 - 20:26

přímá metoda - projekce bodu z výchozího bodu a zadaného výchozího azimutu a vzdálenosti

inverzní metoda - výpočet vzdálenosti a azimutů ze souřadnic dvou bodů

ona iterace se používá u obou metod a co jsem koukal, tak pro obě by se mělo iterovat minimálně dokud rozdíl není menší než 10^-12 - doporučení z dob kdy se buď počítalo ručně nebo na pomalých počítačích (Vincenty zmiňuje že měl v době tvorby algoritmu k dispozici mašinku s pár kilobyty operační paměti - 70.léta 20.stol.) - což odpovídá přesnosti tisícinám vteřin nebo tisícinám mm výsledku. 

V rámci Evropy je to OK, funkce konverguje (rozdíl se blíží požadované hodnotě) velmi rychle - během 5-6 iterací. Jakmile se ale počítá s body co leží na opačné straně zeměkoule (např. N50°,E15° a S50°,W165°), tak se počet iterací rapidně zvyšuje (nižší jednotky stovek)....

tolik exkurz do historie a záludností....


  • 0

#40 kiReGPS

kiReGPS

    Advanced Member

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

Publikováno 01 November 2017 - 21:28

Už od samého počátku diskuze se mi neodbytně vkrádala na mysl poznámka, že až se bude hledat případ nezměrného úsilí vynaloženého za zcela nicotným cílem, tohle hraní s SQL musí skončit na předních místech. Stačí se podívat na tarmarův megaselect. Přitom stejný výsledek lze jednoduše získat existujícími nástroji (Stator, Degree360), nebo jejich lehkým ohnutím.

Tím se nechci nikoho dotknout, sám často dělám podobné vylomeniny. Používám tvrdohlavě na něco nástroj A, ačkoliv stačí snadno a jednoduše vzít nástroj B. Jen abych si dokázal, že to jde. Jen jako duševní trénink v rámci boje s tím Němcem, co nám furt schovává věci.

Jen mně při čtení vlákna tahle absurdita až příliš bije do očí... :)
  • 3





Také označené jedním nebo více z těchto klíčových slov:geoget

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

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

Reklama