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

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

Войти

Результат пересечения всех объектов одного слоя со всеми объектами другого слоя

Тема в разделе "MapInfo", создана пользователем Megalit, 19 июн 2016.

  1. Megalit

    Регистрация:
    19 июн 2016
    Сообщения:
    1
    Симпатии:
    0
    Подскажите, пожалуйста, как с помощью MapBasic получить результат (новые объекты) пересечения всех полигональных объектов одного слоя со всеми полигональными объектами другого.
     
    #1
  2. thegeo

    Форумчанин

    Регистрация:
    19 фев 2012
    Сообщения:
    83
    Симпатии:
    15
    Вообще-то несложно написать код подобной процедуры, но попробуйте это сделать сами.
    Элементарная операция:
    На слое А выделите объект. Выполните Объекты/Выбрать изменяемый объект. Теперь выделите пересекающий его объект на слое Б. Выполните Объекты/Удалить внешнюю часть.
    Протокол выполнения этой операции найдете в окне MapBasic. Осталось только подумать как организовать цикл по объектам слоя А с использованием этой элементарной операции.
    PS. Полезная книга«Программирование для MapInfo на примерах»(http://mapbasic.ru/download).
     
    #2
  3. thegeo

    Форумчанин

    Регистрация:
    19 фев 2012
    Сообщения:
    83
    Симпатии:
    15
    Вариант процедуры
    Код:
    sub itrs(byval tab1 as string,byval tab2 as string,byval pth_tab1_copy as string)
    	 OnError Goto ex
    	 dim strName as string
    	 strName=TempFileName$(pth_tab1_copy)
    	 pth_tab1_copy=Left$(strName,len(strName)-3) & "tab"
    	 Commit Table tab1 As pth_tab1_copy TYPE NATIVE Charset "WindowsCyrillic" Interactive
    	 Open Table pth_tab1_copy Interactive
    	 dim tb1copy as string
    	 tb1copy=PathToTableName$(pth_tab1_copy)
    	 Add Map Auto Layer tb1copy
    	 select * from tb1copy where str$(obj)="Region" into tb1copy2
    	 Set Target On
    	 select * from tb2 where str$(obj)="Region"
    	 Objects Intersect Into Target
    ex:
    if err()>0 then note Error$() end if
    OnError GoTo 0
    End Sub
    Здесь tab1, tab2 – имена таблиц;
    pth_tab1_copy
    – папка в которой будет храниться таблица с результатом.
    Обращение к процедуре

    Код:
    call itrs("tb1","tb2","C:\03")
     
    #3
  4. Marik!

    Регистрация:
    19 авг 2014
    Сообщения:
    19
    Симпатии:
    15
    прошу прощения, а не проще и быстрее это сделать простым запросом?!
     
    #4
  5. thegeo

    Форумчанин

    Регистрация:
    19 фев 2012
    Сообщения:
    83
    Симпатии:
    15
    Marik!, приведите пример такого запроса.
     
    #5
  6. trir

    Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.253
    Симпатии:
    931
    Адрес:
    gnomtrir@mail.ru
    Код:
    Select t1.g.STIntersects(t2.g)
    From t1, t2
     
    #6
  7. Marik!

    Регистрация:
    19 авг 2014
    Сообщения:
    19
    Симпатии:
    15
    как пример:
    есть два слоя на карте GREEN и WATER(парки и пруды), задача после оцыфровки выявить не накладываются ли слои между собой, в частности GREEN на WATER. SQL-запрос
    из таблицы: GREEN, WATER(первым выбирается слой интереса) - выпадающее окно "таблицы"
    с условием: GREEN.Obj Intersects WATER.Obj
    (колонки) (операторы) (колонки)
    Выдается таблица объектов и отмечаются объекты на карте.
    все просто)
    Если нужно найти объекты с определенной семантикой, то запрос усложняется в условиях.
     
    #7
  8. thegeo

    Форумчанин

    Регистрация:
    19 фев 2012
    Сообщения:
    83
    Симпатии:
    15
    Господа, посмотрите условие задачи
    и сравните с тем, что получили вы.
     
    #8
  9. trir

    Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.253
    Симпатии:
    931
    Адрес:
    gnomtrir@mail.ru
    перепутал, STIntersection
     
    #9
  10. thegeo

    Форумчанин

    Регистрация:
    19 фев 2012
    Сообщения:
    83
    Симпатии:
    15
    trir,
    И как к MapBasic вы собираетесь это прилепить. Вопрос был вполне конкретный.
     
    #10
  11. kadinzh

    Форумчанин

    Регистрация:
    23 май 2014
    Сообщения:
    124
    Симпатии:
    51
    Ну вы и напридумывали)) Задача решается стандартными средствами Mapinfo, зачем писать какую-то программу? Нужно все объекты скопировать в один слой. Затем выделить все объекты. И команда "Объекты - Проверка полигонов - Обнаружение перекрытий - Найти". Мапинфо создает желтые полигоны на перекрытиях, выбираете их по стилю и сохраняете в новый слой. Готово!
     
    #11
    Marik! нравится это.
  12. thegeo

    Форумчанин

    Регистрация:
    19 фев 2012
    Сообщения:
    83
    Симпатии:
    15
    И зачем писать какую-то программу, а люди все пишут и пишут.
    Действительно многие операции можно выполнить, используя лишь штатные средства MapInfo. Для рассматриваемой задачи распишу всю процедуру пошагово:
    1. Выбрать все площадные объекты на слое А.
    2. Выполнить операцию "Сохранить копию" для выборки Selection.
    3. Загрузить эту копию (В).
    4. Выбрать все площадные объекты на слое Б.
    5. Выполнить копирование этой выборки и вставку ее на слой В.
    6. Выбрать все объекты на слое В.
    7. Выполнить "Объекты/Проверка регионов/Обнаружение перекрытий"
    8. Для выделенных перекрытий выполнить операцию "Сохранить копию"
    9. Загрузить эту копию.
    10. Удалить таблицу В как уже не нужную.
    Вроде бы не так и сложно. Но если нужно выполнять эту процедуру многократно и если добавить вообще-то неизбежные ошибки оператора (чем длиннее процедура, тем более вероятны ошибки) то оптимизм тает. Я могу это выполнить раз другой но не больше. Поэтому и пишут программы, чтобы реализовывать подобные процедуры за одно нажатие кнопки.
     
    #12
    Marik! нравится это.
  13. Цветков Андрей

    Регистрация:
    18 сен 2013
    Сообщения:
    24
    Симпатии:
    6
    Есть похожая проблема. Имеем трассу нефтепровода и очень большое количество земельных участков, стоящих на кадастровом учете. Необходимо выбрать все пересечения нефтепровода с участками. Буду признателен за подходящие идеи.
     
    #13
  14. trir

    Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.253
    Симпатии:
    931
    Адрес:
    gnomtrir@mail.ru
    1. грузим слои в БД
    2. выполняем запрос с STIntersects или STIntersection
     
    #14
  15. Цветков Андрей

    Регистрация:
    18 сен 2013
    Сообщения:
    24
    Симпатии:
    6
    Кажется совсем не сложно. А можно поподробнее, что такое БД, и как выполнить запрос. Заранее благодарен.
     
    #15
  16. trir

    Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.253
    Симпатии:
    931
    Адрес:
    gnomtrir@mail.ru
    #16
  17. Geohobbi

    Регистрация:
    8 дек 2017
    Сообщения:
    2
    Симпатии:
    0
    Добрый день!
    У меня похожая проблема, есть линейный объект "кабельная линия" в одной таблице и есть земельные участки стоящие на кадастровом учете в другой таблице.
    У меня стоит задача составить перечень участков по которым проходит кабельная линия.
    Совсем не разбираюсь в базах данных.
    Нет ли какого нибудь готового запроса в мапинфо для этого?
    Может с помощью SQL-запроса, только что там писать?
     
    #17
  18. trir

    Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.253
    Симпатии:
    931
    Адрес:
    gnomtrir@mail.ru
    Select * from tbl1, tbl2 where tbl1.geom.STIntersects(tbl2.geom)
     
    #18
  19. Geohobbi

    Регистрация:
    8 дек 2017
    Сообщения:
    2
    Симпатии:
    0
    Подскажите что делаю не так.
    Выдает ошибку "Не определена переменная или поле Select"
     

    Вложения:

    #19
  20. Kuular

    Регистрация:
    21 окт 2021
    Сообщения:
    1
    Симпатии:
    0
    Добрый день! есть два слоя ! 1 кварталы, 2 ЗУ . задача такая найти ЗУ пересекающие 2 квартала и их площадь пересечения?
     
    #20

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

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