计算最近点和最近线段

上次发了一个“已知一点求最近点(问题请教) ”的贴,今天对这个问题做一下补充探讨。上次是基于Mapx控件做的,今天做的是脱离MAPX的,基于文本文件的。
问题回顾:已知点P(经纬度),查找该点最临近的点D(点,线,面),返回D的名称及与P的方向,位置和距离关系,地物总数大于50万个。
现在实现的功能:生成一个点判断离这个点最近的点的坐标、距离和方向;生成一个点,生成一个线段,判断点到直线的最短距离(分垂足是否落在线段上两种情况)。
大体的思路:求最近点,仍然是遍历。求线段上的最近点,先判断垂足,这里用的是两条垂直的直线的斜率之积为-1,然后判断垂足是否落在线段上,即判断垂足是否在线段的最小范围矩形框。如果是垂足落在线段上那么最短距离是点到垂足的距离,如果不是,那么最短距离是点到线段的最近端点的距离。
发现原来算法问题都是数学问题,我数学不好,唉,一个简单的问题搞了我蛮久。上面的都没有做任何优化,并且把大地坐标当成了直角坐标做(有点不妥,但在速度优先的情况下我觉得这点误差也许还能接受),如果觉得有甚么优化的地方欢迎提出,比如,遍历的时候先判断是否落在已知点附近的固定距离的矩形框。

代码下载地址:https://files.cnblogs.com/Tangf/neardis_new.rar

界面图如下:

原文地址:https://www.cnblogs.com/Tangf/p/440311.html