Способ объединения соседних многоугольников в один многоугольник для карт Google.

Я новичок здесь и новичок в C #, и у меня есть то, на что я надеюсь, это простая проблема для решения.

(Для этого я использую gmaps.net для winforms, но также использую этот метод и с помощью версии карт API-интерфейса Web).

У нас есть база данных zipcodes и областей в нашей базе данных. Каждая область содержит несколько zip-кодов. Каждый zipcode имеет серию координат, которые создают многоугольник карт google для этого zipcode.

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

Теперь ive было поручено добавить к нему границу, но только внешнюю границу, а не границы для каждого внутреннего zipcode.

Теперь я не математический гений любыми средствами, но мне кажется, что я должен запускать каждую группу координат zipcodes (все они объединены в один список PointLatLng), через метод, который будет отбрасывать все из «внутренних» точек, оставляющих только внешние граничные точки, которые мы можем использовать в качестве одного полигона (с границей!) для нашей «площади» ... это возможно? КАК кто-то дал мне удар в правильном направлении, чтобы выяснить, как это сделать?

Благодаря!

Джейсон

c#,google-maps,

0

Ответов: 1


0 принят

Хорошо, поэтому то, что вы ищете, это оболочка con cave вместо выпуклого корпуса. В отличие от выпуклой оболочки, которая имеет только одно решение для любого заданного множества точек, вогнутый корпус имеет множество решений и множество способов их достижения. Двумя наиболее распространенными подходами являются альфа-формы или триангуляция Делоне , а из двух я рекомендую триангуляцию.

Коротким объяснением триангуляции Делоне является создание треугольной сетки из множества точек, так что минимальный внутренний угол любого заданного треугольника как можно больше. Существует много существующих библиотек, которые могут создать для вас триангуляцию Delauney. (Самый рекомендуемый - Triangle.NET ).

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

введите описание изображения здесь

(Кредит Тимоти Шилдс по этому вопросу за изображение.)

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

(Псевдокод)

public Point[] GetPolyFromEdgeGraph(Edge[] edges)
{
    List<Point> poly = new List<Point>();

    Edge edge = edges[0];
    Point start = edge.PointA;
    Point point = start;

    do 
    {
        poly.Add(point);

        edge = point.EdgeA != edge ? point.EdgeA : point.EdgeB;
        point = edge.PointA != point ? edge.PointA : edge.PointB;
    } while (point != start);

    return poly.ToArray();
}
C #, Google-карты,
Похожие вопросы