21.11.2024
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Экспорт зон в kml для Google Earth
logoffДата: Пятница, 23.09.2011, 12:30 | Сообщение # 1
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
Для среды: MSDE или выше
проверен на SQL Standart - точно работает, но вроде должен и на более младших версиях.

Code


use BN
go   
SET DATEFORMAT dmy   
go    

declare @filename as varchar(3000)   
-- тут имя файла!!!   
set @filename='d:\1\zone_cf.kml' -- путь и имя выходного файла - путь должен быть доступен для сервера SQL   

declare @file_description as varchar(3000)   

set @file_description='    <name>Выгрузка зон</name>   
      <description><![CDATA[   
       <img src="http://www.m2m-t.ru/images/iNewsGirl.jpg"   
        width="300"/>   
       <br /><table>   
       <tr><td><a href="http://www.m2m-t.ru/rdc/?map_id=86#anchor_map">Компания:М2М Телематика Тамбов</a></td></tr>   
       </table>   
       <br/>   
]]></description>   
    <open>1</open>   
    <Snippet maxLines="2">Зоны'+N'</Snippet>   
'   

DECLARE @Text1 Nvarchar(4000),   
@FS int,    
@OLEResult int,    
@FileID int,    
@hr int,   
@source varchar(30),    
@desc varchar (200)   

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT   

IF @OLEResult <> 0    
BEGIN   
PRINT 'Scripting.FileSystemObject'   
GOTO Error_Handler   
END   

execute @OLEResult = sp_OAMethod @FS,'CreateTextFile',@FileID OUTPUT, @filename,1,true   
IF @OLEResult <> 0    
BEGIN   
PRINT 'CreateTextFile'   
GOTO Error_Handler   
END   
-- тег <Style> </Style> задает внешний вид точек и путей - используется для placemark   
set @Text1 = N'<?xml version="1.0" encoding="UTF-8"?>   
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2"    
xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">   
<Document>'+@file_description+'   
    <Style id="lineStyle">   
     <LineStyle>   
      <color>99ffac59</color>   
      <width>6</width>   
     </LineStyle>   
    </Style>   
    <StyleMap id="msn_track-none">   
     <Pair>   
      <key>normal</key>   
      <styleUrl>#sn_track-none0</styleUrl>   
     </Pair>   
     <Pair>   
      <key>highlight</key>   
      <styleUrl>#sh_track-none</styleUrl>   
     </Pair>   
    </StyleMap>   

    <Style id="sh_caution">   
     <IconStyle>   
      <scale>0.816667</scale>   
      <Icon>   
       <href>http://maps.google.com/mapfiles/kml/shapes/caution.png</href>   
      </Icon>   
      <hotSpot x="0.5" y="0" xunits="fraction" yunits="fraction"/>   
     </IconStyle>   
     <ListStyle>   
     </ListStyle>   
    </Style>   
    <StyleMap id="msn_caution">   
     <Pair>   
      <key>normal</key>   
      <styleUrl>#sn_caution</styleUrl>   
     </Pair>   
     <Pair>   
      <key>highlight</key>   
      <styleUrl>#sh_caution</styleUrl>   
     </Pair>   
    </StyleMap>   
    <Style id="sn_caution">   
     <IconStyle>   
      <scale>0.7</scale>   
      <Icon>   
       <href>http://maps.google.com/mapfiles/kml/shapes/caution.png</href>   
      </Icon>   
      <hotSpot x="0.5" y="0" xunits="fraction" yunits="fraction"/>   
     </IconStyle>   
     <ListStyle>   
     </ListStyle>'   
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
IF @OLEResult <> 0    
BEGIN   
PRINT 'WriteLine'   
GOTO Error_Handler   
END   

