Calculo de distancias por GPS con funciones del MYSQL
- Busmatic_wpb
- Posts: 162
- Joined: Wed Feb 22, 2017 2:19 am
Calculo de distancias por GPS con funciones del MYSQL
Muy estimados amigos.
Quiero compartir una rutina de calculo de distanacias con datos del GPS, pueda que le sirva alguien por ahi.. ami me trabaja de maravillas con mis sistemas.
function CalculaDistancias()
// esta vatiables son recogidas de la string GPRMC
Latitud1 := ALLTRIM(STR(Op:GPGGA_cLat))
Longitud1 :="-"+ALLTRIM(STR(Op:GPGGA_cLong))
// dos datos de prueba
Latitud2:="10.203574"
Longitud2:="-83.782274"
try
oP:GpSDistancia := oCon:oKon:Query("SELECT (acos(sin(radians('"+Latitud1+"')) * sin(radians('"+Latitud2+"')) + cos(radians('"+Latitud1+"')) * cos(radians('"+Latitud2+"')) *
cos(radians('"+Longitud1+"') - radians('"+Longitud2+"'))) * 6378) as distanciaPunto1Punto2")
CATCH oError
MsgStop( "No se ha podido calcular la distancia error en datos ")
RETURN
END
oP:GpSDistancia :REFRESH()
Op:GpSresultado := oP:GpSDistancia :FieldGet(1)
Alert(Op:GpSresultado )
Return
*********************************************************************************
Veamos la soluciónd e una manera más limpia:
Radio de la Tierra: 6378 km.
PUNTO 1 PUNTO 2
latitud LATITUD_1 LATITUD_2
longitud LONGITUD_1 LONGITUD_2
SELECT (acos(sin(radians(LATITUD_1)) * sin(radians(LATITUD_2)) +
cos(radians(LATITUD_1)) * cos(radians(LATITUD_2)) *
cos(radians(LONGITUD_1) - radians(LONGITUD_2))) * 6378) as
distanciaPunto1Punto2;
*******************************************************************************
Quiero compartir una rutina de calculo de distanacias con datos del GPS, pueda que le sirva alguien por ahi.. ami me trabaja de maravillas con mis sistemas.
function CalculaDistancias()
// esta vatiables son recogidas de la string GPRMC
Latitud1 := ALLTRIM(STR(Op:GPGGA_cLat))
Longitud1 :="-"+ALLTRIM(STR(Op:GPGGA_cLong))
// dos datos de prueba
Latitud2:="10.203574"
Longitud2:="-83.782274"
try
oP:GpSDistancia := oCon:oKon:Query("SELECT (acos(sin(radians('"+Latitud1+"')) * sin(radians('"+Latitud2+"')) + cos(radians('"+Latitud1+"')) * cos(radians('"+Latitud2+"')) *
cos(radians('"+Longitud1+"') - radians('"+Longitud2+"'))) * 6378) as distanciaPunto1Punto2")
CATCH oError
MsgStop( "No se ha podido calcular la distancia error en datos ")
RETURN
END
oP:GpSDistancia :REFRESH()
Op:GpSresultado := oP:GpSDistancia :FieldGet(1)
Alert(Op:GpSresultado )
Return
*********************************************************************************
Veamos la soluciónd e una manera más limpia:
Radio de la Tierra: 6378 km.
PUNTO 1 PUNTO 2
latitud LATITUD_1 LATITUD_2
longitud LONGITUD_1 LONGITUD_2
SELECT (acos(sin(radians(LATITUD_1)) * sin(radians(LATITUD_2)) +
cos(radians(LATITUD_1)) * cos(radians(LATITUD_2)) *
cos(radians(LONGITUD_1) - radians(LONGITUD_2))) * 6378) as
distanciaPunto1Punto2;
*******************************************************************************
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
- Antonio Linares
- Site Admin
- Posts: 42553
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 80 times
- Contact:
- Busmatic_wpb
- Posts: 162
- Joined: Wed Feb 22, 2017 2:19 am
Re: Calculo de distancias por GPS con funciones del MYSQL
Perdon de me fue.
Si Op: una clase que anda en el foro y se llama Public.prg con varios aportes incluyendo Aportes: [ER] Ray Islas.
Simplemente es crear variables las cuales puedes controlar su contenido ya hacerlas publicas mas ordenado y contraldo.
Trabaja muy bien ahora el que quiera un resultado en millas debe de cambiar Radio de la Tierra: 6378 km. por millas..
espero que les sirva.
Si Op: una clase que anda en el foro y se llama Public.prg con varios aportes incluyendo Aportes: [ER] Ray Islas.
Simplemente es crear variables las cuales puedes controlar su contenido ya hacerlas publicas mas ordenado y contraldo.
Trabaja muy bien ahora el que quiera un resultado en millas debe de cambiar Radio de la Tierra: 6378 km. por millas..
espero que les sirva.
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: Calculo de distancias por GPS con funciones del MYSQL
Está muy bien pero el que no trabaje con mysql tendría que enlazar alguna lib como Eagle1 o HDO para MySQL...
no sería más fácil usar la lib hbct.lib de Harbour?
Creo que el SELECT de MySQL se podría traducir por:
Recordad que aqui at1, lng1, lat2, lng2 tienen que ser numericos y no pueden ir entrecomillados por lo que el ejemplo de Busmatic_wpb pasaria a ser:

