| Обсуждение |
| COM Экспорт в другие форматы [ Жиров Андрей ]Среда, 2 августа 2006, 12:26
В COM интерфейсе есть объект для экспорта GDBMapExporter, но некоторые заявленные в нем функции, например SetWindow
выдают в VB ошибку на этапе компиляции:
Expected Function or variable
вот пример строки выдающей такую ошибку
objMapExporter.SetWindow(0, 0, 40000, 40000, 0)
Возможно ли вообще с помощью COM интерфейса экспортировать данные в другие форматы? |
|
| [ ObjectLand Support ]Среда, 2 августа 2006, 14:18
Проверили в версии 2.6.5 - этот код работает. Возможно Вы используете более старую версию ObjectLand. Мы можем выслать Вам набор vbs-скриптов, которые иллюстрируют работу по экспорту/импорту с разными обменными форматами. |
|
| [ Жиров Андрей ]Среда, 2 августа 2006, 15:12
Был бы признателен за набор скриптов.
У меня версия версия 2.6.4
Версию можно как-то обновить?
Извините случайно создал такую же тему при обновлении страницы. |
|
| [ ObjectLand Support ]Среда, 2 августа 2006, 15:38
Некоммерческую версию 2.6.5 можно скачать с нашего сайта. Коммерческая версия доступна для скачивания с сайта только коммерческим пользователям. Скрипты высылаем. |
|
| [ Жиров Андрей ]Среда, 2 августа 2006, 15:58
К сожалению скрипты пока не пришли. |
|
| [ Жиров Андрей ]Среда, 2 августа 2006, 16:21
|
| [ Жиров Андрей ]Пятница, 4 августа 2006, 16:34
В таком виде:
objMapExporter.SetWindow 0, 0, 40000, 40000, 0
заработало
Еще вопросик, реально ли выгрузить в MIF формат данные из приконнекченых таблиц?
Вроде бы в примере подтягиваются поля таблицы,я подтянул все поля всех линкованных таблиц, но на выходе как было два поля так и осталось
Set aFeatureType = objLayer.FeatureTypes.Item(j)
Set aMapping = objMapExporter.CreateFeatureTypeMapping(aFeatureType)
For k = 1 To aFeatureType.DataLinks.Count
Set aTable = objGDB.Tables(aFeatureType.DataLinks.Item(k).Table.Name)
aMapping.LinkedTable = aTable.Clone
For l = 1 To aTable.Fields.Count
Set aField = aTable.Fields.Item(l)
Set aFieldMapping = aMapping.CreateFieldMapping(aField)
aMapping.FieldMappings.Append aFieldMapping
Next l
Next k
objMapExporter.FeatureTypeMappings.Append aMapping |
|
| [ Максим Юрьевич Трухачёв ]Пятница, 4 августа 2006, 18:11
Андрей, ошибка, которую ты описывал в самом первом сообщении, связана с тем, что ты записал вызов метода как функции (со скобками), а надо было - как в твоём последнем сообщении, без скобок (это соответствует вызову метода как ПРОЦЕДУРЫ). В VB(A) методы могут вызываться двояко - и как процедуры, и как ф-ии. |
|
| [ [ ObjectLand Support ] ]Пятница, 4 августа 2006, 18:25
Выгрузить, конечно, возможность есть. >>на выходе как было два поля так и осталось
Какие два поля? Те же что и в примере? А может там всего одна прилинкованная таблица с двумя полями?
Если я правильно понял Вашу проблему, то смысл такой: FeatureType.DataLinks содержит коллекцию как внутренних таблиц, так и внешних. А на сегодняшний день возможен экспорт только внутренних таблиц ObjectLand.
aFeatureType.DataLinks.Item(k).Table в случае внешней таблицы возвратит null.
P.S. Вместо Set aTable = objGDB.Tables(aFeatureType.DataLinks.Item(k).Table.Name) и aMapping.LinkedTable = aTable.Clone
достаточно сделать так:
Set aTable = aFeatureType.DataLinks.Item(k).Table и aMapping.LinkedTable = аTable
|
|
| [ Жиров Андрей ]Понедельник, 7 августа 2006, 11:56
Два поля - это LayerID Integer и ObjectID Integer
На счет прилинкованных таблиц скрипт выдает:
MDKK System Table
MAPID Integer
GID String
ONT Integer
KN String
MTs String
STATUS Integer
KNID Integer
System Table: LinkKN2Object
gid Integer
Все таблицы находятся внутри базы
aFeatureType.DataLinks.Item(k).Table null не выдает
Ниже привожу скрипт целиком. Проблемные места помечены множественными восклицательными знаками '!!!!!!
Private Sub Main()
Dim objGDBEngine As IGDBEngine ' Ядро ObjectLand.
Dim objGDB As IGDBGeoDatabase ' ГБД.
Dim objMaps As GDBMaps
Dim objMap As GDBMap
Dim objLayers As GDBLayers
Dim objLayer As GDBLayer
Dim objMapExporter As GDBMapExporter
Dim i, j, k, l, aFeatureTypeCount, aLayersCount As Integer
Dim aFilePath, aReportPath As String
Dim rez, X, Y, aHeight, aWidth, anAngle As Integer
Dim aMapping As GDBFeatureTypeMapping
Dim aField As GDBField
Dim aTable As GDBTable
Dim aTables() As GDBTable
Dim aFieldMapping As GDBFieldMapping
Dim GDB_NAME, aGdbPath, aMapName, anExportLayerName, aMIFMapUnits As String
Dim aWindowCenterX, aWindowCenterY, aWindowWidth, aWindowHeight, aWindowAngle As Integer
Dim msg As String
aGdbPath = "D:\Work\EGRZ\SQLBase\vladimir\" 'путь к файлу ГБД
GDB_NAME = "Владимир" ' Имя файла ГБД.
aMapName = "Город" 'Имя карты
aFilePath = "c:\temp\0014\" 'путь для конечных файлов
anExportLayerName = "Земельные участки" 'из этого слоя объекты каждого типа будут экспортироваться в отдельный файл
aMIFMapUnits = "m" 'единицы карты
'окно экспорта
aWindowCenterX = 0
aWindowCenterY = 0
aWindowWidth = 40000
aWindowHeight = 40000
aWindowAngle = 0
' Установка обработчика ошибок.
On Error GoTo PROC_ERROR
Dim strGDBPath As String ' Путь и имя файла ГБД.
' Установка имени и пути к ГБД.
strGDBPath = aGdbPath & GDB_NAME
' Создание ядра ObjectLand.
Set objGDBEngine = New GDBEngine
' Открытие ГБД с именем, определенным переменной strGDBPath,
' и атрибутами "Монопольно", "Чтение/Запись", "Без файла изменений".
Set objGDB = objGDBEngine.OpenGDB(strGDBPath, gdbOpenExclusive Or gdbOpenReadWrite _
Or gdbOpenNoChgFile, "", "", "")
' Вывод результата работы скрипта.
Debug.Print "ГБД успешно открыта."
Set objMaps = objGDB.Maps
Debug.Print objMaps.Count
Set objMap = objMaps.Item(1)
Debug.Print objMap.Name
Set objMapExporter = objGDBEngine.CreateMapExporter(objMap, gdbIeMapFormatMIF, aFilePath)
objMapExporter.MIFExportLayerAsSingleFile = False
objMapExporter.MIFMapUnits = aMIFMapUnits
objMapExporter.SetWindow aWindowCenterX, aWindowCenterY, aWindowWidth, aWindowHeight, aWindowAngle
Set objLayers = objMap.Layers
aLayersCount = objLayers.Count
Debug.Print aLayersCount
For i = 1 To aLayersCount
Set objLayer = objLayers.Item(i)
aFeatureTypeCount = objLayer.FeatureTypes.Count
Debug.Print objLayer.Name & " " & aFeatureTypeCount
If (objLayer.Name = anExportLayerName) Then
For j = 1 To aFeatureTypeCount
Dim aFeatureType As GDBFeatureType
Set aFeatureType = objLayer.FeatureTypes.Item(j)
Set aMapping = objMapExporter.CreateFeatureTypeMapping(aFeatureType)
ReDim aTables(aFeatureType.DataLinks.Count)
For k = 1 To aFeatureType.DataLinks.Count
Debug.Print " " & aFeatureType.DataLinks.Item(k).Table.Name
Set aTables(k) = aFeatureType.DataLinks.Item(k).Table
'!!!!!!!!! Если к следущей строке добавить .Clone то скрипт работает
'без ошибок, но данные из таблиц не экспортируются
'Если оставить как есть, то на этапе экспорта вылетает ошибка
'ошибка: Ошибка средства импорта-экспорта
'причем, если привязанных таблиц нет, то скрипт срабатывает
aMapping.LinkedTable = aTables(k)
For l = 1 To aTables(k).Fields.Count
Debug.Print " " & aTables(k).Fields.Item(l).Name
Debug.Print " " & aTables(k).Fields.Item(l).TypeName
Set aField = aTables(k).Fields.Item(l)
'!!!!!!!! Нужно ли при маппировании полей все-таки указывать все
'необязательные параметры?
Set aFieldMapping = aMapping.CreateFieldMapping(aField, aField.Name)
aMapping.FieldMappings.Append aFieldMapping
Next l
Next k
objMapExporter.FeatureTypeMappings.Append aMapping
objMapExporter.FilePath = aFilePath & aFeatureType.Name & ".mif"
aReportPath = aFilePath & aFeatureType.Name & ".txt"
anInfo objMapExporter
objMapExporter.Export aReportPath
objMapExporter.FeatureTypeMappings.Delete (1)
Next j
End If
Next i
Debug.Print objMapExporter.Check
' Закрытие ГБД.
objGDBEngine.Close
' Освобождение ядра ObjectLand.
Set objGDBEngine = Nothing
' Завершение программы.
Exit Sub
' Выдача сообщения об ошибке.
PROC_ERROR:
MsgBox Err.Description
End Sub
Sub anInfo(objMapExporter)
msg = ""
msg = msg & "Map: " & objMapExporter.Map.Name & Chr(13)
msg = msg & "FilePath: " & objMapExporter.FilePath & Chr(13)
msg = msg & "FileFormat: " & objMapExporter.FileFormat & Chr(13)
msg = msg & "MIFLayerAsSingleFile: " & objMapExporter.MIFExportLayerAsSingleFile & Chr(13)
msg = msg & "MIFMapUnits: " & objMapExporter.MIFMapUnits & Chr(13)
objMapExporter.GetWindow X, Y, w, h, a
msg = msg & "Window: " & X & ", " & Y & ", " & w & ", " & h & ", " & a & ", " & Chr(13)
msg = msg & Chr(13)
msg = msg & "FeatureType Mappings (GeometryType, FeatureType)" & Chr(13)
msg = msg & "--------------------------------------" & Chr(13)
For Each mapping In objMapExporter.FeatureTypeMappings
msg = msg & mapping.Number & " - "
msg = msg & mapping.GeometryType & ", "
msg = msg & mapping.FeatureType.Name
msg = msg & Chr(13)
msg = msg & "Поля данных" & Chr(13)
For Each aFieldMapping In mapping.FieldMappings
msg = msg & "Имя поля " & aFieldMapping.Field.Name & _
" Имя " & aFieldMapping.Name _
& " номер типа " & aFieldMapping.DataType _
& " Длинна " & aFieldMapping.Length _
& " десятчных " & aFieldMapping.DecimalCount _
& Chr(13)
Next
Next
'for each aFieldMapping in objMapExporter.F
MsgBox msg, , "Параметры операции"
End Sub |
|
| [ ObjectLand Support ]Понедельник, 7 августа 2006, 15:40
Спецификация MIF формата накладывает некоторые ограничения на хранение графической информации и связанными с ней данными.
<---
С каждым графическим объектом MIF-файла может быть связана запись MID-файла, содержащая атрибутивную информацию об этом объекте. Эту запись можно использовать для экспорта значений полей таблицы, связанной с объектами данного типа. Если тип объектов связан с несколькими таблицами, то при экспорте придется выбрать только одну из них.
---> (Справка ГИС ObjectLand\Импорт и экспорт данных)
>>Нужно ли при маппировании полей все-таки указывать все необязательные параметры?
Необязательные параметры можно и не указывать. Но есть необходимые параметры, например, длина строкового типа поля, которую Вы не указываете. |
|
| [ Жиров Андрей ]Вторник, 8 августа 2006, 12:03
Выяснилась следующая вещь:
при мапировании полей
Set aFieldMapping = aMapping.CreateFieldMapping(aField, aField.Name, aMaxFieldLength, aPrecision)
нельзя указывать третий параметр больще чем двадцать
т.е я не могу экспортировать строковые поля длинней чем 20 символов - экспортер при этом отказывается делать экспорт
Чем обусловлено данное ограничение? |
|
| [ ObjectLand Support ]Вторник, 8 августа 2006, 12:48
Вы, наверное, перепутали. Не строковые поля, а целочисленные или вещественные. Количество позиций в символьном представлении значения для строковых полей ограничивается 254мя, а вот для целочисленных или вещественных действительно двадцатью символами. |
|
| [ Жиров Андрей ]Вторник, 8 августа 2006, 13:40
Спасибо за помошь. Вы правы.
Похоже теперь с экспортом разобрался. |
|
| [ Константин ]Четверг, 28 сентября 2006, 15:21
Решаю задачку для экспорта объектов из множества баз. Можно получить набор vbs-скриптов, которые иллюстрируют работу по экспорту? |
|
| [ Константин ]Четверг, 28 сентября 2006, 15:44
Пытаюсь создать объект для экспорта и получаю ошибку:
GDB открыта
Method 'CreateMapExporter' of object 'IGDBEngine' failed
С чем может быть связано?
P.S. For Each objGDBMap In objGDB.Maps
Set objMapExporter =ojGDBEngine.CreateMapExporter(objGDBMap, gdbIeMapFormatMIF, "E:\") |
|
| [ ObjectLand Support ]Четверг, 28 сентября 2006, 15:45
|
| [ Константин ]Четверг, 28 сентября 2006, 15:45
С пред. проблемой разобрался |
|
| [ Константин ]Четверг, 28 сентября 2006, 15:46
|
| [ Юрий ]Вторник, 4 сентября 2007, 16:48
Господа, у нас официальная версия 2.6.6
(МУП "ГЦКиГ", г.Ростов-на-Дону).
Можете ли выслать vbs-скрипты, которые иллюстрируют работу по экспорту/импорту с форматом MID-MIF?
И еще: Что нужно, чтобы эта штука заработала с DELPHI-6? |
|
| [ Objectland Support ]Вторник, 4 сентября 2007, 17:15
|
| [ Николай ]Пятница, 7 сентября 2007, 10:43
Примеры получили все чудно работает.
Где найти доку по этому MapExporter
или подскажите пожайлуста где подрихтовать код (фрагмент ниже) чтобы экспортировались все записи таблицы связанные с графикой а не первая...
Спасибо.
Set map = gdb.Maps("Земельные участки на карте М:1:2000")
Set exporter = engine.CreateMapExporter(map, gdbIeMapFormatMIF, filePath)
exporter.MIFExportLayerAsSingleFile = false
exporter.MIFMapUnits = "m"
Set featureType = map.Layers("Земельные участки").FeatureTypes("Аренда")
Set mapping = exporter.CreateFeatureTypeMapping(featureType)
Set table = gdb.Tables("Межевание земель")
mapping.LinkedTable = table
mapping.FieldMappings.Append mapping.CreateFieldMapping(table.Fields("КН 61:44:0"), "kn", 15)
mapping.FieldMappings.Append mapping.CreateFieldMapping(table.Fields("Номер межевания (формирования)"), "ndel", 10)
exporter.FeatureTypeMappings.Append mapping
exporter.Export reportPath |
|
| [ Objectland Support ]Пятница, 7 сентября 2007, 14:46
Для экспорта всех записей таблиц, связанных с экспортируемыми объектами, необходимо установить свойство ExportAllLinkedRecords объекта mapping в true (до его добавления в коллекцию exporter.FeatureTypeMappings): ... mapping.ExportAllLinkedRecords = true ... exporter.FeatureTypeMappings.Append mapping ... Для экспорта первой найденной присоединенной записи устанавливайте mapping.ExportAllLinkedRecords в false. |
|
| Нужна документация по интерфейсам import-export [ Максим Юрьевич Трухачёв ]Пятница, 7 сентября 2007, 21:05
Уважаемые разработчики, выложите, пожалуйста, временно где-нибудь (например, в разделе "ссылки") ПОЛНУЮ документацию по COM-интерфейсам импорта-экспорта хотя бы в "сыром" (текстовом, не html) виде, потому что примеры кода (которые вам приходится каждый раз высылать по почте) не могут в принципе охватить всё многообразие вариантов использования этих интерфейсов.
Заранее спасибо. |
|
| COM Экспорт в другие форматы [ Николай ]Понедельник, 10 сентября 2007, 10:29
Спасибо работает вроде то что нужно. И присоединяюсь к просьбе насчет документации. |
|
| [ Objectland Support ]Понедельник, 10 сентября 2007, 14:06
Документация будет доступна в ближайшее время. |
|
ОтветитьЗнаком «*» отмечены обязательные для заполнения поля. |
| |