Подгонка названий мест в форме карты - PullRequest
1 голос
/ 28 мая 2010

Я рисую фигуры, используя GDI +, используя список широт и долгот, и мне нужно поместить название места в пределах границ многоугольника. Простое центрирование текста в ограничительном прямоугольнике не работает для неправильных форм. У меня есть текст и шрифт, чтобы я мог получить размер прямоугольника, в который должен будет поместиться текст, но в этот момент я застрял.

Это похоже на общую проблему, которую решает все картографическое программное обеспечение, а также на то, что вы найдете в учебнике по алгоритму или компьютерной графике.

Итак, учитывая список чисел для многоугольника и прямоугольника, есть ли способ получить наилучшую возможную точку для размещения текста, используя: 1) GDI +; 2) SQL Server Geospatial; или же 3) код c # (или c, псевдокод и т. Д.)

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Я думаю, что вы в основном ищете центроид вашего многоугольника, вокруг которого вы могли бы центрировать текст.Статья в Википедии содержит хорошее описание различных методов.

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

См. Также этот вопрос:

Как найти центр ряда географических точек?

Это немного сложнее, чем простое усреднение,так как вам нужно учитывать кривизну Земли в своих расчетах ( возможно , если масштаб достаточно велик).

Обновление: Я только что подумал опростой способ сделать этоНапишите функцию примерно так:

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;
} 

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

Это может быть просто отправной точкой.Эта мера будет сильно зависеть от гранулярности точек / линий, составляющих регион - например, если бы ручку Флориды определяли, используя в два раза больше точек, чем в другой половине Флориды, точка с наивысшей мерой центральности была бы хорошов ручку, а не в центр, как это должно быть.

0 голосов
/ 28 мая 2010

Самое простое, что можно сделать, это нарисовать их все под своей формой с прямоугольником вокруг них.

-Get the maximum Y from your coordinates
-Get the minimum & maximum X from your coordinates
-Draw the box at position [maxX-minX / 2 - (sizemessage/2)),y]
...