Страница 1 из 2

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

Добавлено: 22 июн 2017, 12:21
tems-ya
Добрый день, уважаемые!

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

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

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

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

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

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

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

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

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

Добавлено: 22 июн 2017, 13:54
tems-ya
Спасибо, принято. Обязательно изучу такой подход.

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

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

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

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

Добавлено: 23 июн 2017, 20:27
trir
а зачем вообще удалять, почему не записать результат запроса в новую таблицу и дальше использовать её?

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

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

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

Добавлено: 25 июн 2017, 23:22
Игорь Лебедь
И ещё после удаления объектов из таблицы в мапинфо её надо упаковать:
Таблица - изменить - упаковать
Буфер обмена01.jpg
Буфер обмена01.jpg (82.67 КБ) 9860 просмотров

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

Добавлено: 26 июн 2017, 09:16
tems-ya
Спасибо всем откликнувшимся.
Немного поясню все вопросы касаются исключительно 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

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

Добавлено: 26 июн 2017, 13:03
thegeo
Должно быть

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

delete from t1

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

Добавлено: 26 июн 2017, 16:20
tems-ya
Как бы сработало, но в итоге вижу что на картинке (как бы пустые строки). Вопрос что это и как это исправить или победить.

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

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

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

Добавлено: 26 июн 2017, 17:58
thegeo
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

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

Добавлено: 26 июн 2017, 18:07
Игорь Лебедь

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

Добавлено: 27 июн 2017, 08:59
tems-ya
Спасибо всем, кто помог разобраться! :) Как всегда самое интересное скрывается в мелких деталях, до которых, порой, так трудно бывает добраться.

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

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

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