我画了一个反映我当前位置的点。我在地图上也有一些形状。但是,由于GPS精度的变化,我需要表明即使LatLng点仍然在它之前我已经在地图上划线,但精度是~20(m)。 是)我有的: - 线路的起点和终点 - 圈子的中心 - 圆的半径(以米为单位)
我能够计算直线和圆的中心点之间的距离,但这给了我像:0.00987506668990474这样的值,它给了我什么都没有,因为这个值不反映以米为单位的距离我可以& #39; t真的将其转换为米并与精度半径进行比较。 我甚至不确定我是否有良好的目标来获取这些信息。如果有交叉点,可能还有另一种获取信息的方法。
感谢任何提示
更新: 使用距离* 110km我得到了更好的结果。 幸福的脸=没有检测到交叉 - 距离<半径,悲伤的脸=检测到的交叉点 - 距离>半径。 黄区边缘是矿线段。正如您所看到的那样,当交叉点位于顶部(/底部)而不是左侧(/右侧)时,它可以正常工作。 这是我的计算算法,计算从线段到点的距离。原谅这个烂摊子......我还在努力解决这个问题,所以它还没有优化:
public static double pointLineSegmentDistance(final List<Double> point, final List<List<Double>> line)
{
List<Double> v = line.get(0);
List<Double> w = line.get(1);
double d = pointPointSquaredDistance(v, w);
double t;
List<Double> calculateThis;
if (d > 0)
{
boolean test = (t = ((point.get(0) - v.get(0)) * (w.get(0) - v.get(0)) + (point.get(1) - v.get(1)) * (w.get(1) - v.get(1))) / d) < 0;
if (test)
{
calculateThis = v;
}
else
{
if (t > 1)
{
calculateThis = w;
}
else
{
calculateThis = new ArrayList<Double>();
calculateThis.add(v.get(0) + t * (w.get(0) - v.get(0)));
calculateThis.add(v.get(1) + t * (w.get(1) - v.get(1)));
}
}
}
else
{
calculateThis = v;
}
return Math.sqrt(pointPointSquaredDistance(point, calculateThis));
}
public static double pointPointSquaredDistance(final List<Double> v, final List<Double> w)
{
double dx = v.get(0) - w.get(0);
double dy = v.get(1) - w.get(1);
return dx * dx + dy * dy;
}
最终列表点 - 包含2个元素 - (0)纬度(1)经度 列表&gt; line - 包含2个列表 - (0)线段起点(0/0)lat /(0/1)long(1)线段终点(1/0)lat /(1/1)long
答案 0 :(得分:0)
您有两种可能性:
1)便宜的方式:
使用android api(distanceBetween())计算线起点/终点与圆心之间的距离。结果将以米为单位,并通过点对点距离计算进行校正。取最小的起点/终点到中心圆距离。 如果线段与圆半径非常长,那么线与中心的正常距离,使用这种计算是错误的
2)更好的方式,但更复杂:
您将线的起点和终点以及圆心转换为笛卡尔x,y空格,单位为米,并计算到线的距离
段使用笛卡尔数学。 (参见线段计算的距离)
首先检查option1,因为它只是一行代码。
您的结果0.00987506668990474这看起来像是以度为单位的距离,而不是米。乘以111km给出的值约为1km。 (在赤道上)
答案 1 :(得分:0)
最后我解决了我的问题。它的解决方案非常简单。比我想象的要简单得多。这里有maputil库: https://github.com/googlemaps/android-maps-utils
该库提供名为“isLocationOnPath”的函数:
boolean isLocationOnPath(LatLng point, List<LatLng> polyline, boolean geodesic, double tolerance)
点 - 是一个中心或我的观点。 折线 - 根据我的需要是多边形的边缘, 测地线 - 真(当然) 公差 - (以米为单位)是我从GPS精度中获得的精度 - 基本是圆半径。
我希望有所帮助。