Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何快速计算与我的点在给定距离内的点_Java_Math_Geometry_Coordinates - Fatal编程技术网

Java 如何快速计算与我的点在给定距离内的点

Java 如何快速计算与我的点在给定距离内的点,java,math,geometry,coordinates,Java,Math,Geometry,Coordinates,我有大量的经度和纬度,我想快速找出哪些经度和纬度在某个经度的5公里半径范围内 我应该能够非常快速地执行n-do产品,而不是使用数据结构(这将是过分的)。我刚刚做错了什么,似乎看不出是什么 我一直在尝试用Java实现这一点: final List<CoOrds> coOrds = Create20x20Grid(); // Determine point X (centre of earth) final Vector2 X = new

我有大量的经度和纬度,我想快速找出哪些经度和纬度在某个经度的5公里半径范围内

我应该能够非常快速地执行n-do产品,而不是使用数据结构(这将是过分的)。我刚刚做错了什么,似乎看不出是什么

我一直在尝试用Java实现这一点:

        final List<CoOrds> coOrds = Create20x20Grid();

        // Determine point X (centre of earth)
        final Vector2 X = new Vector2(0,0);

        // My CoOrd I want to check
        final double srclon = coOrds.get(0).getLongitude();
        final double srclat = coOrds.get(0).getLatitude();

        final Vector2 A = new Vector2(srclon, srclat, true);

        final double brng = 0;
        final double d = 5;
        final double R = 6371.1;
        double dist = 0;

        dist = d / R; // convert dist to angular distance in radians

        final double lat1 = Math.toRadians(srclat);
        final double lon1 = Math.toRadians(srclon);

        final double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist)+ Math.cos(lat1) * Math.sin(dist) * Math.cos(brng));
        double lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) * Math.cos(lat1),Math.cos(dist) - Math.sin(lat1) * Math.sin(lat2));

        // normalise to -180..+180º
        lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI) - Math.PI;


        //Create another point which is the distance is d away from your point
        final Vector2 B = new Vector2(Math.toDegrees(lon2),Math.toDegrees(lat2), true);

        // Create a vector from X->A
        final Vector2 X_A = new Vector2((A.getX() - X.getX()),(A.getY() - X.getY()));
        // Create a vector from X->B
        final Vector2 X_B = new Vector2((B.getX() - X.getX()),(B.getY() - X.getY()));

        // Normalize XA
        final Vector2 nX_A = X_A.normalize();
        // Normalize XB
        final Vector2 nX_B = X_B.normalize();

        // Calculate the Dot Product
        final Double Alpha = nX_A.dot(nX_B);

        int count = 0;
        for (final CoOrds c : coOrds) {

            final Vector2 P = c.getPosition();
            final Vector2 X_P = new Vector2((P.getX() - X.getX()),(P.getY() - X.getY()));

            final Vector2 nX_P = X_P.normalize());
            final Double Beta = nX_A.dot(nX_P);

            if (Beta < Alpha) {
                System.out.println(count + " -- " + Beta + " : " + Alpha);
                count++;
            }

        }


        System.out.println("Number of CoOrds within Distance : " + count);
Dot产品:

    public double dot(final Vector2 v2) {

    return ((getX() * v2.getX()) + (getY() * v2.getY()));

}
标准化:

    public Vector2 normalize() {

    final double num2 = (getX() * getX()) + (getY() * getY());
    final double num = 1d / Math.sqrt(num2);

    double a = x;
    double b = y;

    a *= num;
    b *= num;

    return new Vector2(a, b);
}
在此方面的任何帮助都将不胜感激

我使用了这个网站: 帮我计算B点

我使用了这个网站: 帮助我将球坐标转换为笛卡尔坐标

谢谢

[编辑]

我当前运行的测试用例是:

0-0-0

2-2-0

1-2-0

其中,上面是一个由9个点组成的网格。我要检查的是“1”。我希望它返回所有的“2”点。但它正在返回网格中的所有点。我已经手动检查了谷歌地图上的距离,它应该只返回点“2”


感谢上面的评论,您不确定您的公式是否准确

第一步是弄清楚这一点


选择地球上的几个著名点(北极、南极、英国格林威治等),并创建一个使用这些坐标调用ConvertSphereCaltoCartesian()的测试用例。检查结果,看看它们是否有意义。

从上面的评论中,你不确定你的公式是否准确

第一步是弄清楚这一点


选择地球上的几个著名点(北极、南极、英国格林威治等),并创建一个使用这些坐标调用ConvertSphereCaltoCartesian()的测试用例。检查结果,看看它们是否有意义。

欢迎使用堆栈溢出!让陌生人通过检查来发现代码中的错误是没有效果的。您应该使用调试器或打印语句来识别(或至少隔离)问题,然后返回一个更具体的问题(一旦您将问题缩小到10行)。是什么让您认为您的代码有问题?您是在问如何检查您的代码是否正确?抱歉,我是新手。基本上我已经建立了一个20x20的测试网格,每个点之间的距离是1km。当我选择一个点来查看1km内的点时,它会返回全部400。什么时候它应该返回8@Sonil-这是个好消息。把它添加到你的问题中,这样读者就会知道你在问什么。看来你的第一步是证明你的公式是正确的。用一个众所周知的答案挑2分(不是全部400分——那太难了!)然后进行计算。如果它能工作,你就会知道问题出在别处。欢迎使用堆栈溢出!让陌生人通过检查来发现代码中的错误是没有效果的。您应该使用调试器或打印语句来识别(或至少隔离)问题,然后返回一个更具体的问题(一旦您将问题缩小到10行)。是什么让您认为您的代码有问题?您是在问如何检查您的代码是否正确?抱歉,我是新手。基本上我已经建立了一个20x20的测试网格,每个点之间的距离是1km。当我选择一个点来查看1km内的点时,它会返回全部400。什么时候它应该返回8@Sonil-这是个好消息。把它添加到你的问题中,这样读者就会知道你在问什么。看来你的第一步是证明你的公式是正确的。用一个众所周知的答案挑2分(不是全部400分——那太难了!)然后进行计算。Vector2类可以接受一个布尔值,允许它执行到笛卡尔坐标的转换。Vector2A=新的Vector2(srclon,srclat,true);然后,该方法将球坐标转换为笛卡尔坐标。然后,我将笛卡尔坐标存储为向量类中的X,Y。(保留长lat仅供我自己参考)好的,我们都从互联网上复制粘贴代码。但是,您的代码不起作用,您必须在代码中爬行并找到漏洞。发展这项技能与学习如何编码一样重要。Vector2类可以接受布尔值,从而执行到笛卡尔的转换。Vector2A=新的Vector2(srclon,srclat,true);然后,该方法将球坐标转换为笛卡尔坐标。然后,我将笛卡尔坐标存储为向量类中的X,Y。(保留长lat仅供我自己参考)好的,我们都从互联网上复制粘贴代码。但是,您的代码不起作用,您必须在代码中爬行并找到漏洞。发展这项技能与学习如何编码一样重要。
    public Vector2 normalize() {

    final double num2 = (getX() * getX()) + (getY() * getY());
    final double num = 1d / Math.sqrt(num2);

    double a = x;
    double b = y;

    a *= num;
    b *= num;

    return new Vector2(a, b);
}