Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Egor_J
Зарегистрирован: 27.11.2006 Сообщения: 3 Откуда: Moscow
|
Добавлено: Пн Ноя 27, 2006 5:27 pm Заголовок сообщения: MapBasic/Интегрированная картография |
|
|
Здравствуйте все!
Извините, я новичок в программировании под mapinfo и я столкнулся со следующей проблемой:
1. Команда
SELECT * FROM Rivers WHERE R_ID=1112 INTO ZoomObject Add Map Layer ZoomObject ,
выполненная в mapbasic-окне mapinfo, делает из слоя Rivers выборку, выделяет ее, записывает в слой ZoomObject и добавляет ZoomObject в текущий workspace.
Однако выполнение команды Visual Basic
MapInfo.Do "SELECT * FROM Rivers WHERE R_ID=1112 INTO ZoomObject Add Map Layer ZoomObject"
такого эффекта не дает: выборка делается, на экране выделяется, создается слой ZoomObject, однако в workspace он не добавляется.
Если кто может, подскажите пожалуйста, что я не учел?
2. Можно уточнить: мне нужно во внешнем приложении, по нажатию кнопки, открыть окно MapInfo, загрузить туда готовый воркспейс, по одному из слоев провести выборку и результат - приблизить (Zoom In). Подскажите пожалуйста, правильно ли я поступаю, или есть какой - либо другой вариант :
SELECT * FROM Rivers WHERE R_ID=1112 INTO ZoomObject
Fetch first From ZoomObject
Set Map Center (CentroidX(ZoomObject.obj),CentroidY(ZoomObject.obj))
Add Map Layer ZoomObject
Set Map Zoom Entire Layer ZoomObject
Remove Map Layer ZoomObject
В MapInfo действительно работает (объект выбирается и приближается), однако при выполнении из Visual Basic с помощью MapInfo.Do "" объект только выбирается, но приближения не происходит.
Если нужно, могу выложить текст программы на VB.
Спасибо. |
|
Вернуться к началу |
|
|
Нестеров Валерий
Зарегистрирован: 21.03.2006 Сообщения: 492
|
Добавлено: Вт Ноя 28, 2006 1:35 pm Заголовок сообщения: |
|
|
По первому вопросу непонятно в какой workspace?
Ваша команда делает выборку под именем "ZoomObject", помещает ее в текущее окно карты с номерм "0" (нет открытой карты, никуда не добавляется), а что такое "workspace"? Если это рабочий набор, то надо сделать команду - "Сохранить в рабочий набор" - Save Workspace As "*****"
по второму объект не приближается, потому, что возможно слой "ZoomObject" не добавился в окно карты или в выборке по вашему условию в него не попал ни один объект. Вы уберите "Remove Map Layer ZoomObject" и проверьте появляется ли в окне карты "ZoomObject" и не пустой ли он? _________________ Жизнь прекрасна!i |
|
Вернуться к началу |
|
|
Egor_J
Зарегистрирован: 27.11.2006 Сообщения: 3 Откуда: Moscow
|
Добавлено: Вт Ноя 28, 2006 3:57 pm Заголовок сообщения: |
|
|
Спасибо за ответ.
По первому вопросу ситуация следующая:
В MapInfo я открываю файл map.wor, который является рабочим набором и загружает вместе с другими файлами файл Rivers.tab, из которого я делаю выборку. После этого я открываю окно mapbasic, ввожу указанную команду и получаю соответствующий результат (в Layer Control появляется новый слой ZoomObject). В Visual Basic я, прежде чем писать запрос, запускаю MapInfo, и загружаю файл .wor командой MapInfo.do "Run application ""c:\mi\map.wor""", потом выполняю запрос MapInfo.Do "SELECT * FROM Rivers WHERE R_ID=1112 INTO ZoomObject Add Map Layer ZoomObject". В результате - выборка на экране выделилась, но слой ZoomObject в Layer Control не появился. Здесь я и заткнулся.
Второй вопрос - расширение первого:
Я убирал "Remove Map Layer ZoomObject", и ZoomObject в окне карты не появлялся (выборка не пустая). Значит, он туда не добавляется.
Спасибо.
Вот код программы на VB:
Sub OpenMap()
Set mapinfo = CreateObject("MapInfo.application")
mapinfo.do "Set Application Window " & Form2.hWnd
mapinfo.do "Set Next Document Parent " & Form2.hWnd & " Style 1"
mapinfo.do "Run application ""c:\mi\map.wor"""
mapinfo.RunMenuCommand 1702
mapinfo.do "Select * From Rivers Where R_ID=1112 Into ZoomObject NoSelect Add Map Layer ZoomObject Fetch first From ZoomObject Set Map Center (CentroidX(ZoomObject.obj),CentroidY(ZoomObject.obj)) Add Map Layer ZoomObject Set Map Zoom Entire Layer ZoomObject"
Form2.Show
End Sub |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Ср Ноя 29, 2006 8:21 am Заголовок сообщения: |
|
|
Мне особенно понравилось вот это:
Egor_J писал(а): |
mapinfo.do "Select * From Rivers Where R_ID=1112 Into ZoomObject NoSelect Add Map Layer ZoomObject Fetch first From ZoomObject Set Map Center (CentroidX(ZoomObject.obj),CentroidY(ZoomObject.obj)) Add Map Layer ZoomObject Set Map Zoom Entire Layer ZoomObject"
|
Если честно я первый раз вижу что все команды MapBasic можно писать так в одну строку! Я бы все-таки рекомендовал разделить их на несколько вызовов mapinfo.do
Т.е. типа:
mapinfo.do "Select * From Rivers Where R_ID=1112 Into ZoomObject NoSelect"
mapinfo.do "Add Map Layer ZoomObject"
mapinfo.do "Fetch first From ZoomObject"
...
Мне кажется проблема именно в этом. |
|
Вернуться к началу |
|
|
Egor_J
Зарегистрирован: 27.11.2006 Сообщения: 3 Откуда: Moscow
|
Добавлено: Ср Ноя 29, 2006 5:23 pm Заголовок сообщения: |
|
|
Спасибо всем за то, что откликнулись!
Проблема оказалась примитивной: в файле *.wor в конце стояло открытие еще одной карты, и mapbasic послушно ее открывал. В visual basic нужно было ее тоже перехватывать, чего я не делал. Как только убрал из файла *.wor указание на вторую карту, все заработало.
По поводу одной строки: в руководстве по mapbasic написано, что все команды, вбиваемые в mapbasic-окно mapinfo, воспринимаются в виде единой строки. Поэтому, если вы разбиваете строку на несколько, в конце каждой необходимо ставить пробел. Иначе у обработчика будет путаница с командами. Я сделал так, как рекомендовало руководство МВ, хотя признаю, что разбиение на отдельные строки является эстетически более правильным. |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Чт Фев 01, 2007 12:55 pm Заголовок сообщения: |
|
|
В команде Add Map , как и во многих других, есть предложение Window WindowID - которое может быть очень полезным для предотврашения путаницы при работе с окнами. |
|
Вернуться к началу |
|
|
|