Как создать шейп-файл ESRI полигона в C ++? - PullRequest
0 голосов
/ 21 мая 2019

Я использую opencv в c ++ для извлечения набора 2D точек из геопространственного изображения. Используя эти точки в качестве вершины, я хочу создать шейп-файл ESRI многоугольника.

Gdal api tutorials (https://gdal.org/1.11/ogr/ogr_apitut.html) имеют только примеры того, как создавать точечные и линейные шейп-файлы. Такие функции, как "OGR_G_AddPoint_2D", не работают для шейп-файла многоугольного типа.

У меня есть функция, которая добавляет одну точку в слой Layer и работает хорошо.

void addPoint(OGRLayerH hLayer, long x, long y, const char *szName){  
    OGRFeatureH hFeature;
    hFeature = OGR_F_Create( OGR_L_GetLayerDefn( hLayer ) );
    OGR_F_SetFieldString( hFeature, OGR_F_GetFieldIndex(hFeature, "Name"), szName );

    OGRGeometryH hPt;
    hPt = OGR_G_CreateGeometry(wkbPoint);
    OGR_G_SetPoint_2D(hPt, 0, x, y);
    OGR_F_SetGeometry( hFeature, hPt );
    OGR_G_DestroyGeometry(hPt);

    if( OGR_L_CreateFeature( hLayer, hFeature ) != OGRERR_NONE ){
       printf( "Failed to create feature in shapefile.\n" );
       exit(1);
    }
    OGR_F_Destroy( hFeature );
};

Пытался изменить его на форму многоугольника. Ошибка не печатается, но шейп-файл не сохраняется.

void addPolygon(OGRLayerH hLayer, double *x, double *y, const char *szName){  
    OGRFeatureH hFeature;
    hFeature = OGR_F_Create( OGR_L_GetLayerDefn( hLayer ) );
    OGR_F_SetFieldString(hFeature, OGR_F_GetFieldIndex(hFeature, "Name"), szName);

    OGRGeometryH hGeo;
    hGeo = OGR_G_CreateGeometry(wkbLineString);

    cout << "Performing for loop" << endl;
    for (int i=0; i < 4; i++){
        OGR_G_SetPoint_2D(hGeo, 0, x[i], y[i]);
    }
    OGR_G_CloseRings(hGeo);
    hGeo = OGR_G_ForceToPolygon(hGeo);

    if( OGR_L_CreateFeature( hLayer, hFeature ) != OGRERR_NONE ){
       printf( "Failed to create feature in shapefile.\n" );
       exit(1);
    }
    OGR_F_Destroy( hFeature );
    return;
};
...