Алгоритм определения перекрывающихся географических зон - PullRequest
3 голосов
/ 11 августа 2011

У меня есть широта и долгота для точки, для которой я затем вычисляю окружность, используя радиус, чтобы дать диапазон.У меня также есть широта и долгота границ географического региона (в данном случае штат).Я пытаюсь выяснить, пересекается ли какая-либо область круга с любой областью области.

В основном конечный результат, который я ищу, - это если точка (геокодированный адрес) находится в пределах x миль от любого ее состояниявернет это состояние.

Я уверен, что есть какой-то алгоритм, чтобы найти это, но я не знаю, с чего начать.

Ответы [ 4 ]

3 голосов
/ 11 августа 2011

Используйте формулу Haversine :

a = sin²(Δlat/2) + cos(lat1)*cos(lat2)*sin²(Δlong/2)
c = 2*atan2(√a, √(1−a))
d = R*c

JavaScript:

var R = 6371; // km
var dLat = (lat2-lat1)*Math.PI / 180;
var dLon = (lon2-lon1)*Math.PI / 180;
var lat1 = lat1*Math.PI / 180;
var lat2 = lat2*Math.PI / 180;

var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;

Это даст вам расстояние между любыми двумя точками. Остальное зависит от того, как вы представляете штаты.

0 голосов
/ 12 августа 2011

Если ваш пост будет помечен Java, а не PHP, я бы не стал изобретать велосипед, а просто использовал JTS (Java Topology Suite), создал одну геометрию и вызвал метод

public boolean intersects(Geometry g)

Я не очень разбираюсь в PHP, поэтому не могу сказать, есть ли подобная библиотека для PHP.

Откуда взялись геометрии? Вы также можете попытаться вызвать некоторые базовые функции, например, вызов базы данных, если ваши геометрии хранятся в базе данных, такой как PostGIS

0 голосов
/ 11 августа 2011

Если вы пытаетесь увидеть, находится ли одна точка внутри круга, вы можете использовать теою Пифагора для.В приведенном ниже коде передайте centre_x, centre_y и радиус вашего круга, а затем x, y для точки, которую вы оцениваете.

def in_circle(centre_x, centre_y, radius, x, y):
    square_dist = (centre_x - x) ** 2 + (centre_y - y) ** 2
    return square_dist <= radius ** 2
0 голосов
/ 11 августа 2011

http://en.wikipedia.org/wiki/Quad_tree

Это отличная отправная точка для любых видов пространственных отношений типа.

...