Считаем площади в MapInfo (пргаммирование)

MapInfo, MapBasic
grandred75
Интересующийся
Сообщения: 32
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение grandred75 »

Спасибо.

Задачку решил следующим образом (мало ли кому пригодится):
1. SQL-запрос:
Выбрать колонки: Участки.id, (Здания.Площадь*Здания.Этажность)
из таблиц: Здания, Участки
с условием: Участки.Obj contains Здания.obj

2. Обновить колонку:
Обновил таблицу "Участки", колонку "Площадь_Зданий_в_Участке"
Значение извлечь из: Qwery1 (Qwery2 ... QweryN)
Вычислить: Sum
для: "Площадь*Этажность"

ИЛИ то же, но через MapBasic - 2 строчки:

Select Участки.id, (Здания.Площадь*Здания.Этажность) from Здания, Участки where Участки.Obj contains Здания.obj into selection
Add Column "Участки" (Площадь_Зданий_в_Участке )From Selection Set To sum(COL2) Where within
Вложения
1. SQL-запрос
1. SQL-запрос
1.png (12.44 КБ) 5330 просмотров
2. Обновить колонку
2. Обновить колонку
2.png (6.71 КБ) 5330 просмотров
Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение Boris »

grandred75 писал(а): 11 май 2021, 11:56Задачку решил следующим образом (мало ли кому пригодится):
Почти правильно, за исключение того, что:
1) операторы "within" / "contains " связывают только те объекты, у которых центроид находится внутри охватывающего контура - все участки, которые перекрывают "здания" как-то иначе - пролетят мимо. С учетом того, что центроид в MapInfo можно сдвигать, результат такой операции - неопредлено не предсказуем.
2) в первом запросе УЖЕ есть идентификатор участка [id], Если он, как положено, уникален, то зачем второй раз плодить долгий и неустойчивый пространственный оператор? Связь id <-> сработает в разы лучше и надежней.
Ivor
Завсегдатай
Сообщения: 345
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 102
Откуда: Иркутск

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение Ivor »

Boris писал(а): 12 май 2021, 03:301) операторы "within" / "contains " связывают только те объекты, у которых центроид находится внутри охватывающего контура
Это фишка MapInfo или стандартное поведение в любой системе?
gamm
Гуру
Сообщения: 4170
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение gamm »

Это Мапинфа, тыц
«Contains» и «Within» имеют дело с центроидами.
«Contains Entire» и «Entirely Within» имеют дело с границами и не затрагивают центроиды.
В стандарте SQL немного другое RTFM
Geometry A contains Geometry B if and only if no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of A. An important subtlety of this definition is that A does not contain its boundary, but A does contain itself.
Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение Boris »

gamm писал(а): 12 май 2021, 13:13то Мапинфа, тыц
«Contains Entire» и «Entirely Within» имеют дело с границами и не затрагивают центроиды.
Только одно дополнение - ]«Contains Entire» - как и следует из названия соответствует объектам, которые ПОЛНОСТЬЮ включены в другой объект. Не скажу про границу - просто не помню: могут точки А лежать на границе В или нет.
Для MapInfo в основном использую оператор "Intersect" - он гарантированно возвращает все пересечения. В зависимости от задачи, что бы исключить ложное пересечение использую функцию:

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

AreaOverlap(obj1,obj2) < 1E-06
или

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

(AreaOverlap(obj1,obj2) /Area(obj1,"sq m")) < 1E-06
.
Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение Boris »

gamm писал(а): 12 май 2021, 13:13В стандарте SQL немного другое RTFM
где-то есть еще и OGS определение 9 пространственных операторов.
veta13
Новоприбывший
Сообщения: 1
Зарегистрирован: 21 май 2021, 21:38
Репутация: 0
Откуда: москва

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение veta13 »

Добрый вечер!
хочу построить участок в программе в map info.
выдает такую надпись
(с\users\лиза\document\правобережный12.mif:16)
встретилось[.] там, где ожидается[числовая константа]
что делать?
Ivor
Завсегдатай
Сообщения: 345
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 102
Откуда: Иркутск

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение Ivor »

veta13, показать нам код?
gamm
Гуру
Сообщения: 4170
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Считаем площади в MapInfo (пргаммирование)

Сообщение gamm »

veta13 писал(а): 21 май 2021, 21:55что делать?
для начала создать новую ветку (поскольку вопрос не имеет отношения к вычислоению площади), и описать, что вы делали - в частности, какое отношение имеет чтение MIF/MID к "построить участок в программе в map info."
Ответить

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

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

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