Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создание полигона Geography  [new]
Sharp Dev
Member

Откуда:
Сообщений: 6
Доброго времени.
Есть таблица у которой поле имеет тип данных geography
вставляю данные хранимой процедурой.
в поле geography вставляю полигон полученный из точек, которые приняла ХП.
например:
set @poly2 = geography::STGeomFromText('POLYGON((45.000 31.000, 45.10 31.05, 45.11 31.10, 45.000 31.000))', 4326)

но столкнулся с такой проблемой. Точки полигона необходимо передавать последовательно начиная с верхней правой точки и по часовой стрелке. если точки идут в произвольном порядке вылазит ошибка что объект не есть геометрического типа.
точек у меня может быть разное кол-во. если 4 точки и фигура прямоугольник - проблем нет никаких.
но пользователь может изменять фигуру. И, например, из прямоугольника сделать многоугольник(вставив произвольные точки)
или же изначально рисовать многоугольник.
Подскажите как правильно из набора координат создать объект типа geography.
Спасибо.
22 ноя 11, 13:28    [11637349]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
Sharp Dev,

Алгоритм Грэхема подойдёт только если многоугольник выпуклый.
22 ноя 11, 14:03    [11637682]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Sharp Dev
Member

Откуда:
Сообщений: 6
grigrim,

а проще никак?
неужели нельзя просто передать массив точек и построить полигон?
22 ноя 11, 16:52    [11639108]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Sharp Dev
grigrim,

а проще никак?
неужели нельзя просто передать массив точек и построить полигон?
А разве неупорядоченную кучу точек можно однозначно
соединить отрезками, чтобы получился единственно возможный полигон?
22 ноя 11, 16:55    [11639137]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Sharp Dev, праильно ли я понимаю, что клиент имеет полигон в виде точек, далее он делает Random Sort и передаёт серверу, который должен сделать UnRandomize Sort обратно и сохранить ?

Три идентичных полигона:

К сообщению приложен файл. Размер - 3Kb
22 ноя 11, 17:01    [11639189]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Sharp Dev
Member

Откуда:
Сообщений: 6
у полигона всегда больше 3 точек.
точки добавляются следующим путем:
пользователь зажимает мышку в произвольном месте линии и тянет ее в какую то сторону. когда он отпустил клавишу мышки в этом месте добавляется точка полигона.

вот так я создаю полигон(на сишарпе у клиента)


public static Point[] GetRoundPoilygon(Point center, double radius, int numPoint)
        {
            Point[] pointArray = new Point[numPoint];
            if (numPoint > 0)
            {
                for (int i = 0; i < numPoint; i++)
                {
                    double d = (6.2831853071795862 / ((double) numPoint)) * i;
                    pointArray[i] = new Point((radius * Math.Cos(d)) + center.X, (radius * Math.Sin(d)) + center.Y);
                }
            }
            return pointArray;
        }


private void ScaleShape(Point origin, Rect rect, MyClassWithPolygonInfo zone, IList<Point> template)
        {
            for (int i = 0; i < zone.Points.Count; i++)
            {
                Point point = template[i];
                double x = rect.X + (point.X * rect.Width);
                Point point2 = template[i];
                double y = rect.Y + (point2.Y * rect.Height);
                zone.Points[i] = new Point(x, y);
                
            }
            
        }

private void Do()
{
var zone = new    MyClassWithPolygonInfo();
zone.Name = "Test polygon";
var zoneTemplate = GetRoundPoilygon(new Point(0.5, 0.5), 0.5 , 6);
          foreach (Point tmpPoint in zoneTemplate)
                    {
                        zone.Points.Add(tmpPoint);

                    }
                    ScaleShape(new Point(0.0, 0.0), new Rect(originPoint, point), zone, zoneTemplate);
}


originPoint - это точка с которой начинали рисовать полигон(нажали клавишу мышки и с зажатой клавишей начали тянуть мышку, растягивая полигон)
point - точка в которой мы отпустили мышку(закончили рисовать полигон)

и вот уже после ScaleShape у меня получается нужный мне полигон, точки которого я передаю в ХП. но при создании объекта geography sql говорит мне что фигура не правильная.
22 ноя 11, 17:31    [11639486]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Sharp Dev
я создаю полигон (на C# у клиента)
Ну тогда сразу посылайте полигон с типом geometry/geography в процедуру.
Кстати а почему geography?
22 ноя 11, 18:30    [11639984]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SqlGeometry
SQL 2008 Spatial Samples, Part 3 of 9 - SQL Builder API
22 ноя 11, 18:42    [11640034]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Sharp Dev
Member

Откуда:
Сообщений: 6
Это тоже самое что и в SQL'е написано, только на сишарпе. Поэтому, как я понимаю, будет та же самая ошибка что и с SQL'ем
24200: The specified input does not represent a valid geography instance.
т.е. либо у меня при построении полигона не в том порядке точки генерируются, либо хз ))
22 ноя 11, 19:15    [11640218]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Sharp Dev
Member

Откуда:
Сообщений: 6
Только что попробовал, так оно и оказалось :(
неужели нет другого способа кроме как сортировки точек?
22 ноя 11, 19:57    [11640458]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Туго.
Sharp Dev
неужели нет другого способа кроме как сортировки точек?
Интерфейс не должен позволять создавать неправильную последовательность точек изначально, как ни крути. Вы же вызваете у объекта Graphics метод DrawPolygon / FillPolygon ?
Поэтому о сортировке точек не может быть и речи.

Sharp Dev, вы должны понимать очевидную вещь:
От создание данных до их сохранения не может быть никаких логических преобрахований.
Макимум преобразование формата (и то по минимуму), который априори однозначный, линейный, топорный.
22 ноя 11, 20:40    [11640647]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигона Geography  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
iap
А разве неупорядоченную кучу точек можно однозначно
соединить отрезками, чтобы получился единственно возможный полигон?

Да, если в результате получится выпуклый многоугольник, внутри которого могут быть точки, не попавшие на границу, но снаружи него таких точек точно нет: выпуклая оболочка.
22 ноя 11, 21:13    [11640826]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить