GIS-LAB

Географические информационные системы и дистанционное зондирование


Форумы GIS-Lab.info

Геоинформационные системы (ГИС) и Дистанционное зондирование Земли


Создать проект MapInfo.

Mapinfo, MapBasic

Создать проект MapInfo.

Postby Niko » 01 Sep 2008, 09:15

Добрый день.
Стоит задача создать проект в MapInfo используя Visual Basic.
Подскажите пожайлуста где про это можно почитать, нужны самые азы.
пример:
Set AppCAD = GetObject(, "AutoCAD.Application")
AppCAD.ActiveDocument.ModelSpace.... - тут я имею доступ ко всему что находится в автокадовском проекте. тут все просто.
---
Set AppMInfo = GetObject(, "MapInfo.Application")
есть ли аналог для MapInfo? я ничего похожего не нашел.
-----
Если кто знает где найти нужную информацию буду очень признателен.
Заранее спасибо! Николай.
  • 0

Niko
Новоприбывший
 
Joined: 01 Sep 2008
 
Posts: 5
Reputation: 0

Re: Создать проект MapInfo.

Postby Boris » 02 Sep 2008, 00:12

:evil: написал длинный ответ, а он исчез после повторной авторизации. второй раз не осилю. :roll:
коротко.
скачайте MapBasic - С 9.0 он бесплатен и руководство пользователя к нему. с сайта
http://www.mapinfo.com/support/downloads
вас там попросят зарегистрироваться. после регистрации пустят дальше. беспокоить - не будут.
не хотите регистрироваться - вот прямые ссылки:
http://reference.mapinfo.com/software/mapbasic/english/9.5/MapBasicUserGuide.PDF
http://reference.mapinfo.com/software/mapbasic/english/9.5/MapBasicReferenceGuide.PDF
ftp://betaftp3.mapinfo.com/products/mapbasic/
Сам MapBasic, для вас, ценен только руководством и help'ом, ибо надо использовать кучу команд MapBasic, пересылаемых работающему приложению MapInfo, а так же примерами на разных языках программирования.
Описание работы дано в разделе UserGuide'а "12. Integrated Mapping"
В сети гуляет русская версия UserGuide'а, по моему к версии 7.0, или около того. На одном из сайтов по Delphi есть толковая статья по связи "интегрированной картографии" и Delphi - 98% из нее подходит к VB.
Способы связи приложения и MapInfo - просты и непритязательны. Объектная структура используется только в команде Set AppMInfo = GetObject(, "MapInfo.Application")
все остальное делается путем пересылки команд и функций в приложение MapInfo, а так же перенаправлением вывода "окна карты MapInfo" в "свое" окно приложения.
Для общения используются все нециклические и неусловные команды-функции MapBasic'а. Собственно для этого и нужен help.
В свое время для спокойного программирования пришлось нагородить специальный класс, в который последовательно выписывать отдельные наиболее употребительные функции.
Подводных камней - в достатке. Самые болезненны:
1) MapInfo - все время "за углом" и команды выполняются то синхронно, то асинхронно. Если он завис ил пропал, вы об этом никак не узнаете, особенно, если пользователь его просто закрыл.
2а) GetObject подсоединяется к ранее запущенному MapInfo (но не всегда). Как и все GetObject - если запущены 2 и более приложений MapInfo, а у меня пользователи любили их плодить :twisted: , подключение к конкретному экземпляру отследить и обеспечить крайне не просто, чаще - вовсе не возможно.
2б) CreateObject - Создает свой новый экземпляр MapInfo и по непредсказуемому алгоритму может его прятать с экрана, а может и показывать. После закрытия приложения в 90% случаев запущенный MapInfo закрывается автоматически, в 10% - нет. В 20% случаев при закрытии - завершается системной ошибкой приложения MapInfo.
Экземпляр MapInfo, созданный командой CreateObject, командой GetObject - не виден.
3) Поведение вызываемых окон диалога MapInfo (включая бегущую строку команды Open Table и особенно Save Table) способно довести до белого каления, т.к. плохо предсказуемо на разных машинах и в разных условиях. Для связи MapInfo - Внешнее приложение используется команды перенаправления "окна карты" и "главного окна", которые могут требовать для выполнения посланных команд переключения в окно "реальной программы MapInfo", при том, что само MapInfo моргнет 3 раза и больше ничего не скажет, что оно ждет "фокуса" и на себя не переключится.
Так сразу много и не вспомнишь. Но непопробовавшему сразу объяснить сложно.
Имейте в виду - это письмо, это действительно, - коротко.
  • 0

---
чтение данного сообщения запрещено служащим МЭР, а равно лицам сотрудничающим с ним по договорам возмездного оказания услуг.
Boris
Гуру
 
Joined: 10 Apr 2006
Location: Москва (на карте)
 
Posts: 3149
Reputation: 129
Статьи: 3
Проекты: 1

Re: Создать проект MapInfo.

Postby Niko » 03 Sep 2008, 07:21

Спасибо за ответ. буду пробовать :)
  • 0

Niko
Новоприбывший
 
Joined: 01 Sep 2008
 
Posts: 5
Reputation: 0

Re: Создать проект MapInfo.

Postby Niko » 04 Sep 2008, 15:52

Вроде получается, но есть еще вопросы. :)
1. Мне нужно наносить условные знаки. Можно их каждый раз рисовать программно, но думаю есть способ попроще, что-то по аналогии с Автокадом, копируем готовый блок (в данном случае вроде область называется) и все. Создать все блоки думаю можно в отдельном файле. Вопрос как из VB копировать существующий блок и вставить в нужную таблицу в нужное место?
2. Создаю таблицу так:
sSTR = "Create Table " & NameTable & " (ind Integer) File " & NameTable & """ type DBF"
AppMInfo.Do sSTR

AppMInfo.Do "Create Map For " & NameTable

sSTR = "Open Table " & NameTable & """ Interactive"
AppMInfo.Do sSTR
AppMInfo.Do "Map From " & NameTable
AppMInfo.Do "Set Map Zoom 500 Units ""m"""
AppMInfo.Do "Set Map XY Units ""m"""
AppMInfo.Do "Set Map CoordSys NonEarth Units ""m"" Bounds (97000, 70000) (100000, 73000)"
После внесения изменений сохраняю и выгружаю:
sSTR = "Commit Table " & curTABLE & ""
AppMInfo.Do sSTR
sSTR = "Close Table " & curTABLE & ""
AppMInfo.Do sSTR

Вопрос: Почему когда я открываю эту таблицу из МапИнфо измерения производятся не на плоскости, а на сфере? причем до того как выгружу таблицу пишет что измерения производятся на плоскости.

Надеюсь объяснил понятно, заранее спасибо!
Николай.
  • 0

Niko
Новоприбывший
 
Joined: 01 Sep 2008
 
Posts: 5
Reputation: 0

Re: Создать проект MapInfo.

Postby Boris » 05 Sep 2008, 03:21

Знаете, сумели поставить в тупик... Столько вопросов и все с подвохом.
1. Вообще-то в MapInfo Есть 3 вида условных Точечных знаков (линейные и площадные только одни):
а) стандартный способ с MapInfo 6.0 - это символ в виде буквы шрифта
б) старые условные знаки в каком-то специальном формате, раньше была программка, которая позволяла их рисовать
в) условные знаки в виде BMP-картинок
все они вставляются одной командой, а создаются другой. На память не вспомню, но Help по MapBasic'у даст ответ быстро.
Вставлять условные знаки блоком!? Простите, но это же не Автокад... Хотя, знаю, что так делают, когда надо обеспечить какой-то экзотический вид условного знака.
Самое сложное, что обычно делается - это вставляются подписи из соответствующего шрифта и символа по номеру, а затем они переводятся в Текст или Условные (точечные) знаки. А так их просто расставляют интерактивно. Да, перепроверил, в MapInfo условные знаки - это точечные символы. Они могут быть разными. Что в общем не свойственно ГИС.
Все равно, я плохо представляю, что именно вы делали. Так что если все же нужен совет, то надо описать больше или прислать фрагмент файла. Копировать объекты надо командой "Update ... Set obj=....".
2. Создаете правильно. Что делаете по-средине не знаю. Закрываете то же правильно.
Менять положение обычно делается командами создать объект, присвоить оформление объекта, копировать атрибутивные данные объекта. К стати для точек, если я не путаю, проще и быстрее использовать команду "Update ... Set Obj=CreatePoint(.......)" для заранее созданных атрибутивных данных. Единственно, что заранее надо задавать оформление точечного объекта по умолчанию.
3. Замечу, не скромно, что плоская проекция в MapInfo - это путь к приключениям. Если уверены в ограниченности и плоскости своего пространства, лучше создайте псевдоплоскую проекцию на каком-нибудь достойном датуме, расположенную приблизительно в вашей местности.
4. Показывает она всегда (или почти всегда, если нет в окне растра или грида) все в той проекции, которая загружена из первой открытой в окне проекции. Узнать текущую проекцию надо в свойствах окна карты. Там же устанавливаются способы измерения для текущего окна, общие свойства устанавливаются в "Настройки-Режимы".
5. Для плоской карты - она всегда меряет плоско, даже если говорит, что мерила на сфере.
6. Там же на ftp://betaftp3.mapinfo.com/products/mapbasic/ в каталогах выше должны лежать руководства к MapInfo. Нужны будут на русском - кричите. Помогу найти в интернете.
7. Очень часто проще генерировать код для окна MapBasic'А в MapInfo. И потом загружать его туда как тест, что бы понять что именно и как делается. Как я говорил ранее - съедается любой текст кроме условных и циклических операторов. Значительную часть автоматизации можно сделать с помощь стандартных SQL команд Select, Update, Insert в MapInfo, если помнить, что там можно использовать ЛЮБЫЕ функции, которые описаны в MapBasic'е, а не то убогое подмножество, которое дает команда SQL и Help в самой MapInfo.
8. Что бы выполнить несколько команд в окне MapBasic MapInfo их надо выделить и нажать ввод.
  • 0

