Запрос в Mapinfo

MapInfo, MapBasic
Foxxxy
Участник
Сообщения: 82
Зарегистрирован: 01 авг 2012, 09:15
Репутация: 1
Откуда: г. Санкт-Петербург

Запрос в Mapinfo

Сообщение Foxxxy » 01 авг 2012, 09:32

Подскажите, пожалуйста, возможно ли сделать такой запрос в Mapinfo. Имеются 2 таблицы. В 1 есть столбец Подвид и в нем перечень зон генерального плана. Во 2 таблице есть столбец Название и в нем перечень лесничеств. Возможно ли посчитать какую площадь занимает каждое из лесничеств в каждой зоне генерального плана. Спасибо!

Sibit
Активный участник
Сообщения: 206
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 27
Откуда: Новосибирск

Re: Запрос в Mapinfo

Сообщение Sibit » 01 авг 2012, 11:56

Скорей всего можно. Но ваша структура таблиц не очень понятна. Приведите полную структуру таблиц.

Foxxxy
Участник
Сообщения: 82
Зарегистрирован: 01 авг 2012, 09:15
Репутация: 1
Откуда: г. Санкт-Петербург

Re: Запрос в Mapinfo

Сообщение Foxxxy » 01 авг 2012, 13:14

Sibit могу выслать Вам по почте.

Аватара пользователя
Пётр Дубоделов
Завсегдатай
Сообщения: 271
Зарегистрирован: 21 апр 2009, 13:58
Репутация: 12
Откуда: Бурашево
Контактная информация:

Re: Запрос в Mapinfo

Сообщение Пётр Дубоделов » 01 авг 2012, 13:57

позволю себе встрять:
также можете воспользоваться вкладкой "вложения" в стандартной форме ответа. Задача типична, например, простое решение для QGis
поэтому стандарт её решения интересен любому для экономии времени.

PS: если конечно не "секретно!" :lol:
"Если карта не соответствует местности, доверяй местности."

Foxxxy
Участник
Сообщения: 82
Зарегистрирован: 01 авг 2012, 09:15
Репутация: 1
Откуда: г. Санкт-Петербург

Re: Запрос в Mapinfo

Сообщение Foxxxy » 01 авг 2012, 14:15

Выкладываю.
Вложения
Форум.rar
(2.03 МБ) 201 скачивание

Аватара пользователя
Пётр Дубоделов
Завсегдатай
Сообщения: 271
Зарегистрирован: 21 апр 2009, 13:58
Репутация: 12
Откуда: Бурашево
Контактная информация:

Re: Запрос в Mapinfo

Сообщение Пётр Дубоделов » 01 авг 2012, 15:42

попробовал разрезать зоны слоем лесничеств, затем SQL-запрос вида

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

_01.obj Within _02.obj
добавил колонку Площадь к таблице зон (01), посчитал в га, сводную по результатам SQL выбросил в текст, импортировал в Calc (exel), сделал сводную таблицу. Результат во вложении. Если принципиально нравится, можно продолжить: попробовать улучшить чистоту результата.
Вложения
2222222.xls
(43 КБ) 234 скачивания
"Если карта не соответствует местности, доверяй местности."

Foxxxy
Участник
Сообщения: 82
Зарегистрирован: 01 авг 2012, 09:15
Репутация: 1
Откуда: г. Санкт-Петербург

Re: Запрос в Mapinfo

Сообщение Foxxxy » 01 авг 2012, 15:49

Петр, а как разрезать зоны слоем лесничеств?

Аватара пользователя
Пётр Дубоделов
Завсегдатай
Сообщения: 271
Зарегистрирован: 21 апр 2009, 13:58
Репутация: 12
Откуда: Бурашево
Контактная информация:

Re: Запрос в Mapinfo

Сообщение Пётр Дубоделов » 01 авг 2012, 15:51

сделать слой изменяемым, выбрать его, далее меню Объекты>выбрать изменяемый..., затем выбрать слой лесничеств, далее Объекты>разрезать...

правда результат подобной операции не совсем подойдет для описанного выше запроса: будет много брака. в этот раз специально не проверял: как-никак ваши данные, но, как говорится, по опыту...
мне важно было показать существование возможности (думается, не единственной) и способ ее реализации.
"Если карта не соответствует местности, доверяй местности."

