Страница 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: если конечно не "секретно!" :lol:

Re: Запрос в Mapinfo

Добавлено: 01 авг 2012, 14:15
Foxxxy
Выкладываю.

Re: Запрос в Mapinfo

Добавлено: 01 авг 2012, 15:42
Пётр Дубоделов
попробовал разрезать зоны слоем лесничеств, затем SQL-запрос вида

Код: Выделить всё

_01.obj Within _02.obj
добавил колонку Площадь к таблице зон (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 поставить не забыть