请推荐好的距离检测算法
本帖最后由 霸气侧漏 于 2015-6-28 15:38 编辑最近在研究GPS想弄个GPS报站,弄了个代码,不大好,求推荐个可以用的距离检测代码 报站还需要测距离? zyw19987 发表于 2015-6-28 16:01
报站还需要测距离?
肯定要检测是否到站,对吧 呵呵,思路错了。 zyw19987 发表于 2015-6-28 17:20
呵呵,思路错了。
哥们有好的思路,说下被 本帖最后由 zyw19987 于 2015-6-28 18:08 编辑
霸气侧漏 发表于 2015-6-28 17:37
哥们有好的思路,说下被
以目标点经纬坐标为圆点画圆。
长期对目标点坐标进行修正
简单点就画个正方形吧。
这样不需要测距了吧。 zyw19987 发表于 2015-6-28 17:43
以目标点经纬坐标为圆点画圆。
长期对目标点坐标进行修正
那怎么知道在圆圈内?不还是要靠距离检测。画圆还有其他的办法没 霸气侧漏 发表于 2015-6-28 19:22
那怎么知道在圆圈内?不还是要靠距离检测。画圆还有其他的办法没
哥们别逗,在圆内都算不出来?
直接算距离就行,精确度不需要太高。 brahen 发表于 2015-6-28 21:11
哥们别逗,在圆内都算不出来?
直接算距离就行,精确度不需要太高。
你的签名很有个性 霸气侧漏 发表于 2015-6-28 19:22
那怎么知道在圆圈内?不还是要靠距离检测。画圆还有其他的办法没
化简为比较xy坐标了啊,不用算长度了啊 zyw19987 发表于 2015-6-28 23:02
化简为比较xy坐标了啊,不用算长度了啊
因为gps有漂移,不是说经纬度一模一样,是在一个区间内 霸气侧漏 发表于 2015-6-28 23:43
因为gps有漂移,不是说经纬度一模一样,是在一个区间内
唉
你画成XY坐标
xy坐标都满足误差范围就可以啦
到目标点是长期修正的 本帖最后由 霸气侧漏 于 2015-6-29 07:18 编辑
zyw19987 发表于 2015-6-29 00:52
唉
你画成XY坐标
xy坐标都满足误差范围就可以啦
哥们,你的意思是,(x,y),(x1,y1)2点
if( (x-x1)<0.2&&(y-y10<0.2))成立就说明进站,是这样的意思么??? 本帖最后由 霸气侧漏 于 2015-6-29 07:18 编辑
哥们,你的意思是,(x,y),(x1,y1)2点
if( (x-x1)<0.2&&(y-y10<0.2))成立就说明进站,是这样的意思么??? 霸气侧漏 发表于 2015-6-29 07:05
哥们,你的意思是,(x,y),(x1,y1)2点
if( (x-x1)
意思是这样的,处理好特殊情况。
你觉得不行? zyw19987 发表于 2015-6-29 07:44
意思是这样的,处理好特殊情况。
你觉得不行?
思路不错,只是这个经纬度差值,去算距离不大好算 霸气侧漏 发表于 2015-6-29 07:55
思路不错,只是这个经纬度差值,去算距离不大好算
论坛好像有高人开源过,而且还考虑了球面距离问题。你找找 zyw19987 发表于 2015-6-29 12:47
论坛好像有高人开源过,而且还考虑了球面距离问题。你找找
没找到,有个
/**
******************************************************************************
* @file GPS_App.c
* @authorDevLabs
* @version V0.1
* @date
* @brief
******************************************************************************
* @attention
*
* <br />Copyright 2013
* <br />http://www.DevLabs.cn
*
* <h2><center>© COPYRIGHT 2013 DevLabs</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "GPS_App.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
//! @name WGS84椭球
//! @{
//! a = 6378137.0000000000;
//! b = 6356752.3142;
//! c = 6399593.6258;
//! _a = 1.0 / 298.257223563;
//! e2 = 0.0066943799013;
//! e2 = (a * a - b * b) / (a * a);
//! e_2 = 0.00673949674227;
//! e_2 = (a * a - b * b) / (b * b);
#define v0 (6.36744914585577e+006)
#define v1 (6.39959362580000e+006)
#define v2 (-2.15650202422767e+004)
#define v3 (1.09003037983916e+002)
#define v4 (-6.12188017458933e-001)
#define v5 (-3.21444799442298e+004)
#define v6 (1.35366946123277e+002)
#define v7 (-7.09481085293974e-001)
#define v8 (4.06137292124076e-003)
#define v9 (-4.16666666666667e-002)
#define v10 (2.50000000000000e-001)
#define v11 (2.52731128372009e-003)
#define v12 (7.57013608867423e-006)
#define v13 (1.38888888888889e-003)
#define v14 (-8.33333333333333e-002)
#define v15 (1.66666666666667e-001)
#define v16 (-1.66666666666667e-001)
#define v17 (3.33333333333333e-001)
#define v18 (1.12324945943115e-003)
#define v19 (8.33333333333333e-003)
#define v20 (-1.66666666666667e-001)
#define v21 (1.96742576567650e-001)
#define v22 (4.04369805395214e-003)
#define PI (3.1415926535898)
//! @}
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static BOOL init = FALSE;
static float distance = 0.0;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @brief大地坐标->高斯平面坐标
*
* @paramB 纬度(单位度)
* @paramL 经度(单位度)
* @paramx x坐标(单位米)
* @paramy y坐标(单位米)
*/
void WGS84_to_cartesian(float B, float L, float *x, float *y)
{
float l, l2, _N, w0, w1, w2, w3, w4, cosb, cosb2;
l = L - ((int)L / 6 * 6 + 3); // 求经差
B = B * PI / 180.0; // 转弧度
l = l * PI / 180.0; // 转弧度
l2 = l * l;
cosb = cos(B);
cosb2 = cosb * cosb;
_N = v1 + (v2 + (v3 + v4 * cosb2) * cosb2) * cosb2;
w0 = v5 + (v6 + (v7 + v8 * cosb2) * cosb2) * cosb2;
w1 = v9 + (v10 + (v11 + v12 * cosb2) * cosb2) * cosb2;
w2 = v13 + (v14 + v15 * cosb2) * cosb2;
w3 = v16 + (v17 + v18 * cosb2) * cosb2;
w4 = v19 + (v20 + (v21 + v22 * cosb2) * cosb2) * cosb2;
*y = v0 * B + (w0 + (0.5 + (w1 + w2 * l2) * l2) * l2 * _N) * cosb * sin(B);
*x = (1.0 + (w3 + w4 * l2) * l2) * l * _N * cosb;
*x += 500000.0;
}
//! 清零记录的距离值(从当前点开始重新计算)
void dis_reset(void)
{
distance = 0;
init = FALSE;
return;
}
//! 距离计算
void dis_calc_process(void)
{
static float x0, y0; // 前一次坐标值
float len = 0.0;
float x1, y1; // 当前坐标值
float lat, lon; // 纬度,经度
// 如果GPS未定位
if (!GPS_get_state())
{
return;
}
// TODO
// 即使定位偶尔也会出现经纬度为0的情况
// if (..)
// {
// }
lat = GPS_get_latitude();
lon = GPS_get_longitude();
// 坐标转换
WGS84_to_cartesian(lat, lon, &x1, &y1);
if (init)
{
len = (sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)));
}
else
{
init = TRUE;
}
x0 = x1;
y0 = y1;
distance += len;
return;
}
/**
* @brief获取从指定点开始的距离
*
* @return distance
*/
INT32U dis_get(void)
{
return (INT32U)distance;
}
/******************* (C) COPYRIGHT 2013 DevLabs **********END OF FILE**********/
电子围栏 bonn_y 发表于 2015-6-30 09:39
电子围栏
什么意思??? mark
页:
[1]