Добавление IPoint в мультиточку

0 голосов
спросил 23 Янв, 07 от Scok (1,260 баллов) в категории Программные продукты Esri
    Всем привет!
1. Сначала возникла задача передавать между методами, анализировать и, наконец, хранить в БД мультиточку.

2. Далее метод HRESULT AddPoint(IPoint* inPoint,VARIANT* before,VARIANT* after) имея 2 последних параметра необязательными не захотел компилироваться без них (как я понял, необязательные параметры поддерживаются только в VB.Net), а с нулями вылетал в Exception. Это ладно, пришлось учить мат.часть, что привело к знакомству с System::Object *obj = System::Type:Missing;
После подстановки такой чтуковины во 2 и 3 параметры все заработало.image

3. Затем стало понятно, что так как мы привыкли с IPointCollection и IGeometry плюс метод AddPoint(...) не работается - результат не сохраняется в мультиточке. Э-э-х, опять изучение мат.части, но у ArcObject. Оказалось, что и Help читаем сквозь пальцы, а там...
AddPoint(...) "Adds a vertex to a Path, Ring, Polyline, or Polygon; or adds a reference to the input point to a Multipoint, TriangleFan, or TriangleStrip." То есть, в мультиточку только ссылки пишем... Дальше по Чернышевскому: что делать? Пришлось насильно впихивать эту точку:
     System::Object *obj;
     ESRI::ArcGIS::Geometry::IGeometry *ipGeom;
     ESRI::ArcGIS::Geometry::IPointCollection *ipPC;
     ESRI::ArcGIS::Geometry::IPoint *ipP;
     ESRI::ArcGIS::esriSystem::IClone *ipClone;
     
     ipGeom = new ESRI::ArcGIS::Geometry::MultipointClass();
     ipP = new ESRI::ArcGIS::Geometry::PointClass();
     obj = System::Type::Missing;

     // создание точки
     ipPC = (ESRI::ArcGIS::Geometry::IPointCollection*)ipGeom;
     ipP->set_X(10);
     ipP->set_Y(10);
     
     // добавление точки в коллекцию и, соответсвенно, в мультиточку
     ipClone = (ESRI::ArcGIS::esriSystem::IClone*)ipP;
     ipPC->AddPoint((ESRI::ArcGIS::Geometry::IPoint*)(ipClone->Clone()),&obj,&obj);
Так заработало, но...

4. Скорость выполнения программы упала в 2,5!!! раза. Ну, надо нам эдак 1,5 тыс. точек закатать в мультиточку... А клонирование (читай, копирование) просто тормозит не по-детски.

Вот и вопрос, кто-нибудь знает другие способы? Как увеличить производительность создания мультиточки?

1 Ответ

0 голосов
ответил 29 Янв, 07 от bess (800 баллов)
Я с помощью этой процедуры добавлял в табцицу новую мульти точку... Правда это на VB, но может чем-нибудь поможет...

Public Sub CreateNewPointInLayer(pFeatureClass As IFeatureClass, LabelAndCoordinate As String)
    'Добавляем точечный объект в слой

    Dim pFeature As IFeature
    Dim pPointCollection As IPointCollection
    Dim pPoint As IPoint

    Dim pWor As IWorkspace
    Dim pWorEdit As IWorkspaceEdit

    'Разбираем строку
    Dim AboutObject() As String
    AboutObject = Split(LabelAndCoordinate, "@", -1, vbTextCompare)
    'Проверяем количество элементов в массиве (правильное - нечетное)
    If (UBound(AboutObject()) Mod 2) = 1 Then ReDim Preserve AboutObject(UBound(AboutObject) - 1) As String
    If UBound(AboutObject()) < 2 Then Exit Sub
    
    Set pWor = pName.Open
    Set pWorEdit = pWor

    'Начинаем редактировать слой
    pWorEdit.StartEditing True
    pWorEdit.StartEditOperation

        'Создаем новый объект
        Set pFeature = pFeatureClass.CreateFeature
        'Устанавливаем координаты для созданного объекта
        Set pPointCollection = New esriGeometry.Multipoint
        Set pPoint = New esriGeometry.Point
        For i = 1 To UBound(AboutObject()) Step 2
            pPoint.x = CDbl(AboutObject(i))
            pPoint.y = CDbl(AboutObject(i + 1))
            pPointCollection.AddPoint pPoint
        Next i
        'Устанавливаем координаты для объекта
        Set pFeature.Shape = pPointCollection
        'Добавляем метку к объекту
        pFeature.Value(2) = AboutObject(0)
        pFeature.Store

    'Заканчиваем редактирование слоя
    pWorEdit.StopEditOperation
    pWorEdit.StopEditing True

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