Копирование объектов из слоя в слой

0 голосов
спросил 19 Авг, 05 от Гость (210,080 баллов) в категории Программные продукты Esri
Пожалуйста, помогите разобраться!

Суть проблемы: в хелпе к VB ( ArcObject) ArcGIS 9 есть пример переноса объектов из одного слоя в другой (см. ArcGIS Developer Help > Samples> GeoDatabase> Creating and Converting Data> insert features using an insert cursor).

Данный процесс происходит методом по объектного копирования из слоя в слой, причем эти слои заранее известны (в том числе и путь к ним).

Мне нужно извлечь объекты из известного мне слоя и скопировать его в другой слой, причем, возможно, не все объекты исходного слоя будут принадлежать одному конечному слою.
В какой слой (конечный) копируются объект, на момент запуска программы - неизвестно, это определяется в программе.

Важная деталь! Имя конечного слоя можно узнать лишь из одного из полей самого объекта, который принадлежит начальному слою.

И еще. Есть 2 файла. Первый файл содержит список групп слоев (основных), а второй - содержит список слоёв, принадлежащих этим составным слоям. Добавление составных слоёв и соответствующих слоёв в сами составные слои не вызывает затруднения.

Вопросы в следующем:
1.     Почему каждый раз копируется не один конкретный объект, а все объекты из слоя?
2.     Почему не переносятся поля объекта?
(Если код нужен, то отправлю)

В чем может быть проблема?

Заранее спасибо за помощь!

3 Ответы

0 голосов
ответил 19 Авг, 05 от Tatkis (2,420 баллов)

Ну почему не переносятся поля - сказать сложно...

А вот почему все объекты из слоя копируются... Попробуйте проверить сколько объектов выделено  - если ни одного, то конечно все копируются.

Вы делаете выборку через курсор по определенному признаку?

0 голосов
ответил 23 Авг, 05 от Гость (210,080 баллов)
Есть вопрос о копировании объектов.
При копировании объектов из одного слоя в другой (из pinputlayer в poutputlayer) наблюдается следующая “вещь”. Пусть слой poutputlayer был создан следующим образом:

For zero=0 to pMxDoc.Focusmap.Layercount
Set copylayer = pMxDoc.FocusMap.Layer(zero)
Set pSearchFCursor2 = copylayer.FeatureClass.Search(Nothing, True)
Set pFeature2 = pSearchFCursor2.NextFeature
If pFeature2 Is Nothing Then
Set pOutputLayer = New FeatureLayer
             Set pOutputLayer.FeatureClass = copylayer.FeatureClass
…..
…..
…..
End if
Next

то есть методом отбора слоя copylayer.
Вопрос: почему при копировании объектов в слой pOutputLayer из слоя, например, pInputLayer объекты также копируются и в слой copylayer? В следствии чего на карте происходит наложение объектов друг на друга
     Слой copylayer выбран таким образом специально, этого требует программа.
Слой copylayer в остальном коде программы не используется.
Копирование объектов происходит так, как показано в ArcGIS Developer Help пункт
Samples > Insert features using an insert cursor

Public Sub LoadFeatures(pOutputLayer as iFeatureLayer, pInputLayer as iFeatureLayer)
Dim pInFeatureClass As IFeatureClass
Dim pOutFeatureClass As IFeatureClass
Dim pSearchFeatureCursor As IFeatureCursor
Dim pFeature As IFeature
Dim pInsertFeatureBuffer As IFeatureBuffer
Dim pInsertFeatureCursor As IFeatureCursor
Dim NewFeatureCount As Integer

On Error GoTo ErrorHandler

'Open shapefile where new features will be written to
'For simplicity, sample does not contain code to create a new shapefile
Set pOutFeatureClass = pOutputLayer.FeatureClass

Set pInsertFeatureCursor = pOutFeatureClass.Insert(True)
Set pInsertFeatureBuffer = pOutFeatureClass.CreateFeatureBuffer

'Open shapefile containing the features that will be copied
Set pInFeatureClass = pInputLayer.FeatureClass
If pInFeatureClass Is Nothing Then Exit Sub

'Loop through all the features in InFeatureClass
Set pSearchFeatureCursor = pInFeatureClass.Search(Nothing, True)
Set pFeature = pSearchFeatureCursor.NextFeature
Do While Not pFeature Is Nothing
    'Add the original feature's geometry to the feature buffer
    Set pInsertFeatureBuffer.Shape = pFeature.Shape
    'Add all the original feature's fields to the feature buffer
    AddFields pInsertFeatureBuffer, pFeature
    'Insert the feature into the cursor
    pInsertFeatureCursor.InsertFeature pInsertFeatureBuffer
    NewFeatureCount = NewFeatureCount + 1
    'Flush the feature cursor every 100 features
    'This is safer because you can write code to handle a flush error
    'If you don't flush the feature cursor it will automatically flush but
    'after all of your code executes at which time you have no control
    If NewFeatureCount = 100 Then
      pInsertFeatureCursor.Flu sh
      NewFeatureCount = 0
    End If
    Set pFeature = pSearchFeatureCursor.NextFeature
Loop
pInsertFeatureCursor.Flush 'Flush the cursor one last time

Exit Sub 'Exit to avoid error handler

ErrorHandler:
MsgBox Err.Description
Resume Next
End Sub
0 голосов
ответил 23 Авг, 05 от Alexander1 (32,520 баллов)

Read carefully the description of Search Method from IFeatureClass Interface.

Especially about Recycling parameter of this method: "Non-recycling feature cursors returned from the Search method *MUST* be used when copying features from the cursor into an insert cursor of another class."
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...