Как работать с данными Geography?

Gena928

День добрый,надо создать win forms приложение, которое получает и сохраняет данные в формате geography (SQL Server 2008). Кто-нибудь работал с этим? Поделитесь ссылочкой на примеры пожалуйста.Что интересует:- какой тип данных в C# соответствует geography в SQL?- как такие данные можно прочитать через SQLDatareader и записать обратно?- как конвертировать? Например вот это: +55° 25' 39.24", +37° 33' 15.84" соответствует вот этому: 55.424727,37.559309. Как это перегоняется друг в друга?Спасибо.
15 ответов

Gena928

В записи 55.42 дробная часть представляет собой 42% от единицыВ записи 55° 25' число 25 представляет собой 25 минут из 60, что составляет те же 42%.


Gena928

Gena928,1) 25' 39.24"=(25*60+39.24)/3600=0,4275662) 0,427566*60=25,65396=25' (25,65396-25)*60=39,2376"


Gena928

Antonariy,Супер. Спасибо большое. Значит подойдет Decimal в C#.А как добавить значения в SQL базу данных? Pation написал пример, но там используется 4 параметра.
CREATE TABLE SpatialTable 
 ( id int IDENTITY (1,1),
 GeogCol1 geography, 
 GeogCol2 AS GeogCol1.STAsText() );
GO

INSERT INTO SpatialTable (GeogCol1)
VALUES (geography::STGeomFromText('LINESTRING(47.656 -122.360, 47.656 -122.343)', 4326));
у нас 2. Какое там соответствие?


Gena928

beg-in-er,thanks!


Gena928

Кажется разобрался.У класса SqlGeography есть свойство SqlGeography.Point, с помощью которого его можно конструировать.Constructs a SqlGeography instance representing a Point instance from its x and y values and a spatial reference ID (SRID).
[SqlMethodAttribute(IsDeterministic = true, IsPrecise = false)]
public static SqlGeography Point(
	****** latitude,
	****** longitude,
	int srid
)
Дальше это все может идти как параметр для хранимой процедуры.


Gena928

А нет, ошибся.Передавать данные в SQL надо как float. А дальше уже в SQL server преобразовывать в SqlGeography.
DECLARE @g geography; 
SET @g = geography::Point(47.65100, -122.34900, 4326)
SELECT @g.ToString();


Gena928

Кажется разобрался.У класса SqlGeography есть свойство SqlGeography.Point, с помощью которого его можно конструировать.Constructs a SqlGeography instance representing a Point instance from its x and y values and a spatial reference ID (SRID).
[SqlMethodAttribute(IsDeterministic = true, IsPrecise = false)]
public static SqlGeography Point(
	****** latitude,
	****** longitude,
	int srid
)
Дальше это все может идти как параметр для хранимой процедуры.
Скажите пожалуйста, а как Вы в C# нашли тип SqlGeography?Когда я пытаюсь его ввести он мне выдает ошибку и при этом отсутствует список подключаемых директорий.


Gena928

нашли тип SqlGeography?
Тут. Если у вас д именно сиквел.https://msdn.microsoft.com/ru-ru/library/microsoft.sqlserver.types.sqlgeography.aspx


Gena928

Тут. Если у вас д именно сиквел.https://msdn.microsoft.com/ru-ru/library/microsoft.sqlserver.types.sqlgeography.aspx
Пытаюсь подключить директиву "using Microsoft.SqlServer.Types" не даёт. "Microsoft.SqlServer" подключить даёт, а дальше предлагает только Server


Gena928

Vlad__i__mir,Мож. NuGet надо добавить дополнительно.Пробуй.


Gena928

Vlad__i__mir,Мож. NuGet надо добавить дополнительно.Пробуй.
Благодарю! У меня не было этого пакета, через NuGet установил и всё заработало.Скажите вот я создал в классе поле данного типа:
class GeographicalKoordinates
 {
 public virtual int Id_GeographicalKoordinates { get; set;}
 public virtual SqlGeography Koordinate { get; set; }

 }
Теперь я смогу оперировать ими с помощью свойств описанных в вашей ссылки (https://msdn.microsoft.com/ru-ru/library/microsoft.sqlserver.types.sqlgeography.aspx)?Или нужно ещё что-то сделать?Для чего нужен вот этот код приведённый по этой ссылки?
[SerializableAttribute]
[CLSCompliantAttribute(true)]
[SqlUserDefinedTypeAttribute(Format.UserDefined, IsByteOrdered = false, 
	MaxByteSize = -1, IsFixedLength = false)]
public sealed class SqlGeography : INullable, IBinarySerialize, 
	ISqlSpatialGridIndexable


Gena928

Vlad__i__mir,Инернет это большая свалка. Мало ли какой Г. код там есть.Иди от задачи и ошибки в стеке при ее достижении.Нужен ОРМ бери хибер или EF.Не нужен? Бери comand.runSql.


Gena928

Petro123,Взял хибер, вот не пойму достаточно ли просто прописать тип поля или ещё нужно прописать отдельно классы, как это делали Вы вот здесь?
[SqlMethodAttribute(IsDeterministic = true, IsPrecise = false)]
public static SqlGeography Point(
	****** latitude,
	****** longitude,
	int srid
)
Первый раз пытаюсь это сделать.


Gena928

Vlad__i__mir,Тему по хиберу заведи.