В Django это тривиально (и на самом деле работает, у меня были проблемы с рядом решений, неправильно возвращающих отрицательные значения для широты).
Например, допустим, вы используете django-геопосткоды (автором которого я являюсь).
from django.contrib.gis.geos import MultiPoint
from django.contrib.gis.db.models.functions import Distance
from django_geopostcodes.models import Locality
qs = Locality.objects.anything_icontains('New York')
points = [locality.point for locality in qs]
multipoint = MultiPoint(*points)
point = multipoint.centroid
point
- это экземпляр Django Point
, который затем можно использовать для таких вещей, как извлечение всех объектов, которые находятся в пределах 10 км от этогоцентральная точка;
Locality.objects.filter(point__distance_lte=(point, D(km=10)))\
.annotate(distance=Distance('point', point))\
.order_by('distance')
Изменение этого в необработанный Python тривиально;
from django.contrib.gis.geos import Point, MultiPoint
points = [
Point((145.137075, -37.639981)),
Point((144.137075, -39.639981)),
]
multipoint = MultiPoint(*points)
point = multipoint.centroid
Под капотом Django использует GEOS - подробнее на https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/