set @Text1 = N'    </Style>    <Style id="sn_blu-blank">   
     <IconStyle>   
      <scale>1.1</scale>   
      <Icon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/blu-blank.png</href>   
      </Icon>   
      <hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/>   
     </IconStyle>   
     <ListStyle>   
      <ItemIcon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/blu-blank-lv.png</href>   
      </ItemIcon>   
     </ListStyle>   
    </Style>   
    <Style id="sh_blu-blank">   
     <IconStyle>   
      <scale>1.3</scale>   
      <Icon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/blu-blank.png</href>   
      </Icon>   
      <hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/>   
     </IconStyle>   
     <ListStyle>   
      <ItemIcon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/blu-blank-lv.png</href>   
      </ItemIcon>   
     </ListStyle>   
    </Style>   
    <StyleMap id="msn_blu-blank">   
     <Pair>   
      <key>normal</key>   
      <styleUrl>#sn_blu-blank</styleUrl>   
     </Pair>   
     <Pair>   
      <key>highlight</key>   
      <styleUrl>#sh_blu-blank</styleUrl>   
     </Pair>   
    </StyleMap>   
    <StyleMap id="msn_ltblu-stars">   
     <Pair>   
      <key>normal</key>   
      <styleUrl>#sn_ltblu-stars</styleUrl>   
     </Pair>   
     <Pair>   
      <key>highlight</key>   
      <styleUrl>#sh_ltblu-stars</styleUrl>   
     </Pair>   
    </StyleMap>   
    <Style id="sn_ltblu-stars">   
     <IconStyle>   
      <scale>1.1</scale>   
      <Icon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/ltblu-stars.png</href>   
      </Icon>   
      <hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/>   
     </IconStyle>   
     <ListStyle>   
      <ItemIcon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/ltblu-stars-lv.png</href>   
      </ItemIcon>   
     </ListStyle>   
    </Style>   
    <Style id="sh_ltblu-stars">   
     <IconStyle>   
      <scale>1.3</scale>   
      <Icon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/ltblu-stars.png</href>   
      </Icon>   
      <hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/>   
     </IconStyle>   
     <ListStyle>   
      <ItemIcon>   
       <href>http://maps.google.com/mapfiles/kml/paddle/ltblu-stars-lv.png</href>   
      </ItemIcon>   
     </ListStyle>   
    </Style>'   

execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
IF @OLEResult <> 0    
BEGIN   
PRINT 'WriteLine'   
GOTO Error_Handler   
END   
print 'выборка зон'   
-- экспортируем данные о зонах   
declare cur_zone cursor local for    
    select z.zoneid, z.name,z.type,z.Width from dbo.FLEET_Zone as Z    
    --inner join  #temp_zone as temp on temp.zonename=z.name -- сцепить с врем табл загруженных зон   
    -- сцепка сработает как фильтр - будут только зоны, названия которых были в файле   
    where z.zoneactive=1  -- только не удаленные зоны   
    --and z.type=3 -- только окружности   
    order by z.name   

    open cur_zone   

-- откроем папку с зонами   
set @Text1 = N'    <Folder>   
    <name>Точки</name>   
     <visibility>1</visibility>   
     <description><![CDATA[<table>   
      <tr><td>Зоны для посещения</td></tr>   
      <tr><td>Компания: М2М Телематика Тамбов</td></tr>   
       </table>]]></description><open>0</open>'   
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
IF @OLEResult <> 0    
BEGIN   
PRINT 'WriteLine'   
GOTO Error_Handler   
END   

declare @zone_id int -- данные о ид зоны из курсора   
declare @zone_name Nvarchar(256) -- данные о имени зоны из курсора   
declare @ztype int   
-- данные о центральной (первой точке) зоны - это центр окружности   
declare @zone_long float    
declare @zone_lat float   
declare @zone_img Nvarchar (500)   

declare @M_PI float    
set @M_PI= PI();   
declare @lat_center float;   
declare @lon_center float;   
declare @d_rad float;   
declare @radius float   
declare @i float   

declare @radial float;   
declare @lat_rad float;   
declare @lon_rad_tmp float;   
declare @lon_rad float;   

declare @a numeric(15,8)   
declare @b numeric(15,8)   