Boris
Гуру
Сообщения: 4115
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 404
Откуда: Париж

Re: Запрос в Mapinfo

Сообщение Boris » 01 авг 2012, 22:55

для вычисления площади пересечения полигональных объектов, если возможно (или нужно) определить их пересечение, не надо никого физически резать. Для этого существует ф-я AreaOverlap( object1, object2 ), допустимая в SQL запросах.
Полученная с использованием оператора Intersect (не within - он учитывает ВХОЖДЕНИЕ, причем такое, когда центроид объекта (левого члена оператора) входит в полигон правого члена оператора) таблица-запрос в общем случае будет содержать много дублей - все пересечения из первой таблицы с объектами из второй таблицы. но если есть для каждого объекта первой таблицы уникальный номер, то агрегирующий запрос по этому номеру и площади пересечения даст суммарные площади. если необходимо агрегирование по зонам (т.е. значениям не уникальным для каждого объекта), то агрегирование надо проводить по этому столбцу.

Sibit
Активный участник
Сообщения: 206
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 27
Откуда: Новосибирск

Re: Запрос в Mapinfo

Сообщение Sibit » 02 авг 2012, 07:34

Запрос такой, Можно добавить что бы сортировку сделал сразу.

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

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 ушло.
Вложения
Запрос.zip
Результат запроса
(1.67 КБ) 181 скачивание

Аватара пользователя
Пётр Дубоделов
Завсегдатай
Сообщения: 271
Зарегистрирован: 21 апр 2009, 13:58
Репутация: 12
Откуда: Бурашево
Контактная информация:

Re: Запрос в Mapinfo

Сообщение Пётр Дубоделов » 02 авг 2012, 08:13

Boris
спасибо за ликбез, воистину: век живи, век учись
"Если карта не соответствует местности, доверяй местности."

Foxxxy
Участник
Сообщения: 82
Зарегистрирован: 01 авг 2012, 09:15
Репутация: 1
Откуда: г. Санкт-Петербург

Re: Запрос в Mapinfo

Сообщение Foxxxy » 02 авг 2012, 08:45

Sibit, извините новичка, не совсем корректный вопрос. Мне нужно выбрать в верхнем меню Запрос - SQL Запрос. Дальше выскакивает табличка, которую не совсем понимаю, как заполнить. Help! Спасибо!

Sibit
Активный участник
Сообщения: 206
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 27
Откуда: Новосибирск

Re: Запрос в Mapinfo

Сообщение Sibit » 02 авг 2012, 09:13

Варианта 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.ПОДВИД, это сразу отсортирует результат.

Вот примерно так :) Результат я на одном объекте проверил, вроде правильно пресечение считает.

Foxxxy
Участник
Сообщения: 82
Зарегистрирован: 01 авг 2012, 09:15
Репутация: 1
Откуда: г. Санкт-Петербург

Re: Запрос в Mapinfo

Сообщение Foxxxy » 02 авг 2012, 09:29

Sibit, что неправильно заполнила? См. вложение. Выдает ошибку: Не определена переменная или поле part_01.Obj. Help!!!! Спасибо.
Вложения
01.jpg
01.jpg (52.23 КБ) 11050 просмотров

SergS
Активный участник
Сообщения: 119
Зарегистрирован: 14 апр 2011, 13:24
Репутация: 5
Откуда: Екатеринбург

Re: Запрос в Mapinfo

Сообщение SergS » 02 авг 2012, 09:36

"e="Foxxxy"]Выдает ошибку: Не определена переменная или поле part_01.Obj. Help!!!! Спасибо.[/quote]
дык она и в самом деле не определена, вместо "part_01.Obj" напишите "_01.Obj""
кстати, intersects все таки годится, т.к. касание точкой имеет нулевую площадь перекрытия, и в сумме участвовать не будет
а contains все таки не годится, потому как иcключает частичные перекрытия, и соответственно эти самые частичные площади

update:
звиняюсь :)
конечно contains part сгодится, пробел только после part поставить не забыть

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость