1. ВНИМАНИЕ! В течении пары дней +- будет переезд форума на более защищённый сервер. Возможны периодические перебои в работе.

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

Discussion in 'Исходные данные' started by trir, Jul 17, 2018.

  1. trir

    trir Форумчанин

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

    MucK Форумчанин

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

    trir Форумчанин

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

    i66

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

    jadgon Форумчанин

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

    Mexican_Hat Форумчанин

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

     
  10. trir

    trir Форумчанин

    kml
     

    Attached Files:

    • doc.zip
      File size:
      438.4 KB
      Views:
      79
    stavr and kheylan66 like this.
  11. trir

    trir Форумчанин

    Как я сделал разграфку
    1. Запустил SSMS
    2. Создал БД razgrafka
    3. Создал таблицу
    Code:
    CREATE TABLE [dbo].[big_liist](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [geom] [geometry] NULL,
    [nomer] [int] NULL
    )
    4. Написал функцию для её заполнения
    Code:
    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, но для их хранения я тоже создал таблицу
    Code:
    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
    --- Сообщения объединены, Dec 14, 2018, Оригинальное время сообщения: Dec 14, 2018 ---
    9. Создал процедуру для заполнения таблицы big_liist на основе данных из st_values
    Code:
    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
    Code:
    CREATE TABLE [dbo].[small_list](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [geom] [geometry] NOT NULL,
    [nomer1] [nvarchar](max) NULL,
    [nomer2] [int] NULL
    )
    12. Создал функцию для её заполнения
    Code:
    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
    Code:
    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::
    --- Сообщения объединены, Dec 14, 2018 ---
    К сожелению MS SQL Server не умеет пересчитывать координаты, для этого нужен proj. Но к счастью есть его порт на C#. Правда там нет аффиных трансформаций, но написать его было плёвым делом. Для создания kml я использовал SharpKml
     
    lsv1283 and stavr like this.
  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. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice