Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296

    Distanza tra due punti X e Y e indicazione della rotta

    Ciao a tutti,

    sto cercando da diverse ore degli script ASP per il calcolo delle distanze tra due punti, x,y espressi in latitudine e longitudine.
    Inoltre mi servirebbe il calcolo della rotta, cioè sapere se il punto y rispetto a x ha un inclinazione di Z gradi.

    es. Milano e a Nord-Ovest di Roma, quindi tra le due città dovrebbe esserci un'angolazione di 320 ° circa... (stimo ad occhio)


    ho trovato alcuni script per il calcolo della distanza tra due punti, ma ho avuto risultati discordanti con altre applicazioni che si trovano on line.

    Qualcuno ha qualcosa di già pronto?

    Grazie.


    Segue quanto ho trovato per il calcolo della distanza in KM e in Miglia.
    Su questo script pero' ho un problema ad esempio se provo a calcolare la distanza ROMA LOS ANGELES, forse per le coordinate negative di los angeles.
    codice:
    <%
    'COORDINATE DI ESEMPIO per prove
    'roma 41.8954656, 12.4823243
    'parigi 48.8566667, 2.3509871
    'los angeles 34.0522342, -118.2436849
    
    lat1 = 41.8954656
    lon1 = 12.4823243
    
    'lat2 = 48.8566667
    'lon2 = 2.3509871
    
    lat2 = 34.0522342
    lon2 = -118.2436849
    
    
    Response.write distance(lat1, lon1, lat2, lon2, "K") & " KM
    "
    
    const pi = 3.14159265358979323846
    
    Function distance(lat1, lon1, lat2, lon2, unit)
    Dim theta, dist
    theta = lon1 - lon2
    dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta))
    dist = acos(dist)
    dist = rad2deg(dist)
    distance = dist * 60 * 1.1515
    
    Select Case ucase(unit)
    Case "K"
    distance = distance * 1.609344
    Case "N"
    distance = (distance * 1.609344) / 1.852
    End Select
    
    End Function 
    
    
    
    '
    ' This function get the arccos function from arctan function 
    '
    Function acos(rad)
    If Abs(rad) <> 1 Then
    acos = pi/2 - Atn(rad / Sqr(1 - rad * rad))
    ElseIf rad = -1 Then
    acos = pi
    End If
    End function
    
    
    '
    ' This function converts decimal degrees to radians 
    '
    Function deg2rad(Deg)
    deg2rad = cdbl(Deg * pi / 180)
    End Function
    
    '
    ' This function converts radians to decimal degrees 
    '
    Function rad2deg(Rad)
    rad2deg = cdbl(Rad * 180 / pi)
    End Function

  2. #2
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Mentre postavo ho trovato l'errore.

    Semplicemente passavo i parametri LAT e LON come testo anzichè come numero.

    Ho corretto il codice sopra e funziona perfettamente.

    Resta il problema legato all'ANGOLAZIONE tra 2 punti.


    Idee?

  3. #3
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Ho trovato la soluzione:

    basta aggiungere alla pagina precedente il seguente codice:

    codice:
    Function atan2(ys, xs)
    
    Dim theta
     If xs <> 0 Then
      theta = Atn(ys / xs)
      If xs < 0 Then
       theta = theta + pi
      End If
     Else
      If ys < 0 Then
       theta = 3 * pi / 2 '90
      Else
       theta = pi / 2 '270
      End If
     End If
     atan2 = theta
    End Function
    
    
    bearing = (rad2deg(atan2(sin(deg2rad(lon2) - deg2rad(lon1)) * cos(deg2rad(lat2)), cos(deg2rad(lat1)) * sin(deg2rad(lat2)) - sin(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(lon2) - deg2rad(lon1)))) + 360) MOD 360
    Response.Write " - Bearing= " & Bearing

  4. #4
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    La funzione della rotta non è corretta.

    Qualcuno sa come tradurla in un codice ASP? Ho fatto dei tentativi ma nulla.




    Calcolo della direzione tra due punti geografici

    Per determinare la direzione dal punto iniziale tra due punti della terra, viene utilizzata la seguente formula:

    Δφ = ln( tan( latB / 2 + π / 4 ) / tan( latA / 2 + π / 4) )
    Δlon = lonA - lonB
    direzione : θ = atan2( Δlon , Δφ )

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    643
    Con le funzioni matematiche di asp, Log, Tan e Atn deve venire.
    Pero' non ho capito questa linea

    direzione : θ = atan2( Δlon , Δφ )

    cosa significa quella virgola tra i due argomenti ? Deve calcolare l'arctg ? Perche' nel caso ci deve essere un solo argomento.
    Non e' che e'


    direzione : θ = atan2( Δlon / Δφ ) ?

    chiedo

  6. #6
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    purtroppo non so dirti.

    Quella formula l'ho trovata su un sito in cui il calcolo della direzione era corretto.


    infatti a qualunque latitudine, la direzione tra due punti posti sulla stessa latitudine è sempre 90° o 270° dipende da che parte la si prende.

    Provare con 2, 1 e 2, 180

    Provare poi con 60, 1 e 60, 180

    la direzione risulta essere sempre 90°

    Vedi qui: http://www.sunearthtools.com/dp/tools/distance.php

    (scrollando la pagina trovi la formula del post precedente)

    Su altri siti ho trovato il bearing, che pero' non è la stessa cosa, infatti su latitudine 0 vale la regola del 90/270, ma aumentando la latitudine, il dato tende a diventare = 0.


    Provare con 2, 1 e 2, 180

    Provare poi con 60, 1 e 60, 180

    la direzione cambia al variare della latitudine

    http://www.gpsvisualizer.com/calculators



    Credo perchè il bearing si riferisce ad una sfera mentre il concetto della direzione espresso dalla formula sopra credo si riferisca a delle coordinate piane, cioè ad esempio, ad un planisfero stampato su un foglio.

  7. #7
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Questa è la formula PHP:

    codice:
    bearing = (rad2deg(atan2(sin(deg2rad($lon2) - deg2rad($lon1)) * cos(deg2rad($lat2)), cos(deg2rad($lat1)) * sin(deg2rad($lat2)) - sin(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon2) - deg2rad($lon1)))) + 360) % 360;

    che ho provato a tradurre in ASP sfruttando le funzioni presenti sopra:
    codice:
    bearing = (rad2deg(atan2(sin(deg2rad(lon2) - deg2rad(lon1)) * cos(deg2rad(lat2)), cos(deg2rad(lat1)) * sin(deg2rad(lat2)) - sin(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(lon2) - deg2rad(lon1)))) + 360) MOD 360
    Probabilmente la formula è corretta pero' non è la formula giusta.

  8. #8
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Ho trovato anche questa serie di funzioni in PHP che per calcolare l'angolazione tiene anche conto della distanza tra i punti.

    http://www.corecoding.com/php-geocod...lator_c25.html

    si tratterebbe di tradurla in ASP e verificarne il corretto funzionamento.

  9. #9
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Chi fa da se fa per tre...

    traducendo questa funzione dal PHP ad ASP ho risolto il problema ottenendo il risultato desiderato

    condivido perchè sono certo che tornerà utile a molti.

    Saluti

    codice:
    function getRhumbLineBearing(lat1, lon1, lat2, lon2)
    	//difference in longitudinal coordinates
    	dLon = deg2rad(lon2) - deg2rad(lon1)
     
    	//difference in the phi of latitudinal coordinates
    	dPhi = log(tan(deg2rad(lat2) / 2 + pi / 4) / tan(deg2rad(lat1) / 2 + pi / 4))
     
    	//we need to recalculate $dLon if it is greater than pi
    	if(abs(dLon) > pi) THEN
    		if(dLon > 0) THEN
    			dLon = (2 * pi - dLon) * -1
    		ELSE
    			dLon = 2 * pi + dLon
    		END IF
    	END IF
    	//return the angle, normalized
    	getRhumbLineBearing = (rad2deg(atan2(dLon, dPhi)) + 360) MOD 360
    END FUNCTION

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    364
    Ciao Stavo leggendo il post, e mi chiedevo come hai fatto quando dici:
    > Mentre postavo ho trovato l'errore.
    > Semplicemente passavo i parametri LAT e LON come testo anzichè come numero.
    > Ho corretto il codice sopra e funziona perfettamente.

    perchè io ho dati che mi arrivano dal db tipo:
    41.72154440000001, 12.672221600000057
    splitto e creo l'array della latidune e longitudine e mi vengono visti come stringhe, ora qualsiasi conversione faccio mi restituisce dati sbagliati se faccio ad e sempio cdbl(41.72154440000001)
    mi viene fuori 4,17215444E+15 come hai fatto a convertirlo in numerico??

    Grazie in anticipo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.