fetch next from cur_zone into @zone_id,@zone_name,@ztype,@radius   
while @@fetch_status=0    
begin   
     --print @zone_name   
    if @ztype=1 begin -- точка   
     select top 1 @zone_long=Long,@zone_lat=Lat from dbo.FLEET_ZoneDescript   
     where ZoneID=@zone_id   
     order by OrderBy desc;   
       
     
       
     --print '---'+@zone_name+' ; '+isnull(@zone_img,'')   
     set @Text1 = N'   <Placemark>   
        <name>'+@zone_name+N'</name>   
        <description><![CDATA['+isnull(@zone_img,N'')+N'<table>   
         <tr><td>'+@zone_name+N'</td></tr>   
          </table>]]></description>   
         <visibility>0</visibility>   
        <Snippet maxLines="2">'+@zone_name+N'</Snippet>   
        <styleUrl>#m_ylw-pushpin</styleUrl>
        <Polygon>
     <tessellate>1</tessellate>
     <outerBoundaryIs>
      <LinearRing>
       <coordinates>'
       --+ltrim(rtrim(str(@zone_long,15,6)))+','+ltrim(rtrim(str(@zone_lat,13,6)))+N'</coordinates></Point></Placemark>';   
     --    print @text1   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   
     
       declare cur cursor local read_only for   
     select Long,Lat from dbo.FLEET_ZoneDescript   
     where ZoneID=@zone_id   
     order by OrderBy desc;   
        
     open cur   
     fetch next from cur into @zone_long, @zone_lat   
     while @@fetch_status=0 begin   
      set @Text1=ltrim(rtrim(str(@zone_long,15,6)))+','+ltrim(rtrim(str(@zone_lat,13,6)))+',0 '   
      execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
      IF @OLEResult <> 0    
      BEGIN   
      PRINT 'WriteLine'   
      GOTO Error_Handler   
      END   

      fetch next from cur into @zone_long, @zone_lat   
     end --while @@fetch_status=0    
        
     close cur   
     deallocate cur    
     
      set @Text1 = ltrim(rtrim(str(@zone_long,15,6)))+','+ltrim(rtrim(str(@zone_lat,13,6)))+N'0</coordinates>
      </LinearRing>
     </outerBoundaryIs>
    </Polygon>
   </Placemark> '
       --+ltrim(rtrim(str(@zone_long,15,6)))+','+ltrim(rtrim(str(@zone_lat,13,6)))+N'</coordinates></Point></Placemark>';   
     --    print @text1   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   
       
        
    end --if @ztype=1 begin   
       
    if @ztype=2 begin -- маршрут   
        
     set @Text1 = N'   <Placemark>   
        <name>'+@zone_name+N'</name>   
         <visibility>0</visibility>   
        <description><![CDATA['+isnull(@zone_img,N'')+N'<table>   
         <tr><td>'+@zone_name+N'</td></tr>   
          </table>]]></description>   
        <Snippet maxLines="2">'+@zone_name+N'</Snippet>   
        <styleUrl>#msn_ltblu-stars</styleUrl>   
        <LineString>   
      <tessellate>1</tessellate>   
      <coordinates>'   
     --    print @text1   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   
         
     declare cur cursor local read_only for   
     select Long,Lat from dbo.FLEET_ZoneDescript   
     where ZoneID=@zone_id   
     order by OrderBy desc;   
        
     open cur   
     fetch next from cur into @zone_long, @zone_lat   
     while @@fetch_status=0 begin   
      set @Text1=ltrim(rtrim(str(@zone_long,15,6)))+','+ltrim(rtrim(str(@zone_lat,13,6)))+',0 '   
      execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
      IF @OLEResult <> 0    
      BEGIN   
      PRINT 'WriteLine'   
      GOTO Error_Handler   
      END   

      fetch next from cur into @zone_long, @zone_lat   
     end --while @@fetch_status=0    
        
     close cur   
     deallocate cur   
       
     set @Text1 = N'   </coordinates>   
      </LineString>   
     </Placemark>'   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   
       
    end --if @ztype=2 begin   

    if @ztype=3 begin -- окружность   
     -- выборка данных о центре окружности.   
     select top 1 @zone_long=Long,@zone_lat=Lat from dbo.FLEET_ZoneDescript   
     where ZoneID=@zone_id   
     order by OrderBy desc;   
     --print '---'+@zone_name+' ; '+isnull(@zone_img,'')   
     set @Text1 = N'<Folder>   
     <name>'+@zone_name+N'</name>   
          <visibility>0</visibility>   
       <description><![CDATA['+isnull(@zone_img,N'')+N'<table>   
         <tr><td>'+@zone_name+N'</td></tr>   
          </table>]]></description>   
        <Snippet maxLines="2">'+@zone_name+N'</Snippet>'   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   

     set @Text1 = N'   <Placemark>   
        <name>Окружность</name>   
       <visibility>0</visibility>   
        <styleUrl>#msn_ltblu-stars</styleUrl>   
        <Polygon>   
       <tessellate>1</tessellate>   
       <outerBoundaryIs>   
        <LinearRing>   
         <coordinates>'   

     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   

           select @lat_center = (@zone_lat)*(@M_PI / 180),   
       @lon_center = (@zone_long)*(@M_PI / 180),   
       @d_rad = @radius / 6378137;   

        
     set @i=0   
     while @i <= 360 begin   
               set @radial = @i *(@M_PI / 180);   
               set @lat_rad = Asin(Sin(@lat_center) * Cos(@d_rad) + Cos(@lat_center) * Sin(@d_rad) * Cos(@radial));   
               set @lon_rad_tmp = ATN2(Sin(@radial) * Sin(@d_rad) * Cos(@lat_center), Cos(@d_rad) - Sin(@lat_center) * Sin(@lat_rad));   
               select @a=(@lon_center + @lon_rad_tmp + @M_PI),@b=(2.0000 * @M_PI)   
               --select @a, @b   
               set @lon_rad=@a-floor(@a/@b)*@b - @M_PI;   
               --set @lon_rad = (@a % @b) - @M_PI;   
                 
               set @Text1 =cast((@lon_rad)* (180 / @M_PI) as nvarchar(10)) + N',' + cast(@lat_rad* (180 / @M_PI) as nvarchar(10)) + N',0 ';   
         
      execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
      IF @OLEResult <> 0    
      BEGIN   
      PRINT 'WriteLine'   
      GOTO Error_Handler   
      END   
        
      set @i=@i+5   
     end -- while @i <= 360 begin   

           
     set @Text1 =N'    </coordinates>   
        </LinearRing>   
       </outerBoundaryIs>   
      </Polygon>   
