Une façon d'aborder ce problème intéressant est de le considérer comme un estimateur robuste du centre d'une distribution ponctuelle bivariée. Une solution (bien connue) consiste à décoller les coques convexes jusqu'à ce qu'il ne reste plus rien . Le centre de gravité de la dernière coque non vide localise le centre.
(Ceci est lié à la parcelle . Pour plus d'informations, recherchez sur le Web les «valeurs aberrantes multivariées de la coque convexe».)
Le résultat pour les 16 points illustrés est représenté par le triangle central sur cette carte. Les trois polygones environnants montrent les coques convexes successives. Les cinq points périphériques (30% du total!) Ont été supprimés au cours des deux premières étapes.
L'exemple a été calculé en R
. L'algorithme lui-même est implémenté dans le bloc du milieu, le «pelage convexe». Il utilise la chull
routine intégrée , qui renvoie les index des points sur la coque. Ces points sont supprimés au moyen de l'expression d'indexation négative xy[-hull, ]
. Cette opération est répétée jusqu'à ce que les derniers points soient supprimés. Dans la dernière étape, le centroïde est calculé en faisant la moyenne des coordonnées.
Notez que dans de nombreux cas, la projection des données n'est même pas nécessaire: les coques convexes ne changeront pas sauf si les caractéristiques d'origine s'étendent sur l'antiméridien (+/- 180 degrés de longitude), l'un ou l'autre des pôles, ou sont si étendues que la courbure des segments entre elles sera faites une différence. (Même alors, la courbure sera de peu d'importance, car le pelage convergera toujours vers un point central.)
#
# Project the data.
#
dy <- c(8,7,5,10,7,17,19,19,21,22,22,22,24,24,26,26)
dx <- c(66,67,66,89,89,79,78,76,75,81,78,77,75,80,77,83)
lat <- (28.702 + dy/1e5) / 180 * pi
lon <- (77.103 + dx/1e5) / 180 * pi
y <- dy
x <- cos(mean(lat)) * dx
#
# Convex peeling.
#
xy <- cbind(x, y)
while(TRUE) {
hull <- chull(xy)
if (length(hull) < nrow(xy)) {
xy <- xy[-hull, ]
} else {
xy.0 <- matrix(apply(xy, 2, mean), 1, 2)
break
}
}
#
# Plot the data `xy` and the solution `xy.0`.
#
plot(range(x), range(y), type="n", asp=1)
points(x, y, pch=21, bg="#a01010")
points(xy.0, pch=24, cex=1.2, bg="#404080")