Создание зон окружностей по списку точек с координатами
|
|
logoff | Дата: Понедельник, 06.07.2015, 13:17 | Сообщение # 1 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Скрипт для CrossPoint Скрипт создает из списка (файла csv) зоны с заданным названием, радиусом, и центром.
Необходимые входные данные: 1) Название зоны; 2) Радиус окружности; 3) Цвет зоны; 4) Centerpoint это необходимые данные широты и долготы центра окружности, значение обязательно указывать не через запятую, а через точку в виде "55.45632"
Код use BN go SET XACT_ABORT ON; BEGIN TRAN T1 if object_id('tempdb..#zonesfromfile') is not null drop table #zonesfromfile create table #zonesfromfile ( [Name]varchar (256) , [Width]float , [Color]int , [centerPointLat]float , [centerPointLong]float ) /* Необходимые входные данные: 1) Название зоны; 2) Радиус окружности; 3) Цвет зоны; 4) Centerpoint это необходимые данные широты и долготы центра окружности, значение обязательно указывать не через запятую, а через точку в виде "55.45632" */ BULK INSERT #zonesfromfile -- вставка из файла во временную таблицу FROM 'c:\Zona.csv' -- из файла с указанным именем и путем WITH ( FIELDTERMINATOR=';', -- разделитель полей - exel именно с ним выгружает FIRSTROW = 1, -- с номера строки строки ROWTERMINATOR = '\n', -- разделитель строк enter codepage = 'acp'
) -- Теперь нам необходимо произвести Insert-ы в две базы данных, используя наш набор информации, полученный из CSV declare @Name varchar(256) ,@Width float ,@Color int ,@centerPointLat float ,@centerPointLong float ,@zonenum int ,@newzonenum int ,@typeZoneCircle int --параметр, поределяющий тип зоны set @typeZoneCircle=3
declare cur cursor local for select * from #zonesfromfile open cur while 1=1 begin fetch next from cur into @Name,@width,@Color,@centerPointLat,@centerPointLong if @@FETCH_STATUS!=0 break set @zonenum=(select MAX(ZoneId) from dbo.FLEET_Zone) set @newzonenum=@zonenum+1 -- вставляем в первую таблицу часть данных
set IDENTITY_INSERT dbo.FLEET_Zone ON insert into dbo.FLEET_Zone ( [ZoneID], [Name], [Type], [Width], [Color], [GlobalType], [ObjectID], [GroupID], [ZoneActive], [Integrated], [Comment], [IsTemporary], [DeleteDate], [AddDate], [ZoneIsDynamic], [TiedObjectID], [ZoneMaxSpeed], [RectLTLong], [RectLTLat], [RectRBLong], [RectRBLat], [Surface], [IsHidden]) values (@newzonenum,@Name,@typeZoneCircle,@Width,@Color,1,NULL,NULL,1,0,'autoinserted',0,NULL,GETDATE (),0,NULL,0,0,0,0,0,0,0) set IDENTITY_INSERT dbo.FLEET_Zone OFF
-- На этом этапе необходимо обратится к тригонометрии и высчитать вторую точку каждой зоны, зная радиус окружности
declare @SecondPointLat float, @SecondPointLong float
set @SecondPointLong=@centerPointLong set @SecondPointLat=@centerPointLat-@Width/(pi()*6378136.0/180.0)
--Получив координаты второй точки с учётом приращения, запишем обе точки в таблицу описания зоны
declare @DescriptID int, @FirstPointDescriptid int,@SecondPointDescriptid int set @DescriptID =(select MAX (ZoneDescriptID) from dbo.FLEET_ZoneDescript) set @FirstPointDescriptid=@DescriptID+1 set @SecondPointDescriptid=@FirstPointDescriptid+1
SET IDENTITY_INSERT dbo.FLEET_ZoneDescript ON
insert into dbo.FLEET_ZoneDescript ( [ZoneDescriptID], [ZoneID], [Long], [Lat], [OrderBy]) values (@FirstPointDescriptid,@newzonenum,@centerPointLong,@centerPointLat,1) insert into dbo.FLEET_ZoneDescript (
[ZoneDescriptID], [ZoneID], [Long], [Lat], [OrderBy]) values (@SecondPointDescriptid,@newzonenum,@SecondPointLong,@SecondPointLat,2) SET IDENTITY_INSERT dbo.FLEET_ZoneDescript OFF
-- возвращаемся к первой таблице, чтобы её дополнить --Пересчитаем обрамляющий прямоугольник Declare @ZoneID int ,@RectLTLong float ,@RectLTLat float ,@RectRBLong float ,@RectRBLat float set @ZoneID=@newzonenum Exec FLEET_ZoneBoundingBoxUpdate @ZoneID ,@RectLTLong output ,@RectRBLong output ,@RectLTLat output ,@RectRBLat output
Update FLEET_Zone Set RectLTLong = @RectLTLong ,RectRBLong = @RectRBLong ,RectLTLat = @RectLTLat ,RectRBLat = @RectRBLat where ZoneID = @ZoneID -- Пересчитаем площадь, поскольку изменился состав зоны UPDATE FLEET_Zone SET Surface = dbo.FLEET_CalcZoneSurface(Z.ZoneID) FROM FLEET_Zone Z where ZoneID=@newzonenum end close cur deallocate cur drop table #zonesfromfile
commit tran t1
Пример файла csv
Цитата тестовая зона;35;8288736;55.767304;37.601738 тестовая зона2;350;32768;55.788928;37.683105 тестовая зона3;3500;0;55.802245;37.568436
PS: Спасибо Дмитрию Верведе за предоставление кода.
|
|
| |
logoff | Дата: Вторник, 26.01.2016, 15:49 | Сообщение # 2 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Скрипт для CyberFleet
Код use BN go SET XACT_ABORT ON; BEGIN TRAN T1 if object_id('tempdb..#zonesfromfile') is not null drop table #zonesfromfile create table #zonesfromfile ( [Name]varchar (256) , [Width]float , [Color]int , [centerPointLat]float , [centerPointLong]float ) /* Необходимые входные данные: 1) Название зоны; 2) Радиус окружности; 3) Цвет зоны; 4) Centerpoint это необходимые данные широты и долготы центра окружности, значение обязательно указывать не через запятую, а через точку в виде "55.45632" */ BULK INSERT #zonesfromfile -- вставка из файла во временную таблицу FROM 'd:\script\тест2.csv' -- из файла с указанным именем и путем WITH ( FIELDTERMINATOR=';', -- разделитель полей - exel именно с ним выгружает FIRSTROW = 2, -- с номера строки строки ROWTERMINATOR = '\n', -- разделитель строк enter codepage = 'acp'
) -- Теперь нам необходимо произвести Insert-ы в две базы данных, используя наш набор информации, полученный из CSV declare @Name varchar(256) ,@Width float ,@Color int ,@centerPointLat float ,@centerPointLong float ,@zonenum int ,@newzonenum int ,@typeZoneCircle int --параметр, поределяющий тип зоны ,@zonegroupid int -- номер зоны select @typeZoneCircle=3 ,@zonegroupid = 149 -- ID Группы для привязки группы
declare cur cursor local for select * from #zonesfromfile open cur while 1=1 begin fetch next from cur into @Name,@width,@Color,@centerPointLat,@centerPointLong if @@FETCH_STATUS!=0 break set @zonenum=(select MAX(ZoneId) from dbo.FLEET_Zone) set @newzonenum=@zonenum+1 -- вставляем в первую таблицу часть данных
set IDENTITY_INSERT dbo.FLEET_Zone ON insert into dbo.FLEET_Zone ( [ZoneID], [Name], [Type], [Width], [Color], [GlobalType], [ObjectID], [GroupID], [ZoneActive], [Integrated], [Comment], [IsTemporary], [DeleteDate], [AddDate], [ZoneIsDynamic], [TiedObjectID], [ZoneMaxSpeed], [RectLTLong], [RectLTLat], [RectRBLong], [RectRBLat], [Surface]) values (@newzonenum,@Name,@typeZoneCircle,@Width,@Color,1,NULL,@zonegroupid ,1,0,'autoinserted',0,NULL,GETDATE (),0,NULL,0,0,0,0,0,0) set IDENTITY_INSERT dbo.FLEET_Zone OFF
-- На этом этапе необходимо обратится к тригонометрии и высчитать вторую точку каждой зоны, зная радиус окружности
declare @SecondPointLat float, @SecondPointLong float
set @SecondPointLong=@centerPointLong set @SecondPointLat=@centerPointLat-@Width/(pi()*6378136.0/180.0)
--Получив координаты второй точки с учётом приращения, запишем обе точки в таблицу описания зоны
declare @DescriptID int, @FirstPointDescriptid int,@SecondPointDescriptid int set @DescriptID =(select MAX (ZoneDescriptID) from dbo.FLEET_ZoneDescript) set @FirstPointDescriptid=@DescriptID+1 set @SecondPointDescriptid=@FirstPointDescriptid+1
SET IDENTITY_INSERT dbo.FLEET_ZoneDescript ON
insert into dbo.FLEET_ZoneDescript ( [ZoneDescriptID], [ZoneID], [Long], [Lat], [OrderBy]) values (@FirstPointDescriptid,@newzonenum,@centerPointLong,@centerPointLat,1) insert into dbo.FLEET_ZoneDescript (
[ZoneDescriptID], [ZoneID], [Long], [Lat], [OrderBy]) values (@SecondPointDescriptid,@newzonenum,@SecondPointLong,@SecondPointLat,2) SET IDENTITY_INSERT dbo.FLEET_ZoneDescript OFF
-- возвращаемся к первой таблице, чтобы её дополнить --Пересчитаем обрамляющий прямоугольник Declare @ZoneID int ,@RectLTLong float ,@RectLTLat float ,@RectRBLong float ,@RectRBLat float set @ZoneID=@newzonenum Exec FLEET_ZoneBoundingBoxUpdate @ZoneID ,@RectLTLong output ,@RectRBLong output ,@RectLTLat output ,@RectRBLat output
Update FLEET_Zone Set RectLTLong = @RectLTLong ,RectRBLong = @RectRBLong ,RectLTLat = @RectLTLat ,RectRBLat = @RectRBLat where ZoneID = @ZoneID -- Пересчитаем площадь, поскольку изменился состав зоны UPDATE FLEET_Zone SET Surface = dbo.FLEET_CalcZoneSurface(Z.ZoneID) FROM FLEET_Zone Z where ZoneID=@newzonenum end close cur deallocate cur drop table #zonesfromfile
commit tran t1
код проверен на 1.17.2.11, исправлен, добавлено указание ID Группы для отношения зон именно к ней ,@zonegroupid = 149 -- ID Группы для привязки группы
Загрузка файла со второй строки (первый заголовок) FIRSTROW = 2, -- с номера строки строки
|
|
| |