Учтите, что вы являетесь поставщиком пиццы и хотите рассчитать эффективный диапазон (куда вы можете пойти в течение 30 минут). И вы хотите сделать цветную гистограмму 3d-графика из данных от N до E того времени, что-то вроде (с поддельными данными):
И вы хотите включить около 100 тыс. Домов ... Ну, по крайней мере, я слышал, что такая программа была создана до того, как была введена в карту Google. В этом случае ограничения просто сильно кусаются.
Если у вас есть географическое положение из всех домов, то вы можете найти прогноз на основании того, как далеко находятся точки на земле, когда вы летите, как птица. Отсортируйте их на основании этого и найдите результаты для лучших прогнозов.
Редактировать: Добавлен пример кода 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));
}