---
чтение данного сообщения запрещено служащим МЭР, а равно лицам сотрудничающим с ним по договорам возмездного оказания услуг.
Boris
Гуру
 
Joined: 10 Apr 2006
Location: Москва (на карте)
 
Posts: 3149
Reputation: 129
Статьи: 3
Проекты: 1

Re: Создать проект MapInfo.

Postby Niko » 05 Sep 2008, 12:42

Добрый день!
Спасибо за ответ, есть очередной вопрос/уточнение :)
1. Тут я создаю регион, вставляю его в таблицу и чтобы он имел имя присваиваю полю l1 в последней строке таблицы имя (возможно надо по другому делать).
Code: Select all
Dim obj_region as Object
Dim x(100), y(100) as Float
Dim i, node_count as integer
dim curRow as integer

node_count=4
x(1)=10
y(1)=10
...
x(4)=10
y(4)=20
Create Region Into Variable obj_region 0
For i=1 to node_count
   Alter Object obj_region Node Add (x(i),y(i))
Next
Insert Into Untitled (Object) Values(obj_region)
curRow = TableInfo("Untitled",8)
select * from Untitled Where RowID = curRow
Update Selection Set l1="1111"

-----
Задача стоит обратная, открыть таблицу с уже имеющимися в ней объектами, найти нужный (по имени или порядковому номеру) и присвоить это объектной переменной чтобы была возможность перенести этот объект в другую таблицу изменив только координаты.
Code: Select all
Dim obj_region as Object
Open Table "C:\Untitled.TAB"   'тут есть готовые объекты
Create Region Into Variable obj_region 0
select obj from Untitled Where l1 = "1111"                 'выбрал нужный мне объект
select obj from Untitled Where l1 = "1111" Into TAB1  'скопировал нужный объект в таблицу TAB1

