考虑一下,您是披萨送货员,并且您想计算您的有效范围(您可以在 30 分钟内到达的范围)。并且您想制作该时间数据的 N 到 E 部分的彩色条形 3d 图,例如(使用虚假数据):
而且你想包括大约 100k 的房子......好吧,至少我听说,像这样的程序是在谷歌地图中引入的限制之前制作的。在这种情况下,限制只会咬紧牙关。
如果您有所有房屋的地理位置,那么当您像鸟一样飞翔时,您可以根据地球上的点有多远来预测。基于此对它们进行排序,并找到最佳预测的结果。
编辑:添加了 Java 代码示例,在创建预测时可能很有用:
/**
* Thaddeus Vincenty's inverse method formulae implementation for
* geographical distance between two given points on earth.
* @param L1
* geographical latitude of standpoint in decimal degrees
* @param G1
* geographical longitude of standpoint in decimal degrees
* @param L2
* geographical latitude of destination in decimal degrees
* @param G2
* geographical longitude of destination in decimal degrees
* @return Geographical distance in kilometeres
*/
public static double getDistance(final double L1, final double G1,
final double L2, final double G2) {
double delta, p0, p1, p2, p3;
// The average radius for a spherical approximation of Earth
double rEarth = 6371.01d;
delta = G1 - G2;
p0 = Math.cos(L2) * Math.cos(delta);
p1 = Math.cos(L2) * Math.sin(delta);
p2 = Math.cos(L1) * Math.sin(L2) - Math.sin(L1) * p0;
p3 = Math.sin(L1) * Math.sin(L2) + Math.cos(L1) * p0;
return rEarth * Math.atan2(Math.sqrt(p1 * p1 + p2 * p2), p3);
}
/**
* Rounds double to nr number of decimal places
* @param d
* floating-point number
* @param nr
* decimal places to keep
* @return rounded number with nr decimal places
*/
public static double round(double d, int nr) {
return new java.math.BigDecimal(Double.toString(d)).setScale(nr,
java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static void main(String[] args) {
double L1 = Math.toRadians(Double.parseDouble(args[0]));
double G1 = Math.toRadians(Double.parseDouble(args[1]));
double L2 = Math.toRadians(Double.parseDouble(args[2]));
double G2 = Math.toRadians(Double.parseDouble(args[3]));
System.out.println(round(getDistance(L1, G1, L2, G2), 2));
}