На Delphi под ArcGIS 8.2

0 голосов
спросил 31 Май, 03 от ShedMaster (440 баллов) в категории Программные продукты Esri

При программирование на Delphi под ArcMap не могу получить FeatureClass

Точнее не то чтобы совсем не могу но он рождается какой-то ущербный.

Признак ущербности - не определяется поле содержащее геометрию(shape)

Помогите пожалуйста.

 

 

15 Ответы

0 голосов
ответил 10 Июнь, 03 от ShedMaster (440 баллов)

image Еще одна обнаруженная ошибка:

При создании FeatureClass-а необходимо задать пространственный домен. Так во всяком случае говороит документация. А вот создать его так как описано в примерах не получается:

// Установим пространственный домен.
   XMin:=0;                            YMin:=0;
   XMax:=21474.83645;         YMax:=21474.83645;

   pSR2:=CoUnknownCoordinateSystem.Create As ISpatialReference;     // Создается
   pSR2.Get_Name(N);
   MessageDlg('Name '+n,mtInformation,[mbOk],0);  // Выдает Unknown
   pSR2.Get_Alias(N);
   MessageDlg('Alias '+n,mtInformation,[mbOk],0);  // Ничего не выдает

  try
   pSR2.SetDomain(XMin,XMax,Ymin,YMax);
  except
    MessageDlg('SetDomain '+IntToStr(Result),mtInformation,[mbOk],0);  // Сообщение: SetDomain 0
  end;

try
   pSR2.SetFalseOriginAndUnits(0,0,100000);
  except
    MessageDlg('SetFalseOriginAndUnits '+IntToStr(Result),mtInformation,[mbOk],0); // Сообщение SetFalseOriginAndUnits 0
  end;

Все. Ничего не работает. :(image image image image

 

0 голосов
ответил 10 Июнь, 03 от Andranic (2,620 баллов)

Попробуйте для начала вот этот макрос в VBA в ArcMap:

----------------------------------------------------------------------------------------------------------------------------------------------------

Const AccessGDBFileName = "d:\test.mdb"

Sub CopyVisibleLayersToGDB()
'Процедура копирования видимых слоев текущей карты в персональную базу геоданных

    Dim pDoc As IMxDocument
    Dim pMap As IMap
    Dim pLayer As ILayer
    Dim pFeatureLayer As IFeatureLayer
    Dim pFWS As IFeatureWorkspace
    Dim pWorkspaceFactory As IWorkspaceFactory
    Dim LayerCount As Long
    Dim i As Long
    Dim Res As Long
   
   
    Set pWorkspaceFactory = New AccessWorkspaceFactory
    Set pFWS = pWorkspaceFactory.OpenFromFile(AccessGDBFileName, 0)
   
    Set pDoc = ThisDocument
    Set pMap = pDoc.FocusMap
    LayerCount = pMap.LayerCount
   
    For i = 0 To LayerCount - 1
        Set pLayer = pMap.Layer(i)
        If TypeOf pLayer Is IFeatureLayer Then
            Set pFeatureLayer = pLayer
            If (pFeatureLayer.Visible) Then
                CreateFeatureLayerInGDB pFWS, pFeatureLayer
            End If
        End If
    Next

End Sub

Sub CreateFeatureLayerInGDB(pFWS As IFeatureWorkspace, pFeatureLayer As IFeatureLayer)
'Процедура создания FeatureLayer в базе геоданных и копирования в него первого элемента 'pFeatureLayer

    Const strShapeFieldName As String = "Shape"
    Dim pFields As IFields
    Dim pFieldsEdit As IFieldsEdit
   
    Set pFields = pFeatureLayer.FeatureClass.Fields
    
    Dim pFeatClass As IFeatureClass
    Set pFeatClass = pFWS.CreateFeatureClass(pFeatureLayer.Name, pFields, Nothing, _
                                             Nothing, esriFTSimple, strShapeFieldName, "")
    Dim pNewFeature As IFeature
    Set pNewFeature = pFeatClass.CreateFeature
    Set pNewFeature.Shape = pFeatureLayer.FeatureClass.GetFeature(1).Shape
    pNewFeature.Store

End Sub

----------------------------------------------------------------------------------------------------------------------------------------------------

Данный макрос копирует все видимые слои карты в mdb и создает в каждом скопированном слое по одному элементу (Feature).

0 голосов
ответил 11 Июнь, 03 от ShedMaster (440 баллов)

Код как в общем-то и ожидалось работает превосходно, а что дальше ?

0 голосов
ответил 16 Июнь, 03 от Andranic (2,620 баллов)

Хорошо!

Локализуйте максимально ошибку, и пришлите код и скомпилированный экзешник с пояснениями по почте. Посмотрим в чем дело.

   pSR2:=CoUnknownCoordinateSystem.Create As ISpatialReference;     // Создается
   pSR2.Get_Name(N);
   MessageDlg('Name '+n,mtInformation,[mbOk],0);  // Выдает Unknown

А что по вашему должно выдаваться ?

0 голосов
ответил 04 Июль, 03 от ShedMaster (440 баллов)

Все, вроде работает. Пришлось таки перейти на Delphi5 и работать на ней. Интересно, что исходники 5- версии на седьмой компилируются и выполняются без проблем. А вот создать на Delphi 7 исходник и включить в него библиотеку типов полученную в 5-ой не приводит к работоспособному результату. Delphi 7 что-то меняет в библиотеках типов при компиляции(или проверке). Но времени проверить пока нет.

Спасибо Шахраманьяну Андрею за участие при разрешении данного вопроса.

Кому интересна данная тема - обращайтесь.

Кстати, есть закавыки с доменами при определении экстентов, так что тема закрыта не до конца...<!-- Signature -->

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...