27.04.2017
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум (скрипты, вопросы...) » CyberFleet » Скрипты для CyberFleet, CrossPoint » Скрипт загрузки зон из KML
Скрипт загрузки зон из KML
logoffДата: Вторник, 18.06.2013, 09:58 | Сообщение # 1
Тамбов
Группа: Администраторы
Сообщений: 645
Репутация: 17
Статус: Offline

Код
set nocount on
DECLARE @hdoc int
DECLARE @x xml;
declare @str nvarchar(max), @str1 nvarchar(max), @zoneind int
SET @x = (SELECT * FROM OPENrowset(
BULK 'd:\1\1.kml',
SINGLE_BLOB) AS x);

--select @x

set @x=cast (replace (cast(@x as nvarchar(max)),'xmlns="http://www.opengis.net/kml/2.2"','') as xml)
set @zoneind=0
declare cur cursor for

select cast(@x.query ('/kml/Document/Folder/Placemark/Polygon/outerBoundaryIs/LinearRing/coordinates') as nvarchar(max))
create table #t (zonename varchar(30),ind int, lat float,long float)
declare @zonename varchar(30), @ind int, @lat float, @lon float
declare @i int, @razd int

open cur
while 1=1 begin
    fetch next from cur into @str
    if @@FETCH_STATUS!=0 break
    --print @str

    while len(@str)>0 begin
       select @razd=CHARINDEX (char(10),@str)
       if @razd>0
          select @str1=ltrim(rtrim(left(@str,CHARINDEX (char(10),@str)-1)))
       else  
          select @str1=@str

       --select  @str1
       if charindex('coordinates',@str1)>0 begin
       select @ind=0,@zoneind=@zoneind+1
       --select @zoneind
       end
       else begin
          -- это координаты
          --select @str1, 'ап'

          select @lon = left(@str1,(CHARINDEX (',',@str1)-1))
          select @str1= SUBSTRING (@str1,CHARINDEX (',',@str1)+1,len(@str1))
          --select @str1, 'ап'
          select @lat = left(@str1,(CHARINDEX (',',@str1)-1))
          select @ind=@ind+1
          insert into #t
          values ('Зона '+cast(@zoneind as varchar(3)),@ind,@lat,@lon)
          end

       if @razd>0   
          select @str=SUBSTRING (@str,CHARINDEX (char(10),@str)+1,len(@str))
       else select @str=''
    end  

end
close cur

deallocate cur

create table #str (num int IDENTITY(1,1) NOT NULL,string varchar(1000) not null)
insert into #str (string)
values ('set nocount on use bn ')

insert into #str (string)
select 'insert into FLEET_Zone ([Name],[Type],[Width],color,[GlobalType],zoneactive,[Integrated],[Comment],[IsTemporary],adddate,[ZoneIsDynamic],[ZoneMaxSpeed]) '+
'values ('''+zonename +''',1,2,0,1,1,0,''автосозданная зона'',0,getdate(),0,0)' from #t
group by zonename

insert into #str (string)
values ('--')

insert into #str (string)
select 'insert into [dbo].[FLEET_ZoneDescript] ([ZoneID],[Long],[Lat],[OrderBy]) '+
--''
'select [ZoneID]'+','+ltrim(str(long,12,8))+','+ltrim(str(lat,12,8))+','+cast(ind as varchar(3))+' from [dbo].[FLEET_Zone] where [Name]='''+zonename+''' and [ZoneActive]=1 '
from #t

drop table #t

select string from #str order by num
drop table #str


Зоны должны быть описаны как замкнутые полигоны. Пример KML, который загружался находится в приложении

Скрипт будет, видимо, работать только на SQL Standart или выше (так как используется nvarchar(max))

на выходе скрипта - строки скрипта для добавления зон - скрипт не оптимизирован по скорости, потому при большом количество добавляемых строк работает крайне не быстро - например у меня добавлял строки в течении 07:30

Зоны именуются как Зона 1, Зона 2 и так далее - пред запуском скрипта добавления убедиться, что подобных зон нет в активных (могут быть удалены)
Прикрепления: 2857982.kml(68Kb)
 
Форум (скрипты, вопросы...) » CyberFleet » Скрипты для CyberFleet, CrossPoint » Скрипт загрузки зон из KML
Страница 1 из 11
Поиск:

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