</Placemark>';   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   
        
     -- поставить точку центра   
     set @Text1 = N'   <Placemark>   
        <name>'+@zone_name+N'</name>   
         <visibility>0</visibility>   
        <description><![CDATA['+isnull(@zone_img,N'')+N'<table>   
         <tr><td>'+@zone_name+N'</td></tr>   
          </table>]]></description>   
        <Snippet maxLines="2">'+@zone_name+N'</Snippet>   
        <styleUrl>#msn_ltblu-stars</styleUrl>   
        <Point>    <coordinates>'+str(@zone_long,15,8)+','+str(@zone_lat,13,8)+N'</coordinates></Point></Placemark>';   
     --    print @text1   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   
     ---- закрыть группу   
     set @Text1 = N'   </Folder>'   
     execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
     IF @OLEResult <> 0    
     BEGIN   
     PRINT 'WriteLine'   
     GOTO Error_Handler   
     END   
       
    end --if @ztype=3 begin   
       
       
       

    fetch next from cur_zone into @zone_id,@zone_name,@ztype,@radius   
end -- open cur_zone while @@fetch_status=0 begin   

set @Text1 = N'</Folder>   
</Document>   
</kml>' -- закрыли папку с зонами   
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1   
IF @OLEResult <> 0    
BEGIN   
PRINT 'WriteLine'   
GOTO Error_Handler   
END   

close cur_zone   
deallocate cur_zone   
print '******закончено'   
goto Done   

Error_Handler:    
PRINT '*** ERROR ***'   
EXEC @hr = sp_OAGetErrorInfo null, @source OUT, @desc OUT   
SELECT hr = CONVERT (binary(4), @hr), source = @source, description = @desc   

Done:   
PRINT 'Done'   
EXECUTE @OLEResult = sp_OADestroy @FileID   
EXECUTE @OLEResult = sp_OADestroy @FS   
--drop table #temp -- удаление временной таблицы   
--drop table #temp_zone   

где Use BN - имя базы данных флита
set @filename='c:\zone_cf.kml' -- имя файла создаваемого скриптом, должен быть доступен для записи для сервера SQL (если сервер не на той машине откуда запускается скрипт)

для того, что бы скрипт заработал нужно проверить как указано в статье
http://msdn.microsoft.com/ru-ru/library/ms191188.aspx

Code

EXEC sp_configure 'Ole Automation Procedures';
GO

а дать разрешение через код
Code

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
 
logoffДата: Среда, 18.04.2012, 12:20 | Сообщение # 2
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
обновлена версия скрипта в топе темы - теперь зоны типа полигон выгружаются как полигоны
 
  • Страница 1 из 1
  • 1
Поиск:

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