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

MapInfo, MapBasic
grandred75
Новоприбывший
Сообщения: 3
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 0
Откуда: Москва

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

Сообщение grandred75 » 11 май 2021, 11:56

Спасибо.

Задачку решил следующим образом (мало ли кому пригодится):
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.png
1. SQL-запрос
1.png (12.44 КБ) 830 просмотров
2.png
2. Обновить колонку
2.png (6.71 КБ) 830 просмотров

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

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

Сообщение Boris » 12 май 2021, 03:30

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

Ivor
Активный участник
Сообщения: 157
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 48
Откуда: Иркутск

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

Сообщение Ivor » 12 май 2021, 12:18

Boris писал(а):
12 май 2021, 03:30
1) операторы "within" / "contains " связывают только те объекты, у которых центроид находится внутри охватывающего контура
Это фишка MapInfo или стандартное поведение в любой системе?

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

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

Сообщение gamm » 12 май 2021, 13:13

Это Мапинфа, тыц
«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
Гуру
Сообщения: 4168
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 420
Откуда: Париж

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

Сообщение Boris » 13 май 2021, 17:40

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
Гуру
Сообщения: 4168
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 420
Откуда: Париж

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

Сообщение Boris » 13 май 2021, 17:41

gamm писал(а):
12 май 2021, 13:13
В стандарте SQL немного другое RTFM
где-то есть еще и OGS определение 9 пространственных операторов.

veta13
Новоприбывший
Сообщения: 1
Зарегистрирован: 21 май 2021, 21:38
Репутация: 0
Откуда: москва

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

Сообщение veta13 » 21 май 2021, 21:55

Добрый вечер!
хочу построить участок в программе в map info.
выдает такую надпись
(с\users\лиза\document\правобережный12.mif:16)
встретилось[.] там, где ожидается[числовая константа]
что делать?

Ivor
Активный участник
Сообщения: 157
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 48
Откуда: Иркутск

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

Сообщение Ivor » 22 май 2021, 11:12

veta13, показать нам код?

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

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

Сообщение gamm » 22 май 2021, 12:13

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

Ответить

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

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

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