Разграфка листов г. Екатеринбург

Тема в разделе "Исходные данные", создана пользователем trir, 17 июл 2018.

  1. trir

    trir Форумчанин

    Разграфка городских планшетов - может у кого есть?
     
  2. MucK

    MucK Форумчанин

    trir, где-то была. Вечером поищу.
     
    trir нравится это.
  3. Есть в Мапинфо, JPG.
     
  4. trir

    trir Форумчанин

    Мапинфо подойдет
     
  5. Пиши почту.
    --- Сообщения объединены, 17 июл 2018, Оригинальное время сообщения: 17 июл 2018 ---
    Отправил.
     
    trir нравится это.
  6. i66

    i66

    А на кировград есть разграфка листов !???
    gorbunoffs,
     
  7. На Кировград данных нет.
     
  8. jadgon

    jadgon Форумчанин

    gorbunoffs, Можешь мне тоже скинуть, если на сложно?
     
  9. Mexican_Hat

    Mexican_Hat Форумчанин

    Пусть тут будет - может кому еще пригодится

     
    vsv, Sephirot, UnknownUser и ещё 1-му нравится это.
  10. trir

    trir Форумчанин

    kml
     

    Вложения:

    • doc.zip
      Размер файла:
      438,4 КБ
      Просмотров:
      69
    stavr и kheylan66 нравится это.
  11. trir

    trir Форумчанин

    Как я сделал разграфку
    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 и там заполнил все инвентарные номера, это занело больше всего времени ::biggrin24.gif::
    --- Сообщения объединены, 14 дек 2018 ---
    К сожелению MS SQL Server не умеет пересчитывать координаты, для этого нужен proj. Но к счастью есть его порт на C#. Правда там нет аффиных трансформаций, но написать его было плёвым делом. Для создания kml я использовал SharpKml
     
    lsv1283 и stavr нравится это.
  12. trir

    trir Форумчанин

  13. Mexican_Hat

    Mexican_Hat Форумчанин

    Как-то проще, из Экселя, например, конвертор на VB в kml можно сообразить? Причем сделать его не только под разграфку?
    имхо, задача мелкая, чтобы SQLserver под это подключать лишним шагом...
    ...
    Сказал и сам понял, что есть же GlobalMapper..
    Но все равно, респект!
     
  14. trir

    trir Форумчанин

    можно, но связываться с VBA совсем нет желания

    для меня работа с ГИС-данными через SQL - самый удобный и простой способ, MS SQL Server не единственный вариант, но под Windows - самый удобный

    1. Он совершенно бесплатный (Express версия, но её хватает за глаза)
    установка занимает 15 минут
    2. Ещё понадобится SSMS, на самом деле при наличии SSMS - сервер не очень нужен, можно работать с локальной базой
     
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление