Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Grave
Зарегистрирован: 18.04.2010 Сообщения: 5
|
Добавлено: Вс Апр 18, 2010 6:13 pm Заголовок сообщения: Необходима помощь в MapBasic |
|
|
Здравствуйте, я еще новичок в этом деле...
Вопрос: я имею некоторую выборку (линии) из таблицы в MapInfo и мне нужно это скопировать на новый слой + при этом опустить уже существующие слои (сделать их невидимыми)... В итоге должен остаться слой моей выборки. Как это реализовать (какая функция)???
PS За ранее спасибо... |
|
Вернуться к началу |
|
|
Arhara
Зарегистрирован: 18.02.2009 Сообщения: 400 Откуда: Moscow, RF
|
Добавлено: Вс Апр 18, 2010 8:57 pm Заголовок сообщения: |
|
|
все операции требуют стандартных процедур, описанных в руководстве и хелпе. естественно, что это набор функций и операторов, а не одна команда.
единственное не описанное место - выборка должна быть сохранена в новый физический файл, или она важна именно как выборка - набо отобранных объектов, которые физически остаются в своем исходном слое?
для реализации надо:
1. получить номер окна карты, в котором выполняете операции
2. получить список его слоев
3. выключить их все (сделать невидимыми или удалить - это на ваш выбор)
4. добавить новый слой - выборку |
|
Вернуться к началу |
|
|
Grave
Зарегистрирован: 18.04.2010 Сообщения: 5
|
Добавлено: Вс Апр 18, 2010 9:59 pm Заголовок сообщения: |
|
|
Вот программка:
Код: |
Include "mapbasic.def"
Include "menu.def"
Include "icons.def"
Declare Sub Main
Global col(), i, j, k, m, res1(), res2(), res3(), res4(), N, i1, j1 As Integer
Global a, L, arclen As Float
Sub Main
Print Chr$(12)
N=TableInfo( "Точка" , TAB_INFO_NROWS )-1
ReDim col(TableInfo( "Точка" , TAB_INFO_NROWS ) )
ReDim res1(N)
ReDim res2(N)
ReDim res3(TableInfo( "Точка" , TAB_INFO_NROWS ))
ReDim res4(N)
For k=1 To TableInfo( "Точка" , TAB_INFO_NROWS )
col(k)=k
res3(k)=0
Next
L=0
For k=1 To N
arclen=10000
Fetch First From Путь
For m=1 To TableInfo( "Путь" , TAB_INFO_NROWS )
If arclen>Путь.Полное_время And col(Путь.Входная_точка)<>col(Путь.Выходная_точка) And res3(Путь.Входная_точка)<2 And res3(Путь.Выходная_точка)<2 Then
arclen=Путь.Полное_время
res1(k)=Путь.Входная_точка
res2(k)=Путь.Выходная_точка
res4(k)=Путь.ID
End If
Fetch Next From Путь
Next
res3(res1(k))=res3(res1(k))+1
res3(res2(k))=res3(res2(k))+1
i1=col(res1(k))
j1=col(res2(k))
For m=1 To TableInfo( "Точка" , TAB_INFO_NROWS )
If col(m)=j1 Then
col(m)=i1
End If
Next
L=L+arclen
Print res1(k)
print res2(k)
print res4(k)
Next
For i=1 To N
Select * From Путь where RowID=res4(i) Into GGG Add Map Layer GGG
Remove Map Layer Путь
Next
End Sub
|
я добавил цикл:
For i=1 To N
Select * From Путь where RowID=res4(i) Into GGG Add Map Layer GGG
Remove Map Layer Путь
Но на новый слой у меня он переносит только последнюю выбраную линию...
В чем может быть ошибка??? Мне нужно чтобы на новом слое он отобразил от i=1 до N линий...
PS Точка и Путь - это талицы в Mapinfo |
|
Вернуться к началу |
|
|
Arhara
Зарегистрирован: 18.02.2009 Сообщения: 400 Откуда: Moscow, RF
|
Добавлено: Ср Апр 21, 2010 12:46 am Заголовок сообщения: |
|
|
Код: |
For i=1 To N
Select * From Путь where RowID=res4(i) Into GGG
Add Map Layer GGG
|
вы делаете выборку N раз с разным числом res4(i) в запрос GGG. это все равно, что перелистывать книгу по номеру страницы - в каждый момент времени вы на одной единственной странице, а не на диапазоне страниц.
команда select не делает обобщений. вам нужно создавать промежуточную таблицу, на пример, tempGGG, в которую добавить все ваши res4(i) в поле ID1. И ее потом связать с таблицей Путь через сложный запрос:
Select * From Путь, tempGGG where Путь.RowID=tempGGG.ID1 Into GGG
Для большей надежности я бы не полагался на RowID, а создал поле уникальных ключей самостоятельно. |
|
Вернуться к началу |
|
|
Grave
Зарегистрирован: 18.04.2010 Сообщения: 5
|
Добавлено: Пт Апр 23, 2010 6:13 pm Заголовок сообщения: |
|
|
Arhara, спасибо...
Последнее что мне осталось попробую объяснить в кратце...
У меня есть точки и сетка соединяющая их -
С помощью программы будут соединяться точки на карте с наикратчайшими затратами времени или расстояния (решение задачи коммивояжера) -
Как сделать так, что бы он учитывал не все точки на карте, а только выбранные в РУЧНУЮ точки (например 1,3,4,5)-
В итоге добавить программе интерактивности...
Буду благодарен за любую помощь, последний мой шаг в дипломной работе... |
|
Вернуться к началу |
|
|
Arhara
Зарегистрирован: 18.02.2009 Сообщения: 400 Откуда: Moscow, RF
|
Добавлено: Сб Апр 24, 2010 11:15 pm Заголовок сообщения: |
|
|
Текущее выделение в MI стандартно записывается в запрос с именем Selection. Способ выделения роли не играет - вручную или программно он сделан. С помощью функции SelectionInfo можно узнать и имя запроса и исходную таблицу. Для простоты обработки лучше выборку сохранить во временную таблицу. Имя файла для такой таблицы легко получить через функцию TempFileName$( dir ).
Дальше все как обычно. Можно использовать и выборку, она практически не отличается от обычных таблиц, за исключением того, что не может участвовать в пространственных запросах на объединение двух таблиц. |
|
Вернуться к началу |
|
|
Grave
Зарегистрирован: 18.04.2010 Сообщения: 5
|
Добавлено: Чт Апр 29, 2010 5:32 pm Заголовок сообщения: |
|
|
Подскажите как создать окно-список (наподобие MultiListBox) , что бы при выборе в нем определенных записей он их выбирал в исходнике и копировал в другую таблицу... |
|
Вернуться к началу |
|
|
Grave
Зарегистрирован: 18.04.2010 Сообщения: 5
|
Добавлено: Сб Май 01, 2010 10:46 am Заголовок сообщения: |
|
|
fixed |
|
Вернуться к началу |
|
|
|