Хранение трехмерных фигур на сервере SQL с использованием типа данных геометрии и WKT - PullRequest
0 голосов
/ 23 мая 2011

Я смотрю на тип данных геометрии в Sql Server 2008, и он выглядит интересно, но документация кажется не очень хорошей.Смогу ли я хранить конусы, цилиндры и сферы в формате WKT?Эти объекты традиционно имеют радиус, а не сотни точек.

Ответы [ 3 ]

1 голос
/ 23 мая 2011

Быстро осмотрелся и нашел эту страницу MSDN на Пространственные образцы . Он охватывает все методы для ввода данных в WKT, WKB & XML (GML), а также функции для просмотра в удобочитаемой форме. Он также охватывает MakeValid, STIsValid и STSrid.

Есть несколько примеров SQL, которые могут оказаться полезными

1 голос
/ 24 июня 2011

извините за поздний ответ.Вы всегда можете написать свой собственный Определяемый пользователем тип , называемый Круг , с двумя свойствами, а именно: Центроид и Радиус .

Внутри недавно сформированного UDT создайте метод, который принимает свойства Centroid ( Point3D ) и Radius ( Double ).После этого создайте метод, который использует SqlGeometry и SqlGeometryBuilder для построения вновь сформированного объекта.

Сначала создайте Point экземпляр Геометрия .Унаследуйте значения Centroid от объекта класса, затем создайте еще одну Geometry Polygon , полученную из объекта Point и STBuffer ( Радиус ) it.

Ниже приведен мой пример: (записано за 30 минут)

public SqlGeometry ToSQLGeometry()
    {
        int srid = this.SRID; // i.e. 4326

        SqlGeometry geom = new SqlGeometry();
        SqlGeometryBuilder gb = new SqlGeometryBuilder();
        OpenGisGeometryType pt = OpenGisGeometryType.Point;

        gb.SetSrid(srid);

        gb.BeginGeometry(pt);
        gb.BeginFigure(this.Centroid.X, this.Centroid.Y, this.Centroid.Z, this.Centroid.M);
        gb.EndFigure();
        gb.EndGeometry();

        geom = gb.ConstructedGeometry;
        geom = geom.MakeValid(); // Optional for Point data

        SqlGeometry geomCircle = new SqlGeometry();
        geomCircle = geom.STBuffer(this.Radius);

        return geomCircle;
    }

Когда вы сделали это в VS2010, используя тип проекта CLR, выможет развернуть его в вашей базе данных.

В SQL вы можете вызвать объект как таковой: * Parse (XYZM, R)

declare @c Circle
set @c = Circle::Parse('5 6 7 8,2')
select 'Circle', @c.ToString(), @c.ToSQLGeometry()
1 голос
/ 23 мая 2011

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

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

...