Как удалить/сохранить часть таблицы удовлетворяющую условию

MapInfo, MapBasic
tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Как удалить/сохранить часть таблицы удовлетворяющую условию

Сообщение tems-ya » 22 июн 2017, 12:21

Добрый день, уважаемые!

Занимаюсь рутинной и подозреваю, дурной работой - из доступных OSM shp для QGIS в полу-ручном, полу- автоматическом режиме (короче как получиться) пытаюсь утащить в MapInfo интересные мне данный в нужной мне раскраске.

Не первый год занимаюсь программированием всяко разно, в принципе задачу как-то осилил, но не покидает устойчивое ощущение, какой-то некрасивой кривизны получившегося решения...

В связи с эти вопрос
Научите пожалуйста правильной технологи:

1) как на Mapbasic с одной большой карты ПРАВИЛЬНО удалить все объекты удовлетворяющие заданному (сложному SQL запросу), чтобы в итоге не осталось ничего лишнего и не было бы никакого мусора.

2) как на Mapbasic с одной большой карты сохранить все объекты удовлетворяющие заданному (сложному SQL запросу) в отдельный набор файлов

Спасибо всем откликнувшимся.

trir
Гуру
Сообщения: 5292
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение trir » 22 июн 2017, 12:30

зачем это делать в mapInfo?
Загрузить dump osm в PostGIS и делать запросы в нём, а результат запроса можно сохранить хоть в новую БД
ну и есть overpass api, хотя там есть лимиты
https://habrahabr.ru/post/320562/

tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение tems-ya » 22 июн 2017, 13:54

Спасибо, принято. Обязательно изучу такой подход.

Но, вопрос, в общем-то был о другом. Как в мапинфо работать с таблицами правильно, идеологически правильно.
Я пока до конца не понимаю.

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

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение Boris » 23 июн 2017, 20:17

tems-ya писал(а):... Как в мапинфо работать с таблицами правильно, идеологически правильно.
Я пока до конца не понимаю.
Я готов вам объяснить "как", но Я пока не понимаю, что именно у вас "не так". Я обычно делают SQL запрос в какой то заранее заданный запрос, например, Q001. И потом чищу выборку SQL оператором "DELETE * FROM Q001"
Если я правильно понимаю, то вам необходимо инвертировать выборку? И удалить объекты не удовлетворяющие некоторому условию. Так?
И не последний вопрос - сколько таблиц участвуют в выборке и все ли от начала до конца надо выполнить в языке-программе Mapbasic или с использованием команд Mapbasic ВНУТРИ Mapinfo.
Проще всего удалить инверсию, или как то еще ее использовать, - это использовать команду меню "Запрос" - "Обратить выборку".

trir
Гуру
Сообщения: 5292
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение trir » 23 июн 2017, 20:27

а зачем вообще удалять, почему не записать результат запроса в новую таблицу и дальше использовать её?

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

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение Boris » 25 июн 2017, 21:58

trir писал(а):а зачем вообще удалять, почему не записать результат запроса в новую таблицу и дальше использовать её?
потому что иногда надо почистить таблицу от некоторого д..ма. И часто это проще делать итерационными приближениями к идеалу. что, конечно, не отменяет необходимости работать с копией таблицы, или хотя бы сделать архив до начала операций.

Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 452
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 101
Откуда: Город в клёнах и акациях
Контактная информация:

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение Игорь Лебедь » 25 июн 2017, 23:22

И ещё после удаления объектов из таблицы в мапинфо её надо упаковать:
Таблица - изменить - упаковать
Буфер обмена01.jpg
Буфер обмена01.jpg (82.67 КБ) 8973 просмотра

tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение tems-ya » 26 июн 2017, 09:16

Спасибо всем откликнувшимся.
Немного поясню все вопросы касаются исключительно MapBasic, без привлечения инструментария МИ совсем. Для простоты работаю с одной таблицей.

