Newsgroup: it.comp.lang.visual-basic
Titolo: Conversione coordinate

Ciao a tutti.
Il mio problema consiste nel convertire delle coordinate geografiche di una
mappa in coordinate dello schermo.
Io lavoro con un controllo mappa (MapobjectsLT).Un metodo di tale controllo
mi permette di convertire le coordinate dello schermo provenienti
dall'evento Mousemove in coordinate geografiche ma non viceversa. Ecco io
avrei bisogno di un consiglio perchè ci sto provando in tutti i modi ma
niente da fare. Ho provato con le API con le varie funzioni che ho a
disposizione ma tutte richiedevano come argomento delle coordinate ben
precise che provenivano dagli eventi del mouse o che consistevano comunque
in coordinate dello schermo.
                Grazie per l'ascolto e per gli eventuali consigli!

 wrote in message
83q5h7$2nge$1...@stargate1.inet.it...


Puoi scaricare gratuitamente a questo indirizzo il controllo di cui ti ho
parlato.
http://www.esri.com/software/mapobjectslt/mapobjectslteval.html
Se gentilmente rispondi al mio appello e mi dicessi che metodo matematico o
proporzione o altro hai usato per risolvere il problema te ne sarei
veramente grato.
A presto.
Ciao e grazie

Dunque .....
per il momento a me funziona, ma il programma non e' ancora terminato.
Diciamo che per il momento non ci sono sorprese rilevanti ....
La subroutine che segue (ComputeCV) deve essere richiamata ogni volta che
cambi videata.  Fornirai in input i valori Lat-Long ed X-Y degli estremi
ALTO-SINISTRO e BASSO-DESTRO facendo attenzione al riferimento in quanto le
coordinate Lat-Long sono invertite rispetto a quelle X-Y per quanto riguarda
le ORDINATE (asse Y) .    Questa procedura ti fornirà in output i fattori di
conversione a,b,c,d che dovranno successivamente essere forniti in input
alle procedure di conversione.
Public Sub ComputeCV(ByVal Lat1 As Long, _
                     ByVal Lon1 As Long, _
                     ByVal Lat2 As Long, _
                     ByVal Lon2 As Long, _
                     ByVal x1 As Long, _
                     ByVal y1 As Long, _
                     ByVal x2 As Long, _
                     ByVal y2 As Long, _
                     ByRef a As Double, _
                     ByRef b As Double, _
                     ByRef c As Double, _
                     ByRef d As Double)
'
' Calcolo dei fattori di conversione da coordinate geografiche a
' coordinate cartesiane per proiezione di Mercatore secondo le formule
' x = a*lon(secondi) + b   e  y = c*log(tan(pigreco/4 + lat(sec->rad)/2))+ d
'
   Dim Num, Tmp As Double
   Num = CDbl(x1 - x2) / CDbl(Lon1 - Lon2)
   a = Num
   b = (x1 - Num * Lon1)
   Tmp = Log(Tan((pi / 4) + (CDbl(Lat1) * pi / 1296000#)))
   Num = Tmp - Log(Tan((pi / 4) + (CDbl(Lat2) * pi / 1296000#)))
   Num = (y1 - y2) / Num
   c = Num
   d = y1 - (Num * Tmp)
End Sub
La subroutine che segue effettua la conversione da Lat-Long a X-Y.    Si
forniranno in input la coordinata da convertire ed i fattori di conversione
precedentemente calcolati.
Public Sub LLtoXY(ByVal Lat As Long, _
                  ByVal Lon As Long, _
                  ByVal a As Double, _
                  ByVal b As Double, _
                  ByVal c As Double, _
                  ByVal d As Double, _
                  ByRef X As Long, _
                  ByRef Y As Long)
'
' Conversione da Lat Long (in secondi) a X-Y secondo le formule:
' x = a*lon + b    e    y = c*log(tan(pigreco/4 + lat(sec->rad)/2)) + d
'
   Dim Num As Double
   Num = Lat / 7200# + 45#
   Num = Tan(pi * (Num / 180#))
   Num = c * Log(Num) + d
   Y = CDbl(CLng(Num + 0.5))
   Num = a * Lon + b + 0.5
   X = CDbl(CLng(Num))
End Sub
La subroutine che segue effettua la conversione da  X-Y a Lat-Long .    Si
forniranno in input la coordinata da convertire ed i fattori di conversione
precedentemente calcolati.
Public Sub XYtoLL(ByVal X As Long, _
                  ByVal Y As Long, _
                  ByVal a As Double, _
                  ByVal b As Double, _
                  ByVal c As Double, _
                  ByVal d As Double, _
                  ByRef Lat As Long, _
                  ByRef Lon As Long)
'
' Conversione da X-Y a Lat Long (in secondi) secondo le formule:
' Lat = (rad->sec)(2*(atan(exp((y - d)/c)) - pigreco/4   e
' Long= (x-b) / a
'
   Dim Num As Double
   Num = (Y - d) / c
   Num = Exp(Num)
   Num = 4# * Atn(Num) / pi - 1#
   Num = Num * 324000#
   Lat = CLng(Num)
   Num = (X - b) / a
   Lon = CLng(Num)
End Sub
Per il momento e' tutto.
Se ci dovessero essere malfunzionamenti o problemi di qualsiasi genere fammi
sapere ...... vorrebbe dire che ho una bomba inesplosa nel programma !!
Ciao
Stefano

FINALMENTE QUALCUNO CHE USA MAPOBJECT CON VB!
Cominciavo a credere di essere l'unico su questo NG!!!
Ci possiamo tenere informati per ogni cassata?
Ciao

"Cessamente!!!"

Ciao a tutti i cartografi:
  Io uso questo sistema, per la cartografia aeronautica..
La mappa, reticoli di meridiani e paralleli e rotte di volo sono disegnate su
di un
PictureBox scalato in gradi decimali di latitudine e longitudine con:
      picCarta.Scale (Lg1, Lt2)-( Lg2, Lt1)
con Lt1, Lg1 coordinate minime e Lt2, Lg2 coordinate massime (sempre in gradi
decimali).  Eventuali conversioni da/a Gradi.Primi.Secondi, metri di Mercatore
(per il
GPS) o radianti vengono gestiti con appropriate routines.
Quando invece mi serve il valore in [pixel], ad esempio per alimentare la
StretchBlt(....)
che mi costruisce una carta aggregando pezzi di fogli d' atlante, uso le
istruzioni:
        Lgx_pix = picCarta.ScaleX(Lgx - picCarta.ScaleLeft, vbUser, vbPixels)
        Ltx_pix = picCarta.ScaleY(Ltx - picCarta.ScaleTop, vbUser, vbPixels)
e ovviamente il contrario (...vbPixel, vbUser) per passare da [pixel] a gradi
decimali.
Chiudo, ringraziando Dario che mi ha permesso di scoprire la presenza sull' NG
di altri
"Mercatori" (dovremmo restare i contatto per scambi reciproci) e auguro a tutti
Buon
Natale e Felice Nuovo Secolo.
Franco


Grazie a tutti per aver risposto al mio appello...
Spero che potremo continuare a sentirci e parlare di nuovo insieme....
Auguri di Buon Natale e Felice anno nuovo a presto.
Ciao Dario..