Страница 1 из 2
Запрос в Mapinfo
Добавлено: 01 авг 2012, 09:32
Foxxxy
Подскажите, пожалуйста, возможно ли сделать такой запрос в Mapinfo. Имеются 2 таблицы. В 1 есть столбец Подвид и в нем перечень зон генерального плана. Во 2 таблице есть столбец Название и в нем перечень лесничеств. Возможно ли посчитать какую площадь занимает каждое из лесничеств в каждой зоне генерального плана. Спасибо!
Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 11:56
Sibit
Скорей всего можно. Но ваша структура таблиц не очень понятна. Приведите полную структуру таблиц.
Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 13:14
Foxxxy
Sibit могу выслать Вам по почте.
Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 13:57
Пётр Дубоделов
позволю себе встрять:
также можете воспользоваться вкладкой "вложения" в стандартной форме ответа. Задача типична, например,
простое решение для QGis
поэтому стандарт её решения интересен любому для экономии времени.
PS: если конечно не "секретно!"

Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 14:15
Foxxxy
Выкладываю.
Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 15:42
Пётр Дубоделов
попробовал разрезать зоны слоем лесничеств, затем SQL-запрос вида
добавил колонку
Площадь к таблице зон (01), посчитал в га, сводную по результатам SQL выбросил в текст, импортировал в Calc (exel), сделал сводную таблицу. Результат во вложении. Если принципиально нравится, можно продолжить: попробовать улучшить чистоту результата.
Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 15:49
Foxxxy
Петр, а как разрезать зоны слоем лесничеств?
Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 15:51
Пётр Дубоделов
сделать слой изменяемым, выбрать его, далее меню Объекты>выбрать изменяемый..., затем выбрать слой лесничеств, далее Объекты>разрезать...
правда результат подобной операции не совсем подойдет для описанного выше запроса: будет много брака. в этот раз специально не проверял: как-никак ваши данные, но, как говорится, по опыту...
мне важно было показать существование возможности (думается, не единственной) и способ ее реализации.
Re: Запрос в Mapinfo
Добавлено: 01 авг 2012, 22:55
Boris
для вычисления площади пересечения полигональных объектов, если возможно (или нужно) определить их пересечение, не надо никого физически резать. Для этого существует ф-я AreaOverlap( object1, object2 ), допустимая в SQL запросах.
Полученная с использованием оператора Intersect (не within - он учитывает ВХОЖДЕНИЕ, причем такое, когда центроид объекта (левого члена оператора) входит в полигон правого члена оператора) таблица-запрос в общем случае будет содержать много дублей - все пересечения из первой таблицы с объектами из второй таблицы. но если есть для каждого объекта первой таблицы уникальный номер, то агрегирующий запрос по этому номеру и площади пересечения даст суммарные площади. если необходимо агрегирование по зонам (т.е. значениям не уникальным для каждого объекта), то агрегирование надо проводить по этому столбцу.
Re: Запрос в Mapinfo
Добавлено: 02 авг 2012, 07:34
Sibit
Запрос такой, Можно добавить что бы сортировку сделал сразу.
Код: Выделить всё
Select _02.Лесничество, _01.ПОДВИД, sum(AreaOverlap(_02.Obj, _01.Obj)) from _02, _01 where _02.Obj contains part _01.Obj group by _02.Лесничество, _01.ПОДВИД into selection
Только выполняется будет довольно долго, у меня минут 15 ушло.
Re: Запрос в Mapinfo
Добавлено: 02 авг 2012, 08:13
Пётр Дубоделов
Boris
спасибо за ликбез, воистину: век живи, век учись
Re: Запрос в Mapinfo
Добавлено: 02 авг 2012, 08:45
Foxxxy
Sibit, извините новичка, не совсем корректный вопрос. Мне нужно выбрать в верхнем меню Запрос - SQL Запрос. Дальше выскакивает табличка, которую не совсем понимаю, как заполнить. Help! Спасибо!
Re: Запрос в Mapinfo
Добавлено: 02 авг 2012, 09:13
Sibit
Варианта 2, первый - в окне SQL запрос, второй в окне Mapbasic ввести запрос который я привел.
В первом варианте - вначале выбрать таблицы в которых нужно сделать выборку, Mapinfo предложит в поле "с условием" ввести "_02.Obj Contains _01.Obj", заменить на "_02.Obj Contains part _01.Obj", Тк нужно пересечение(Intersect в данном случае не пойдет, т.к. он учитывает касание точкой), в поле колонки ввести необходимые колонки, в данном случае _02.Лесничество, _01.ПОДВИД, sum(AreaOverlap(_02.Obj, _01.Obj)). И заполнить поле "Группировать по колонкам" Лесничество и подвид ( _02.Лесничество, _01.ПОДВИД ) в поле сортировать можно тоже добавить _02.Лесничество, _01.ПОДВИД, это сразу отсортирует результат.
Вот примерно так

Результат я на одном объекте проверил, вроде правильно пресечение считает.
Re: Запрос в Mapinfo
Добавлено: 02 авг 2012, 09:29
Foxxxy
Sibit, что неправильно заполнила? См. вложение. Выдает ошибку: Не определена переменная или поле part_01.Obj. Help!!!! Спасибо.
Re: Запрос в Mapinfo
Добавлено: 02 авг 2012, 09:36
SergS
"e="Foxxxy"]Выдает ошибку: Не определена переменная или поле part_01.Obj. Help!!!! Спасибо.[/quote]
дык она и в самом деле не определена, вместо "part_01.Obj" напишите "_01.Obj""
кстати, intersects все таки годится, т.к. касание точкой имеет нулевую площадь перекрытия, и в сумме участвовать не будет
а contains все таки не годится, потому как иcключает частичные перекрытия, и соответственно эти самые частичные площади
update:
звиняюсь
конечно contains part сгодится, пробел только после part поставить не забыть