no sería más fácil usar la lib hbct.lib de Harbour?
Creo que el SELECT de MySQL se podría traducir por:
Code: Select all | Expand
function miDistancia( lat1, lng1, lat2, lng2 )
resturn( acos( sin( dtor( lat1 ) ) * sin( dtor( lat2 ) ) + cos( dtor( lat1 ) ) * cos( dtor( lat2 ) ) * cos( dtor( lng1 ) - dtor( lng2 ) ) ) * 6371 )
Recordad que aqui at1, lng1, lat2, lng2 tienen que ser numericos y no pueden ir entrecomillados por lo que el ejemplo de Busmatic_wpb pasaria a ser:
Code: Select all | Expand
// esta vatiables son recogidas de la string GPRMC <--- Ya no debería ser string sino numeric
Latitud1 := Op:GPGGA_cLat
Longitud1 := Op:GPGGA_cLong
// dos datos de prueba
Latitud2 := 10,203574 // Ojo con la , o . decimal
Longitud2 := -83,782274
oP:GpSDistancia := miDistancia( Latitud1, Longitud1, Latitud2, Longitud2 )
oP:GpSDistancia :REFRESH()
Alert( str( Op:GpSresultado ) )

______________________________________________________________________________
Sevilla - Andalucía
Sevilla - Andalucía
- nageswaragunupudi
- Posts: 10721
- Joined: Sun Nov 19, 2006 5:22 am
- Location: India
- Been thanked: 8 times
- Contact:
Re: Calculo de distancias por GPS con funciones del MYSQL
If using MySql server version 5.7.1 or later, we can consider using MySql function
which returns the distance in meters. If the 3rd parameter is ommitted, MySql uses Earth's radius by default.
Instead of storing lattitude and longitude separately in Table, we can use SPATIAL datatype POINT.
This is a sample that will be released with FWH 18.01;

