Пиши почту. --- Сообщения объединены, 17 июл 2018, Оригинальное время сообщения: 17 июл 2018 --- Отправил.
Как я сделал разграфку 1. Запустил SSMS 2. Создал БД razgrafka 3. Создал таблицу Код: CREATE TABLE [dbo].[big_liist]( [id] [int] IDENTITY(1,1) NOT NULL, [geom] [geometry] NULL, [nomer] [int] NULL ) 4. Написал функцию для её заполнения Код: CREATE FUNCTION [dbo].[getlist] ( @sp geometry, @nomer int, @count int ) RETURNS @getlist table (ngeom geometry, nnomer int) AS begin declare @x float = @sp.STX, @y float = @sp.STY; declare @index int = 0; DECLARE @BuildString NVARCHAR(MAX); WHILE @index < @count begin SET @BuildString = 'Polygon((' + format(@x, N'#0.#') + ' ' + format(@y, N'#0.#') + ', ' + format(@x + 2000, N'#0.#') + ' ' + format(@y, N'#0.#') + ', ' + format(@x + 2000, N'#0.#') + ' ' + format(@y - 2000, N'#0.#') + ', ' + format(@x, N'#0.#') + ' ' + format(@y - 2000, N'#0.#') + ', ' + format(@x, N'#0.#') + ' ' + format(@y, N'#0.#') +'))'; insert @getlist (ngeom, nnomer) values (geometry::STGeomFromText(@BuildString, 0), @nomer) set @x = @x + 2000; set @nomer = @nomer + 1; SET @index = @index + 1; END; RETURN END; тут в аргументы я передаю левую верхную точку и номер листа, а также количество листов в ряду 5. Исходные данные я собирался взять из dwg, но для их хранения я тоже создал таблицу Код: CREATE TABLE [dbo].[st_values]( [id] [int] IDENTITY(1,1) NOT NULL, [geom] [geometry] NULL, [nomer] [int] NULL, [lcount] [int] NULL ) тут geom - это точка первого листа в ряду, его номер - nomer и количество листов в ряду - lcount 6. Потом я открыл Excel и забил туда исходные данные в виде таблицы 44000 56000 143 4 38000 54000 171 7 28000 52000 197 12 28000 50000 228 12 28000 48000 259 12 28000 46000 290 12 26000 44000 320 13 26000 42000 351 13 28000 40000 383 12 28000 38000 414 13 28000 36000 445 15 28000 34000 476 15 28000 32000 507 15 28000 30000 538 15 28000 28000 569 14 28000 26000 600 14 28000 24000 631 14 28000 22000 662 14 7. Формулой создал запрос ="insert into [st_values] ([geom],[nomer],lcount) values (geometry::STGeomFromText('"&"point("&A1&" " &B1&")"&"', 0), "&C1&", "&D1&");" 8. Скопировал и выполнил его в SSMS --- Сообщения объединены, 14 дек 2018, Оригинальное время сообщения: 14 дек 2018 --- 9. Создал процедуру для заполнения таблицы big_liist на основе данных из st_values Код: CREATE PROCEDURE [dbo].[fill_big_list] AS BEGIN DECLARE @geom geometry; DECLARE @nomer INT, @lcount int; /*Объявляем курсор*/ DECLARE @CURSOR CURSOR /*Заполняем курсор*/ SET @CURSOR = CURSOR SCROLL FOR SELECT [geom],[nomer], lcount FROM [razgrafka].[dbo].[st_values] /*Открываем курсор*/ OPEN @CURSOR /*Выбираем первую строку*/ FETCH NEXT FROM @CURSOR INTO @geom, @nomer, @lcount /*Выполняем в цикле перебор строк*/ WHILE @@FETCH_STATUS = 0 BEGIN insert into [razgrafka].[dbo].[big_liist] ([geom], [nomer]) SELECT ngeom, nnomer FROM [dbo].[getlist] (@geom, @nomer, @lcount); FETCH NEXT FROM @CURSOR INTO @geom, @nomer, @lcount END CLOSE @CURSOR END 10. Выполнив функцию fill_big_list я получил все листы 2000 11. Теперь я созал таблицу для 500 Код: CREATE TABLE [dbo].[small_list]( [id] [int] IDENTITY(1,1) NOT NULL, [geom] [geometry] NOT NULL, [nomer1] [nvarchar](max) NULL, [nomer2] [int] NULL ) 12. Создал функцию для её заполнения Код: CREATE FUNCTION [dbo].[getsublist] ( -- Add the parameters for the function here @geom geometry, @nomer int ) returns @getsublist table (ngeom geometry, nnomer nvarchar(max)) AS begin declare @p1 geometry = @geom.STPointN(1); declare @x float = @p1.STX, @y float = @p1.STY, @sx float = @p1.STX; DECLARE @BuildString NVARCHAR(MAX), @sstr NVARCHAR(MAX); DECLARE @cnt INT = 1, @cnt2 INT = 1, @ii int = 0; WHILE @cnt2 < 5 begin if @cnt2 = 1 set @sstr = '-А-'; if @cnt2 = 2 begin set @sstr = '-Б-'; set @x = @p1.STX + 1000; set @y = @p1.STY; end; if @cnt2 = 3 begin set @sstr = '-В-'; set @x = @p1.STX; set @y = @p1.STY - 1000; end; if @cnt2 = 4 begin set @sstr = '-Г-'; set @x = @p1.STX + 1000; set @y = @p1.STY - 1000; end; set @cnt = 1; set @ii = 0; set @sx = @x; WHILE @cnt < 17 BEGIN SET @BuildString = 'Polygon((' + format(@x, N'#.#') + ' ' + format(@y, N'#.#') + ', ' + format(@x + 250, N'#.#') + ' ' + format(@y, N'#.#') + ', ' + format(@x + 250, N'#.#') + ' ' + format(@y - 250, N'#.#') + ', ' + format(@x, N'#.#') + ' ' + format(@y - 250, N'#.#') + ', ' + format(@x, N'#.#') + ' ' + format(@y, N'#.#') +'))'; insert @getsublist (ngeom, nnomer) values (geometry::STGeomFromText(@BuildString, 0), concat(@nomer,@sstr, @cnt)) set @ii = @ii + 1; SET @cnt = @cnt + 1; if @ii < 4 set @x = @x + 250; else begin set @ii = 0; set @x = @sx; set @y = @y - 250; end; END; SET @cnt2 = @cnt2 + 1; END; RETURN end тут в качестве аргументов я беру геометрию и номер листа-2000 13. Создал процедуру для заполнения таблицы small_list Код: CREATE PROCEDURE [dbo].[fill_small_list] AS BEGIN DECLARE @geom geometry; DECLARE @nomer INT; /*Объявляем курсор*/ DECLARE @CURSOR CURSOR /*Заполняем курсор*/ SET @CURSOR = CURSOR SCROLL FOR SELECT [geom],[nomer] FROM [razgrafka].[dbo].[big_liist] /*Открываем курсор*/ OPEN @CURSOR /*Выбираем первую строку*/ FETCH NEXT FROM @CURSOR INTO @geom, @nomer /*Выполняем в цикле перебор строк*/ WHILE @@FETCH_STATUS = 0 BEGIN insert into [razgrafka].[dbo].[small_list] ([geom], [nomer1]) SELECT ngeom, nnomer FROM [dbo].[getsublist] (@geom, @nomer); FETCH NEXT FROM @CURSOR INTO @geom, @nomer END CLOSE @CURSOR END 14. Выполнив fill_small_list я получил таблицу листов-500, но без инвентарных номеров 15. Для заполнения инвентарных номеров я подключил таблицу small_list в Civil'е через FDO и там заполнил все инвентарные номера, это занело больше всего времени --- Сообщения объединены, 14 дек 2018 --- К сожелению MS SQL Server не умеет пересчитывать координаты, для этого нужен proj. Но к счастью есть его порт на C#. Правда там нет аффиных трансформаций, но написать его было плёвым делом. Для создания kml я использовал SharpKml
Как-то проще, из Экселя, например, конвертор на VB в kml можно сообразить? Причем сделать его не только под разграфку? имхо, задача мелкая, чтобы SQLserver под это подключать лишним шагом... ... Сказал и сам понял, что есть же GlobalMapper.. Но все равно, респект!
можно, но связываться с VBA совсем нет желания для меня работа с ГИС-данными через SQL - самый удобный и простой способ, MS SQL Server не единственный вариант, но под Windows - самый удобный 1. Он совершенно бесплатный (Express версия, но её хватает за глаза) установка занимает 15 минут 2. Ещё понадобится SSMS, на самом деле при наличии SSMS - сервер не очень нужен, можно работать с локальной базой