теперь надо либо как-то получить данные об выбранном объекте и присвоить их объекту obj_region. после этого я смогу вставить этот объект в другую таблицу с новыми координатами.
как присвоить понятно, а как получить не понимаю :(
либо как-то поменять координаты объекта в таблице TAB1 - тут тоже ничего не могу найти как это сделать :(
2.
4. Показывает она всегда (или почти всегда, если нет в окне растра или грида) все в той проекции, которая загружена из первой открытой в окне проекции. Узнать текущую проекцию надо в свойствах окна карты. Там же устанавливаются способы измерения для текущего окна, общие свойства устанавливаются в "Настройки-Режимы".

тут не совсем понятно. если я сохранил в режиме "на плоскости" почему всетаки открывается в режиме "на сфере". есть таблицы (сделанные не мной) которые открываются "на плоскости", а мои только "на сфере" :)
причем перед открытием и той и другой таблицы в режимах стоит "на плоскости"
----
Николай.
  • 0

Niko
Новоприбывший
 
Joined: 01 Sep 2008
 
Posts: 5
Reputation: 0

Re: Создать проект MapInfo.

Postby Boris » 06 Sep 2008, 02:20

По порядку:
1. обход таблицы выполняется командой FETCH. Доступ к текущему полю "имя_таблицы_внутри_MapInfo"."имя_поля". посмомотрите Help там описано полнее. команда очень капризная, этот самый указатель предельно легко слетает, особенно, если идти по настоящей таблице, а не по запросу. Для того, что бы этого избежать, как припоминаю, приходилось при использовании внешних вызовов из VB делать 2 вещи:
а) создать таблицу на одну запись командой Select по RowID
б) создавать запрос на все необходимое множество, который ,потом, надо не забыть закрыть. Лимит файлов исчерпывается довольно быстро.
2. Оффтоп: я как-то утратил понимание, речь по прежнему о связи VB-MapInfo или уже о простом доступе и создании команд с помощью MapBasic'а.
3. Записать при переборе в поле Obj, по моему все же нельзя... Припоминаю, что именно в этот момент Fetch и теряет указатель, а может и просто нельзя, уже не помню. Помню, что приходилось использовать Update ... Set Obj=[имя_переменной] Where RowId=
4. Какая-то у вас загадочная задача. Создавать регионы итерационно, да еще через программную среду, перечесляя координаты в коде? Копировать объекты из таблицы в таблицу для того, что бы изменить в них потом геометрию на совсем новую? Как говорят в рекламе - "Совсем не понимаю!?" :shock: На мой взгляд главное в объекте как раз геометрия, на ее создание и уходит максимум сил, времени и ресурсов. Если не хотите делать свой проект достояние общественности, - свяжитесь со мной через личное сообщение, может все же есть более простой путь через ваши грабли? Ведь копирование оформления и атрибутивных полей - оно на порядок или два быстрее, чем создание геометрии.
5. Что бы не мучить вас подробностями, я вам скажу, что то чем вы занимаетесь в плане создания геометрии, особенно с запросом на добавление по одной вершине через OLE интерфейс, вообще-то решается совсем другим путем. И его не надо изобретать, так как он является штатным средством MapInfo, которое в совокупности с его простотой и текстовым файлом Рабочего набора составляет 85% силы и привлекательности MapInfo. Этот путь - обменный формат MIF/MID, так глубоко любимый всеми разработчиками во всем мире. Это текстовый формат, простой как угол дома. Для того, что бы в нем создать односвязанный регион не надо знать вообще НИЧЕГО. Скопировать заголовок из имеющегося файла (или заготовки) и заполнить текстовый файл перечнем координат, не забыв, что в регионе точек на одну больше, чем полилинии - начальная и конечная совпадают. Можете мне поверить, скорость создания файлов MIF/MID на VB - гораздо выше скорости создания объектов через интерфейс к MapInfo, а уж надежнее в разы. Выполнить потом команду
Import file_name
[ Type file_type ]
[ Into table_name ]
[ Overwrite ] много времени и усилий не займет. И отладка занимает в 100 раз меньше времени. Атрибуты пишутся в параллельный MIF файл по принципу один объект - одна строка со всеми атрибутами через запятую (что правда можно поменять). Единственно, чего нельзя поменять - десятичная точка должна быть именно точкой, а не тем, что ставит Windows и VB из-за региональных настроек.
6. Вообще язык файла MIF/MID чрезвычайно богат, особенно его текущая версия 4.0, если я не путаю номер версии. Описание его раньше лежало на сайте MaInfo. Кроме того он позволяет легко и непринужденно для каждого создаваемого объекта задавать его полное уникальное оформление. Естественно, если вы используете стандартные средства MapInfo. Всякие там площадные псевдозаливки, создаваемые в реальности отдельными объетами слоя - это конечно можно и в нем, но тогда запущенный MaPinfo ткак раз и нужен, для того, что бы верно определить границы "заливаемых" полигонов. Но вот создание оформления для массово ново-создаваемых объектов, с помощь библиотеки оформлений - это просто для него.
Не в качестве рекламы, но в качестве примера: была задача создать на Московскую область специализированную систему вложенных координатных разграфок - ячеек. От самой большой - внешней 400 км до самой малой 50 м. С создание однозначного иерархического номера (названия) ячейки. Там конечный слой 50-метровых ячеек в виде TAB файлов занимал 8Гб, был сгенерирован в виде MIF/MID файлов за 6 часов. Импортирован меньше чем за час. Если бы пришлось "дергать" MAPINFO для добавления каждой вершины, а их было по 3 на каждой стороне квадрата, то это заняло бы неделю в лучшем случае. А "упала" бы она еще раньше.
7. Еще раз предлагаю связаться и обменяться информацией через личное сообщение, а потом через почту. Так как мне кажется для публичного общения тема уже исчерпала свой интерес.
8. С таблицами в MaPinfo бывает много чудес, но телепатически их оценить сложно. Надо посмотреть. Самый простой способ как раз в виде MIF/MID Файлов. В них все становиться проще и очевиднее.
  • 0

---
чтение данного сообщения запрещено служащим МЭР, а равно лицам сотрудничающим с ним по договорам возмездного оказания услуг.
Boris
Гуру
 
Joined: 10 Apr 2006
Location: Москва (на карте)
 
Posts: 3149
Reputation: 129
Статьи: 3
Проекты: 1

Re: Создать проект MapInfo.

Postby Niko » 06 Sep 2008, 19:00

видимо описал задачу не мовсеи корректно :)
пишу в личку.
  • 0

Niko
Новоприбывший
 
Joined: 01 Sep 2008
 
Posts: 5
Reputation: 0


Return to Mapinfo

Who is online

Users browsing this forum: No registered users and 0 guests


(Геокруг)

© GIS-Lab и авторы, 2002-2013. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов (подробнее).