This also creates a stored function on the Server called "distance_between( city1, city2 )" and using FWMARIADB library we can call the function by
as if it is built-in method.
Code: Select all | Expand
ST_Distance_Sphere( POINT( lat1, long1 ), POINT( lat2, long3 ) [, radius] )
which returns the distance in meters. If the 3rd parameter is ommitted, MySql uses Earth's radius by default.
Instead of storing lattitude and longitude separately in Table, we can use SPATIAL datatype POINT.
This is a sample that will be released with FWH 18.01;
Code: Select all | Expand
/*
* mariageo.prg
* SPATIAL dataype POINT and Distance Calculations
*
* Requires MySql server 5.7.1 or above
*/
#include "fivewin.ch"
//----------------------------------------------------------------------------//
function Main()
local oCn, oRs, cSql
oCn := FW_DemoDB( 1 ) // Provide connection to your MySql 5.7.1 server
TEXT INTO cSql
CREATE TABLE citylatlong (
id INT AUTO_INCREMENT PRIMARY KEY,
city VARCHAR(20),
pt POINT )
ENDTEXT
if oCn:TableExists( "citylatlong" )
oCn:DropTable( "citylatlong" )
endif
oCn:Execute( cSql )
TEXT INTO cSql
INSERT INTO citylatlong
( city, pt ) VALUES
( "Hyd", POINT( 78.4867, 17.3850 ) ),
( "Mumbai", POINT( 72.8777, 19.0760 ) ),
( "Delhi", POINT( 77.1025, 20.7041 ) ),
( "London", POINT( 0.1278, 51.5074 ) ),
( "Paris", POINT( 2.3522, 48.8566 ) ),
( "Madrid", POINT( 3.7038, 40.4168 ) )
ENDTEXT
oCn:Execute( cSql )
ocn:Execute( "DROP FUNCTION IF EXISTS distance_between" )
TEXT INTO cSql
CREATE FUNCTION distance_between( city1 VARCHAR(20), city2 VARCHAR(20) )
RETURNS DOUBLE
BEGIN
DECLARE p1 POINT;
DECLARE p2 POINT;
SELECT pt INTO p1 FROM citylatlong WHERE city = city1;
SELECT pt INTO p2 FROM citylatlong WHERE city = city2;
RETURN ST_Distance_Sphere( p1, p2 );
END;
ENDTEXT
oCn:Execute( cSql )
oRs := oCn:RowSet( "SELECT id, city, X( pt ) AS Longitude, Y( pt ) AS Lattitude from citylatlong" )
XBROWSER oRs SETUP ( oBrw:aCols[ 3 ]:cEditPicture := "9999.999999", oBrw:aCols[ 4 ]:cEditPicture := "999.999999" )
oRs:Close()
? oCn:distance_between( "London", "Paris" ) // --> 334575.4 meters
oCn:Close()
return nil
//----------------------------------------------------------------------------//

This also creates a stored function on the Server called "distance_between( city1, city2 )" and using FWMARIADB library we can call the function by
Code: Select all | Expand
? oCn:distance_between( "Paris", "Madrid" )
as if it is built-in method.
Regards
G. N. Rao.
Hyderabad, India
G. N. Rao.
Hyderabad, India
- nageswaragunupudi
- Posts: 10721
- Joined: Sun Nov 19, 2006 5:22 am
- Location: India
- Been thanked: 8 times
- Contact:
Re: Calculo de distancias por GPS con funciones del MYSQL
SELECT (acos (sin (radians (LATITUD_1)) * sin (radians (LATITUD_2)) +
cos (radians (LATITUD_1)) * cos (radians (LATITUD_2)) *
cos (radians ( LONGITUD_1) - radians (LONGITUDE_2))) * 6378) as
distancePoint1Point2;
Should Earth's radius be taken as 6371 instead of 6378 ?
Regards
G. N. Rao.
Hyderabad, India
G. N. Rao.
Hyderabad, India
- Busmatic_wpb
- Posts: 162
- Joined: Wed Feb 22, 2017 2:19 am
Re: Calculo de distancias por GPS con funciones del MYSQL
Compañeros
Gracias por compartir con nosotros su conocimiento, gracias
My friends
Thank you very much indeed as we learn from others, thank you very much for sharing.
Xmanuel gracias por compartir dime esta funcion es para Xharbour ?? o solo para Harbour. , hbct.lib
Gracias por compartir con nosotros su conocimiento, gracias
My friends
Thank you very much indeed as we learn from others, thank you very much for sharing.
Xmanuel gracias por compartir dime esta funcion es para Xharbour ?? o solo para Harbour. , hbct.lib
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: Calculo de distancias por GPS con funciones del MYSQL
Perdona el retraso...
Está en los dos:
Harbour -> hbct.lib
xHarbour -> ct.lib
Está en los dos:
Harbour -> hbct.lib
xHarbour -> ct.lib
______________________________________________________________________________
Sevilla - Andalucía
Sevilla - Andalucía