Мне бы хотелось понять
- как из заданной таблице корректно удалить некоторый select - поскольку после некоторых моих манипуляций с исходной таблицей делаю контрольный
select * from table_name в МИ и я вижу пустые строки в окне, т.е. что-то я не доделываю или делаю неправильно. В то же самое время, если я сохраняю нужный селект в новую таблицу, то наблюдаю только нужные данные - ничего лишнего. Вот этот момент я пока до конца не понимаю. Мне не хотелось бы в процессе работы сохранять копии, переименовывать и т.д. таблицы, хочется удалить все лишнее и сохранить изменение. Но пока так не выходит.

а зачем вообще удалять, почему не записать результат запроса в новую таблицу и дальше использовать её?
как-то так и делаю. Потом ее надо переименовать, старую удалить - в общем кривизна и веселуха еще та...

Не хочет компилировать код ниже - ругается на delete. Что я недопонимаю? Подозреваю что что-то очень примитивно простое...

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

Sub Convert_boundary_polygon2(cur_path as string)
	
		Dim pPen as Pen
		Dim cur_table, cur_table_name as string
	
	cur_table = "boundary-polygon"
	
	Close All Interactive
	Open TABLE cur_path & cur_table Interactive
	
	'Определяем имя открытой таблицы
	cur_table_name = TableInfo(0, TAB_INFO_NAME)

	'--------------------------------------------------------
	'              преобразуем в полилинии                
	'--------------------------------------------------------
	'Update cur_table_name Set Obj = ConvertToPLine(Obj)
	'Commit Table cur_table_name

	'--------------------------------------------------------
	'              Оставляем только нужное                
	'--------------------------------------------------------
	select * from cur_table_name where 
		ADMIN_LVL <> "6" and ADMIN_LVL <> "4" 
	into t1

	delete * from t1 

	Commit Table cur_table_name Interactive

End Sub

thegeo
Активный участник
Сообщения: 160
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение thegeo » 26 июн 2017, 13:03

Должно быть

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

delete from t1

tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение tems-ya » 26 июн 2017, 16:20

Как бы сработало, но в итоге вижу что на картинке (как бы пустые строки). Вопрос что это и как это исправить или победить.
Вложения
MapInfo.jpg
MapInfo.jpg (150.69 КБ) 8884 просмотра

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

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение gamm » 26 июн 2017, 17:56

tems-ya писал(а):Вопрос что это и как это исправить или победить.
при удалении физического удаления строк из файла не происходит, там просто ставится маркер. Для того, чтобы физически убрать строки, таблицу нужно упаковать. Например, вызвать из Васика пункт упаковки в меню ...

thegeo
Активный участник
Сообщения: 160
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение thegeo » 26 июн 2017, 17:58

Delete не удаляет строки, а лишь помечает их как удаленные. Для окончания цикла удаления необходимо выполнить процедуру упаковки, например, так
'упаковывает таблицу (с возвратом таблицы в карту idWin)

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

sub PackTable(ByVal nameTab As String,byval idWin as integer)
Commit Table nameTab
onerror goto ex
Pack Table nameTab Graphic Data Interactive
Add Map Window idWin Auto Layer nameTab
exit sub
ex:
Map From nameTab 
End Sub

Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 452
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 101
Откуда: Город в клёнах и акациях
Контактная информация:

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение Игорь Лебедь » 26 июн 2017, 18:07


tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение tems-ya » 27 июн 2017, 08:59

Спасибо всем, кто помог разобраться! :) Как всегда самое интересное скрывается в мелких деталях, до которых, порой, так трудно бывает добраться.

Еще раз, всем спасибо.

Mapper
Интересующийся
Сообщения: 15
Зарегистрирован: 17 апр 2009, 21:15
Репутация: 7

Re: Как удалить/сохранить часть таблицы удовлетворяющую усло

Сообщение Mapper » 04 авг 2017, 10:13

trir писал(а):зачем это делать в mapInfo?
Загрузить dump osm в PostGIS и делать запросы в нём, а результат запроса можно сохранить хоть в новую БД
ну и есть overpass api, хотя там есть лимиты
https://habrahabr.ru/post/320562/
trir, извините, конечно, но некоторые Ваши ответы чудовищны!! dump osm, overpass api, PostGIS, habrahabr.ru это для того чтобы удалить выборку в MapInfo??? Не морочьте людям голову, если не можете дать простой и практичный совет.

Ответить

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

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

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