Особенности настройки OData-сервиса для ГИС-приложений
Перед использованием необходимо скачать проекты с github:
https://github.com/Flexberry/NewPlatform.Flexberry.ORM.GisPostgresDataService и https://github.com/Flexberry/NewPlatform.Flexberry.ORM.GisMSSQLDataService или загрузить сборки с nuget.org NewPlatform.Flexberry.ORM.GisPostgresDataService и NewPlatform.Flexberry.ORM.GisMSSQLDataService.
После успешной компиляции подключить созданные сборки к проекту. Требуется также версия ODataService не ниже 2.0.1-alpha01. Её можно загрузить с nuget.org NewPlatform.Flexberry.ORM.ODataService.
Необходимо изменить файл Web.config
, отредактировав соответствующую строку таким образом для MSSQL сервер:
<appSettings>
...
<add key="DataServiceType"
value="NewPlatform.Flexberry.ORM.GisMSSQLDataService, NewPlatform.Flexberry.ORM.GisMSSQLDataService" />
...
</appSettings>
или для PostgreSQL сервер:
<appSettings>
...
<add key="DataServiceType"
value="NewPlatform.Flexberry.ORM.GisPostgresDataService, NewPlatform.Flexberry.ORM.GisPostgresDataService" />
...
</appSettings>
Типы данных
MSSQL сервер
Поле в таблице для MSSQL сервера должна иметь тип Geography
PostgreSQL сервер
Поле в таблице для PostgreSQL сервера должна иметь тип Geography
.Net
Тип свойства в классе наследуемом от DataObject
должен быть Microsoft.Spatial.Geography
Использование
В запросе к ODataService
Фильтрация объектов данных в опции запроса $filter возможна с использованием пользовательской функции geo.intersects(geography1=geo1, geography2=geo2)
в OData, где “geo1” и “geo2” могут быть как полями объектов данных типа Edm.Geography, так и географически привязанными геометриями заданными в формате EWKT, например так: geo.intersects(geography1=boundingBox, geography2=geography'SRID=<Код используемой системы координат>;POLYGON(<Координаты полигона>)')
, где geography
- метод для преобразования строки с координатами в формате EWKT в тип Edm.Geography.
Пример запроса:
http://localhost/odata/КлассСМножествомТиповs?$filter=PropertyInt eq 5 and geo.intersects(geography1=PropertyGeography, geography2=geography'SRID=4326;POINT(3 3)')
.
В запросе к LINQProvider
Geography geo = "POINT(3 3)".CreateGeography();
ViewAttribute gisView = new ViewAttribute("gisView", new string[] {
"Name as \'Наименование\'",
"Description as \'Описание\'",
"KeyWords as \'Ключевые слова\'",
"Lat as \'Широта\'",
"Lng as \'Долгота\'",
"Zoom as \'Зум\'",
"Public as \'Общая\'",
"Scale as \'Масштаб\'",
"CoordinateReferenceSystem as \'Система координат\'",
"BoundingBox as \'Граница\'"});
list = ds.Query<Map>(new View(gisView, typeof(Map))).Where(d => d.BoundingBox.GeoIntersects(geo)).ToList();
В запросе с использованием LCS
var ldef = ExternalLangDef.LanguageDef;
var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof (Map), new View(gisView, typeof (Map)));
lcs.LimitFunction =
ldef.GetFunction(ldef.funcGeoIntersects, new VariableDef(ldef.GeographyType, "BoundingBox"), geo);
list = ds.LoadObjects(lcs);