gpt4 book ai didi

java - 降低复杂性。查找最接近的纬度和经度对

转载 作者:太空宇宙 更新时间:2023-11-04 14:39:56 26 4
gpt4 key购买 nike

我有两个数组代表两个不同的 GPS 路径。每个数组在偶数索引中包含纬度(从 0 开始),在奇数索引中包含经度,如下所示:

48.855002219371706,2.3472976684570312,48.855050000000006,2.34735,48.85508,2.3473200000000003,48.85584,2.3477300000000003,48.8562,2.3465000000000003,...

我想计算这两条路径的最近点之间的距离之和。我使用半正弦方法计算纬度和经度对之间的距离。

这就是我所做的:我搜索当前数组中距离最小的一对纬度和经度。然后,我将最小距离添加到一个变量中,该变量对所有最小距离进行求和。然后我从数组中删除处理过的纬度和经度。

这是代码:

public class Distance {

private String filename1;
private String filename2;

public Distance(String filename1, String filename2) {
this.filename1 = filename1;
this.filename2 = filename2;
}

public double distance() {
if(this.filename1.equals(this.filename2))
return 0;
double distance = 0;
BufferedReader br1 = null;
BufferedReader br2 = null;
try {
br1 = new BufferedReader(new FileReader("files/" + this.filename1));
br2 = new BufferedReader(new FileReader("files/" + this.filename2));
String []data1 = br1.readLine().split(",");
String []data2 = br2.readLine().split(",");
System.out.println("Number of points in " + this.filename1 + " = " + data1.length/2);
System.out.println("Number of points in " + this.filename2 + " = " + data2.length/2);

while((isPresent(data1)) && (isPresent(data2))) {
int posi = -1;
int posj = -1;
double minD = Double.MAX_VALUE;

for(int i = 0; i < data1.length; i+=2) {
if(!data1[i].equals("-9999")) {
double lat1 = Double.parseDouble(data1[i]);
double lon1 = Double.parseDouble(data1[i+1]);

for(int j = 0; j < data2.length; j+=2) {
if(!data2[j].equals("-9999")) {
double lat2 = Double.parseDouble(data2[j]);
double lon2 = Double.parseDouble(data2[j+1]);
double d = getDistance(lat1, lon1, lat2, lon2);
if(minD > d) {

minD = d;
posi = i;
posj = j;
}
}
}
}
}
if(posi != -1){
data1[posi] = data1[posi+1] = data2[posj] = data2[posj+1] = "-9999";
distance += minD;
}
}
} catch (FileNotFoundException e) {

e.printStackTrace();
} catch (IOException e) {

e.printStackTrace();
} finally {
if(br1 != null) {
try {
br1.close();
} catch (IOException e) {

e.printStackTrace();
}
}
if(br2 != null) {
try {
br2.close();
} catch (IOException e) {

e.printStackTrace();
}
}
}
return distance;
}

private boolean isPresent(String arr[]) {

for(int i = 0; i < arr.length; i+=2) {
if(!arr[i].equals("-9999"))
return true;
}
return false;
}

private double getDistance(double lat1, double lon1, double lat2,
double lon2) {

double R = 6378.1; // Radius of the earth in km
double dLat = deg2rad(lat2-lat1); // deg2rad below
double dLon = deg2rad(lon2-lon1);
double a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double d = R * c; // Distance in km
return d*1000;
}

private double deg2rad(double d) {

return d * (Math.PI/180);
}
}

您认为这样做是一种笨拙的方式吗?我怎样才能快速完成?

注意我已经看到了 Closest pair of points problem但不知道如何用纬度和经度来实现它,以比较两个不同数组之间的点。

最佳答案

希望这可以帮助

输入:带有纬度和经度数据的文件
从第一个文件

  • 根据纬度对所有值进行排序并存储在数组中

  • 根据经度对所有值进行排序并将其存储在第二个数组中


数组的输入大小为 n 和 m
现在从第二个数组中选择一个点并使用此 video 找到最近的点
对所有点重复此操作并打印最小值

对每个数组进行排序 O(nlogn)*2=O(nlogn)找到最近的点不会超过O(2m)

由于数组长度已知。使用大尺寸数组并将其用于 n 尺寸数组操作。

<小时/>


如果其中一个文件已修复,则可以重新使用该文件。

关于java - 降低复杂性。查找最接近的纬度和经度对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25062723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com