2015-06-16 2 views
2

Я использую Twitter4J для извлечения места пользователя из его профиля. У меня есть набор гео-координаты, образующих многоугольник границы (обычно 4 или более координаты), используя этот вызов:Поиск центра набора координат с использованием Java

// Status tweet 
Place place = tweet.getPlace(); 
GeoLocation[][] box = place.getBoundingBoxCoordinates(); 

Есть ли способ, чтобы вычислить центр (или вблизи центра, или, по крайней мере, содержала точку) этой области/многоугольника/границы? Есть ли Java API для этого?

Есть ли Java эквивалент этого JavaScript кода, взятый из этого post:

var bounds = new google.maps.LatLngBounds(); 
bounds.extend(results[0].geometry.location); 
var center = bounds.getCenter(); 
+0

Не могли бы вы посоветовать, как выглядят ваши входы, как они хранятся и т. Д.? –

ответ

5

Простой способ:

centerLatitude = (min(latitude) + max(latitude))/2 
centerLongitude = (min(longitude) + max(longitude))/2 
2

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

Если выбросы не являются проблемой, другим способом было бы сначала рассчитать convex hull, а затем его центр. Вы можете легко вычислить его с библиотекой топологии, как JTS: http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/algorithm/ConvexHull.html

Geometry hull = new ConvexHull(coordinates, new GeometryFactory()); 
Point center = hull.getCentroid(); 

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

Смежные вопросы