Я думаю, вы можете найти всю необходимую вам информацию здесь: https://blog.mapbox.com/a-new-algorithm-for-finding-a-visual-center-of-a-polygon-7c77e6492fbc
Он связан с модулем javascript (https://github.com/mapbox/polylabel),, но я надеюсь, что вы легко можете переписать его.
Чтобы не просто разделять URL, я скопировал наиболее релевантную информацию из поста в блоге здесь:
Основной принцип - использование четырех деревьев. Основная идея - рекурсивное деление двумерного пространства на четыре.Квадранты. Начните с нескольких больших ячеек, покрывающих многоугольник. Рекурсивно подразделяйте их на четыре меньшие ячейки, исследуя центры ячеек как кандидатов и отбрасывая ячейки, которые не могут содержать решение лучше, чем тот, который мы уже нашли.
Как мы узнаем, можно ли отбросить ячейку? Рассмотрим образец квадратной ячейки над многоугольником:
Если мы знаем расстояние от ячейкиот центра до многоугольника (dist выше), любая точка внутри ячейки не может иметь большее расстояние до многоугольника, чем dist + radius, где radius - это радиус ячейки.что потенциальный максимум ячейки меньше или равен лучшему расстоянию ячейки, которое мы уже обработали (с заданной точностью), мы можем безопасно отбросить ячейку.
Чтобы это предположение работало правильно для любой ячейки независимо от того,их центр находится внутри многоугольника или нет, нам нужно использовать расстояние со знаком до многоугольника - положительное, если точка находится внутри многоугольника, и отрицательное, если оно находится снаружи.