22.11.2024
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Создание зон окружностей по списку точек с координатами
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, -- с номера строки строки
 
  • Страница 1 из 1
  • 1
Поиск:

LogOff © 2024
Сайт создан в системе uCoz Рейтинг GPS Клуба. GPS навигаторы. GPS мониториг. GPS трекеры. ГЛОНАСС