Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

  1. С 13.10.2020 снова работает авторизация/регистрация через социальные сети: VK (Вконтакте) и Facebook.
    Скрыть объявление

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

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

  1. trir

    Форумчанин Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.111
    Симпатии:
    881
    Адрес:
    gnomtrir@mail.ru
    Разграфка городских планшетов - может у кого есть?
     
    #1
  2. MucK

    Форумчанин

    Регистрация:
    11 июл 2012
    Сообщения:
    1.430
    Симпатии:
    2.281
    trir, где-то была. Вечером поищу.
     
    #2
    trir нравится это.
  3. gorbunoffs

    Регистрация:
    30 апр 2013
    Сообщения:
    16
    Симпатии:
    6
    Адрес:
    Город-Герой Севастополь
    Есть в Мапинфо, JPG.
     
    #3
  4. trir

    Форумчанин Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.111
    Симпатии:
    881
    Адрес:
    gnomtrir@mail.ru
    Мапинфо подойдет
     
    #4
  5. gorbunoffs

    Регистрация:
    30 апр 2013
    Сообщения:
    16
    Симпатии:
    6
    Адрес:
    Город-Герой Севастополь
    Пиши почту.
    --- Сообщения объединены, 17 июл 2018, Оригинальное время сообщения: 17 июл 2018 ---
    Отправил.
     
    #5
    trir нравится это.
  6. i66

    i66

    Регистрация:
    13 мар 2013
    Сообщения:
    4
    Симпатии:
    0
    А на кировград есть разграфка листов !???
    gorbunoffs,
     
    #6
  7. gorbunoffs

    Регистрация:
    30 апр 2013
    Сообщения:
    16
    Симпатии:
    6
    Адрес:
    Город-Герой Севастополь
    На Кировград данных нет.
     
    #7
  8. jadgon

    Форумчанин

    Регистрация:
    8 апр 2012
    Сообщения:
    45
    Симпатии:
    9
    gorbunoffs, Можешь мне тоже скинуть, если на сложно?
     
    #8
  9. Mexican_Hat

    Форумчанин

    Регистрация:
    2 ноя 2009
    Сообщения:
    132
    Симпатии:
    33
    Адрес:
    Екатеринбург
    Пусть тут будет - может кому еще пригодится

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

    Форумчанин Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.111
    Симпатии:
    881
    Адрес:
    gnomtrir@mail.ru
    kml
     

    Вложения:

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

    Форумчанин Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.111
    Симпатии:
    881
    Адрес:
    gnomtrir@mail.ru
    Как я сделал разграфку
    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
     
    #11
    lsv1283 и stavr нравится это.
  12. trir

    Форумчанин Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.111
    Симпатии:
    881
    Адрес:
    gnomtrir@mail.ru
  13. Mexican_Hat

    Форумчанин

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

    Форумчанин Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.111
    Симпатии:
    881
    Адрес:
    gnomtrir@mail.ru
    можно, но связываться с VBA совсем нет желания

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

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

Поделиться этой страницей

  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление