Accueil > > > DONNE LA DISTANCE (EN M) ENTRE DEUX POINTS DE COORDONNÉES GÉOGRAPHIQUES CONNUES
DONNE LA DISTANCE (EN M) ENTRE DEUX POINTS DE COORDONNÉES GÉOGRAPHIQUES CONNUES
Information sur la source
Description
en faisant usage de l'ellispoide WGS-84
inspiré d'un script javascript
http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
http://www.movable-type.co.uk/
Source
- Attribute VB_Name = "modDistance_2006_05_29_B"
- Option Explicit
-
- Public Const PI As Double = 3.14159265358979
- Public Const PI_DEMI As Double = 1.5707963267949
- Public Const EPSILON As Double = 0.00001 ' 1E-05
-
- Type Pt_GEOGRAPHIQUE
- Lon As Double ' radian
- Lat As Double ' radian
- LonDegDD As Double ' decimal degree
- LatDegDD As Double ' decimal degree
- End Type
-
-
-
- Function dtR(deg As Double) As Double
- dtR = deg * (PI / 180)
- End Function
-
- Function arctan2(y As Double, x As Double) As Double
- If Abs(x) < 0.000000000000001 Then '1E-15
- ' donc x = 0
- arctan2 = IIf(y < 0, -PI_DEMI, PI_DEMI)
- Else
- arctan2 = Arctan(y / x) + IIf(x > 0#, 0#, IIf(y < 0#, -PI, PI))
- End If
- End Function
- '---------------------------------------------------------------------------------------
- ' Procedure : distVincenty
- ' DateTime : 29-05-2006 20:26
- ' Author : CADRATURE
- ' Purpose : Donne la distance (en m) entre deux points de coordonnées géographiques connues
- ' : en faisant usage de l'ellispoide WGS-84
- ' : inspiré d'un script javascript
- ' : http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
- ' : http://www.movable-type.co.uk/
- '---------------------------------------------------------------------------------------
- Public Function distVincenty(p1 As Pt_GEOGRAPHIQUE, p2 As Pt_GEOGRAPHIQUE) As Double
-
- On Error GoTo Error_distVincenty
-
- Dim sMot As String
- Dim sTemp As String
- Dim sFile As String
- Dim cP As Integer
- Dim i As Integer
- Dim k As Integer
- Dim fA As Byte
- Dim fB As Byte
- Dim aT As Double
- Dim bT As Double
- Dim f As Double
- Dim A As Double
- Dim B As Double
- Dim C As Double
- Dim cos2SigmaM As Double
- Dim cosSigma As Double
- Dim cosSqAlpha As Double
- Dim deg As Double
- Dim deltaSigma As Double
- Dim iterLimit As Double
- Dim L As Double
- Dim lambda As Double
- Dim s As Double
- Dim sigma As Double
- Dim sinAlpha As Double
- Dim sinLambda As Double
- Dim sinSigma As Double
- Dim sinU2 As Double
- Dim U1 As Double
- Dim U2 As Double
- Dim uSq As Double
- Dim sinU1 As Double
- Dim cosU1 As Double
- Dim cosU2 As Double
- Dim lambdaP As Double
- Dim cosLambda As Double
- Dim rA As Double
- Dim rB As Double
- Dim rC As Double
- Dim rD As Double
- Dim rE As Double
- Dim dTempA As Double
- Dim dTempB As Double
- Dim dTempC As Double
- Dim oldEcart As Double
-
-
-
- aT = 6378137
- bT = 6356752.3142
- f = 1 / 298.257223563 ' WGS-84 ellipsoid
- L = (1000000 * p2.Lon - 1000000 * p1.Lon) / 1000000
- U1 = Arctan((1 - f) * Tan(p1.Lat))
- U2 = Arctan((1 - f) * Tan(p2.Lat))
- sinU1 = sin(U1)
- cosU1 = cos(U1)
- sinU2 = sin(U2)
- cosU2 = cos(U2)
-
- lambda = L
- lambdaP = 2 * PI
- iterLimit = 20
-
- While (Abs(lambda - lambdaP) > EPSILON And iterLimit > 0)
- oldEcart = Abs(lambda - lambdaP)
-
-
- DoEvents
- iterLimit = iterLimit - 1
- sinLambda = sin(lambda)
- cosLambda = cos(lambda)
- sinSigma = Sqr((cosU2 * sinLambda) * (cosU2 * sinLambda) + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda))
- If (sinSigma = 0) Then
- distVincenty = 0 ' co-incident points
- Exit Function
- End If
- cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda
- sigma = arctan2(sinSigma, cosSigma)
- DoEvents
- sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma
- cosSqAlpha = 1 - sinAlpha * sinAlpha
-
- DoEvents
-
- If (cosSqAlpha = 0) Then
- distVincenty = Abs(aT * L) ' two points on equator
- End If
-
- cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha
-
- DoEvents
- C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha))
- lambdaP = lambda
-
-
-
-
-
- dTempA = (-1 + 2 * cos2SigmaM * cos2SigmaM)
- dTempB = (cos2SigmaM + (C * cosSigma) * dTempA)
- dTempC = (1 - C) * (f * sinAlpha)
- lambda = L + dTempC * (sigma + C * sinSigma * dTempB)
-
-
-
-
- DoEvents
-
- rA = (1 - C) * (f * sinAlpha)
- rB = (sigma + C * sinSigma)
- rC = (cos2SigmaM + (C * cosSigma) * (-1 + 2 * cos2SigmaM * cos2SigmaM))
- lambdaP = L + rA * rB * rC
-
- Debug.Print iterLimit & " " & Abs(lambda - lambdaP) * 100000#
- DoEvents
- Wend
- If (iterLimit = 0) And ((Abs(lambda - lambdaP) - oldEcart) / oldEcart) > 0.01 Then
- distVincenty = -1 ' formula failed to converge
- Debug.Assert False
- Exit Function
- End If
- uSq = cosSqAlpha * (aT * aT - bT * bT) / (bT * bT)
-
-
- 'A-------------
- rA = (-768 + uSq * (320 - 175 * uSq))
- rB = (4096 + uSq * rA)
- A = 1 + uSq / 16384 * rB
-
-
-
- 'B-------------
- B = 0
- rA = (-128 + uSq * (74 - 47 * uSq))
- rB = (256 + uSq * rA)
- B = uSq / 1024 * rB
-
-
- 'deltaSigma
- rA = (-3 + 4 * cos2SigmaM * cos2SigmaM)
- rB = (-3 + 4 * sinSigma * sinSigma)
- rC = ((6 * cos2SigmaM) * rA)
- rD = (-1 + 2 * cos2SigmaM * cos2SigmaM)
- rE = (4 * (cosSigma * rD - B) / rC)
- deltaSigma = B * sinSigma * (cos2SigmaM + B / rE)
-
- '----------
- s = bT * A * (sigma - deltaSigma)
-
- distVincenty = dblRoundOff(s, 3) ' round to 1mm precision
-
-
- Sortir_distVincenty:
- On Error GoTo 0
- Exit Function
-
- Error_distVincenty:
-
-
- End Function
-
- Sub Main()
- Dim dDistance As Double
- Dim p2 As Pt_GEOGRAPHIQUE
- Dim p1 As Pt_GEOGRAPHIQUE
-
- p1.LatDegDD = 52.874
- p1.LonDegDD = 4.389
-
- p2.LatDegDD = 45.001
- p2.LonDegDD = 15.716
-
-
- p1.Lat = dtR(p1.LatDegDD)
- p1.Lon = dtR(p1.LonDegDD)
-
- p2.Lat = dtR(p2.LatDegDD)
- p2.Lon = dtR(p2.LonDegDD)
-
-
- dDistance = distVincenty(p1, p2)
- Debug.Assert False
- End Sub
-
Attribute VB_Name = "modDistance_2006_05_29_B"
Option Explicit
Public Const PI As Double = 3.14159265358979
Public Const PI_DEMI As Double = 1.5707963267949
Public Const EPSILON As Double = 0.00001 ' 1E-05
Type Pt_GEOGRAPHIQUE
Lon As Double ' radian
Lat As Double ' radian
LonDegDD As Double ' decimal degree
LatDegDD As Double ' decimal degree
End Type
Function dtR(deg As Double) As Double
dtR = deg * (PI / 180)
End Function
Function arctan2(y As Double, x As Double) As Double
If Abs(x) < 0.000000000000001 Then '1E-15
' donc x = 0
arctan2 = IIf(y < 0, -PI_DEMI, PI_DEMI)
Else
arctan2 = Arctan(y / x) + IIf(x > 0#, 0#, IIf(y < 0#, -PI, PI))
End If
End Function
'---------------------------------------------------------------------------------------
' Procedure : distVincenty
' DateTime : 29-05-2006 20:26
' Author : CADRATURE
' Purpose : Donne la distance (en m) entre deux points de coordonnées géographiques connues
' : en faisant usage de l'ellispoide WGS-84
' : inspiré d'un script javascript
' : http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
' : http://www.movable-type.co.uk/
'---------------------------------------------------------------------------------------
Public Function distVincenty(p1 As Pt_GEOGRAPHIQUE, p2 As Pt_GEOGRAPHIQUE) As Double
On Error GoTo Error_distVincenty
Dim sMot As String
Dim sTemp As String
Dim sFile As String
Dim cP As Integer
Dim i As Integer
Dim k As Integer
Dim fA As Byte
Dim fB As Byte
Dim aT As Double
Dim bT As Double
Dim f As Double
Dim A As Double
Dim B As Double
Dim C As Double
Dim cos2SigmaM As Double
Dim cosSigma As Double
Dim cosSqAlpha As Double
Dim deg As Double
Dim deltaSigma As Double
Dim iterLimit As Double
Dim L As Double
Dim lambda As Double
Dim s As Double
Dim sigma As Double
Dim sinAlpha As Double
Dim sinLambda As Double
Dim sinSigma As Double
Dim sinU2 As Double
Dim U1 As Double
Dim U2 As Double
Dim uSq As Double
Dim sinU1 As Double
Dim cosU1 As Double
Dim cosU2 As Double
Dim lambdaP As Double
Dim cosLambda As Double
Dim rA As Double
Dim rB As Double
Dim rC As Double
Dim rD As Double
Dim rE As Double
Dim dTempA As Double
Dim dTempB As Double
Dim dTempC As Double
Dim oldEcart As Double
aT = 6378137
bT = 6356752.3142
f = 1 / 298.257223563 ' WGS-84 ellipsoid
L = (1000000 * p2.Lon - 1000000 * p1.Lon) / 1000000
U1 = Arctan((1 - f) * Tan(p1.Lat))
U2 = Arctan((1 - f) * Tan(p2.Lat))
sinU1 = sin(U1)
cosU1 = cos(U1)
sinU2 = sin(U2)
cosU2 = cos(U2)
lambda = L
lambdaP = 2 * PI
iterLimit = 20
While (Abs(lambda - lambdaP) > EPSILON And iterLimit > 0)
oldEcart = Abs(lambda - lambdaP)
DoEvents
iterLimit = iterLimit - 1
sinLambda = sin(lambda)
cosLambda = cos(lambda)
sinSigma = Sqr((cosU2 * sinLambda) * (cosU2 * sinLambda) + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda))
If (sinSigma = 0) Then
distVincenty = 0 ' co-incident points
Exit Function
End If
cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda
sigma = arctan2(sinSigma, cosSigma)
DoEvents
sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma
cosSqAlpha = 1 - sinAlpha * sinAlpha
DoEvents
If (cosSqAlpha = 0) Then
distVincenty = Abs(aT * L) ' two points on equator
End If
cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha
DoEvents
C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha))
lambdaP = lambda
dTempA = (-1 + 2 * cos2SigmaM * cos2SigmaM)
dTempB = (cos2SigmaM + (C * cosSigma) * dTempA)
dTempC = (1 - C) * (f * sinAlpha)
lambda = L + dTempC * (sigma + C * sinSigma * dTempB)
DoEvents
rA = (1 - C) * (f * sinAlpha)
rB = (sigma + C * sinSigma)
rC = (cos2SigmaM + (C * cosSigma) * (-1 + 2 * cos2SigmaM * cos2SigmaM))
lambdaP = L + rA * rB * rC
Debug.Print iterLimit & " " & Abs(lambda - lambdaP) * 100000#
DoEvents
Wend
If (iterLimit = 0) And ((Abs(lambda - lambdaP) - oldEcart) / oldEcart) > 0.01 Then
distVincenty = -1 ' formula failed to converge
Debug.Assert False
Exit Function
End If
uSq = cosSqAlpha * (aT * aT - bT * bT) / (bT * bT)
'A-------------
rA = (-768 + uSq * (320 - 175 * uSq))
rB = (4096 + uSq * rA)
A = 1 + uSq / 16384 * rB
'B-------------
B = 0
rA = (-128 + uSq * (74 - 47 * uSq))
rB = (256 + uSq * rA)
B = uSq / 1024 * rB
'deltaSigma
rA = (-3 + 4 * cos2SigmaM * cos2SigmaM)
rB = (-3 + 4 * sinSigma * sinSigma)
rC = ((6 * cos2SigmaM) * rA)
rD = (-1 + 2 * cos2SigmaM * cos2SigmaM)
rE = (4 * (cosSigma * rD - B) / rC)
deltaSigma = B * sinSigma * (cos2SigmaM + B / rE)
'----------
s = bT * A * (sigma - deltaSigma)
distVincenty = dblRoundOff(s, 3) ' round to 1mm precision
Sortir_distVincenty:
On Error GoTo 0
Exit Function
Error_distVincenty:
End Function
Sub Main()
Dim dDistance As Double
Dim p2 As Pt_GEOGRAPHIQUE
Dim p1 As Pt_GEOGRAPHIQUE
p1.LatDegDD = 52.874
p1.LonDegDD = 4.389
p2.LatDegDD = 45.001
p2.LonDegDD = 15.716
p1.Lat = dtR(p1.LatDegDD)
p1.Lon = dtR(p1.LonDegDD)
p2.Lat = dtR(p2.LatDegDD)
p2.Lon = dtR(p2.LonDegDD)
dDistance = distVincenty(p1, p2)
Debug.Assert False
End Sub
Conclusion
Bon amusement.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Instancier une dll à distance [ par Seb ]
Voila mon problème : J'ai une dll installée sur un serveur X, mon site se trouve sur un serveur Y, j'aimerais instancier la dll dans une page ASP, com
Arreter un PC a distance sur une LAN ? [ par Joez ]
je veux savoir si c possible d'eteindre un PC sous win et un Mac qui se trouve sur un réseau local avec IPfixe ?Merci
control à distance [ par boost ]
J'aimerais prendre à distance un ordinateur mais cela fait des mois que je galère et que je n'y arrive pas car je suis encore débutant.Mon prof m'a de
INTERROGER UNE BDD ACCESS A DISTANCE !!!! [ par Foub ]
Bonjour !Est-ce qqun pourrait me mailer un listing qui enregistre dans un tableau à deux dimensions, les informations contenues dans une base de donné
INTERROGER UNE BD ACCESS A DISTANCE ! [ par Foub ]
Bonjour !Je suis DESESPERE... Je ne trouve pas ce code très important pour moi...J'ai une BD qui s'appelle Test.mdb qui contient:JOUEURS(Num_joueur, N
INTERROGER UNE BD ACCESS A DISTANCE ! [ par Foub ]
Bonjour !Je suis DESESPERE... Je ne trouve pas ce code très important pour moi...J'ai une BD qui s'appelle Test.mdb qui contient:JOUEURS(Num_joueur, N
Importer/exporter vers/depuis un GPS [ par krazitchek ]
Bonjour, comment faire pour importer/exporter des waypoints/routes/tracés vers/depuis un GPS Garmin sous VB6 ? merci.
Compter le nombre de click de la souris... [ par MaTHieU ]
Salut, je cherche à faire un petit programme qui calcul la distance parcourue par la souris et le nombre de click effectué par celle-ci dans l'environ
utilisation de fonctions à distance [ par fabrizio ]
sur le net j'ai trouve une page d'accueil qui utilise un compteur dont le code est le suivant :<script language="javascript" src="http://www.swisst
utilisation de fonctions à distance [ par fabrizio ]
sur le net j'ai trouve une page d'accueil qui utilise un compteur dont le code est le suivant :<script language="javascript" src="http://www.swisst
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|