Я думаю, что вы в основном ищете центроид вашего многоугольника, вокруг которого вы могли бы центрировать текст.Статья в Википедии содержит хорошее описание различных методов.
Простой подход состоит в том, чтобы просто взять среднее значение всех точек, составляющих ваш многоугольник, и использовать эту усредненную точку в качестве центра вашего текста.
См. Также этот вопрос:
Как найти центр ряда географических точек?
Это немного сложнее, чем простое усреднение,так как вам нужно учитывать кривизну Земли в своих расчетах ( возможно , если масштаб достаточно велик).
Обновление: Я только что подумал опростой способ сделать этоНапишите функцию примерно так:
public Point Centrality(Point somePoint, Point[] otherPoints)
{
float sumOfSquares = 0;
foreach (Point point in otherPoints)
{
float dist = DistanceBetween(somePoint, point);
sumOfSquares += dist * dist;
}
return 1 / sumOfSquares;
}
Затем (это может быть вычислительно дорого) выполните итерации с любым разрешением, которое вы хотите, через прямоугольник, ограничивающий область, и оцените центральность каждой точки.Точка с самым высоким показателем центральности почти наверняка будет в границах сложных областей, поскольку точки за пределами области будут удалены от всех точек, составляющих область (именно поэтому вы используете квадратное расстояние вместопросто расстояние).
Это может быть просто отправной точкой.Эта мера будет сильно зависеть от гранулярности точек / линий, составляющих регион - например, если бы ручку Флориды определяли, используя в два раза больше точек, чем в другой половине Флориды, точка с наивысшей мерой центральности была бы хорошов ручку, а не в центр, как это должно быть.