从今天开始我将不定期更新一些关于GIS的基础算法,主要是我自己个人学习的部分算法的原理介绍和算法代码。
*1.算法原理介绍
点到是否在直线段上,是GIS空间判断的常见问题。点是否在直线段上与点是否在直线上还有一定的差异。对于给定的三点Q 、p1、p2,p1 p2两点构成直线段,分别为该直线段的两个端点。而Q为待判定的是否在直线段p1p2上的点。
利用数学的解析几何的知识,我们利用向量的方式进行判断,首先,对于判断点是否在线段p1p2所在的直线段所在的直线上。利用向量的叉积来进行判断,若(p1-Q)✖(p2-p2) = 0,(说明两条线段平行,又共点,故)则说明点Q已经在直线段p1p2所在的直线上,但是还不能确定是否是在直线段p1p2上,因为可能在p1p2两侧的延长线上,其次,我们需要进行第二次的判别来确定点是否是在p1p2之间,这个时候我们利用判断Q是否在以p1p2为对顶点构成的对角点矩阵所在的区域内来判断点Q是否在p1p2之间的线段上。
其判断方法是看Q点的横纵坐标是否都在p1p2对应的xy的最小到最大的区域范围内。
2.算法代码实现*
package algo;
/**
* @ClassName PointOnLine
* @Description 判断点是否在线上
* @Author luokai
* @CreateDate 2020/8/15 22:51
* @UPpdateUser luokai
* @UpdateDate 2020/8/15 22:51
* @UpdateRemark
* @Version 1.0
* Copyright (c) 2019,
* All rights reserved.
**/
/**
* 算法原理介绍
* 判断一个点是否在一条线上,其原理是利用叉积乘。a×b=|x1, y1|=x1y2-x2y1
* |x2, y2|
* 例如点Q是否在线段p1和P2上 (Q-p1)✖(p2-p1) = 0
* 除此之外,还要保证该点在点p1 p2所连成的对角矩阵的内部 因为第一个条件满足的情况下 可能是p1p2的延长线上
*
*
*/
import entity.Point;
public class PointOnLine {
public boolean PointOnLine(Point p1, Point p2, Point q ){
boolean flag = false; // true 点在线上 false 点不在线上
if(((q.getLon()-p1.getLon()) * (p2.getLat()-p1.getLat())