5

我正在尝试使用 Delphi 和 GDAL18 创建等值线。为此,我使用以下代码:

layer:= OGRCreateLayer( ogr_ds, PAnsiChar(WideStringToString('contour')), nil, ogr.wkbLineString, nil);
err:= GDALContourGenerate(band, 1, 0, 0, aFixedLevel, 0, 0, layer, 0, 1, nil, nil);

GDALContourGenerate 命令返回“不支持的几何类型” - 错误。

我通过以下方式包含了 gdal18.dll:

function GDALContourGenerate(srcBand: TGDALRasterBandH; contourInterval: double;
                       contourBase: double; fixedLevelCount: longint; fixedLevel: TDoubleArray2;
                       useNoData: longint; noDataValue: double;
                       layer: TOGRLayerH; idField: longint; elevField: longint;
                       pfnProgress: TGDALProgressFunc; pProgressArg : POINTER): TOGRErr; external External_Lib name 'GDALContourGenerate';

我也尝试过其他几何类型(例如 wkbLineString25D),但这并没有帮助。如果您有任何建议,我会很高兴。非常感谢,马里奥

[编辑]我发现当我用“nil”重播“layer”(在 GDALContourGenerate 中)时会发生同样的错误。所以也许问题出在其他地方。[/edit]

4

1 回答 1

4

您可能应该cdecl在外部声明之后添加,这样(名称与 Delphi 中的函数声明匹配,因此可以忽略):

function GDALContourGenerate(srcBand: TGDALRasterBandH; contourInterval: double;
                       contourBase: double; fixedLevelCount: longint; fixedLevel: TDoubleArray2;
                       useNoData: longint; noDataValue: double;
                       layer: TOGRLayerH; idField: longint; elevField: longint;
                       pfnProgress: TGDALProgressFunc; pProgressArg : POINTER): TOGRErr; 
cdecl; external External_Lib;

或者这个stdcall词取决于 dll 的编译方式。

而对于字符串参数,由于 gdal*char在其 C flat API 中使用参数 AFAIK,您可以PAnsiChar直接使用 a,如下所示:

      layer:= OGRCreateLayer( ogr_ds, 'contour', nil, ogr.wkbLineString, nil);

在Delphi 2009 之前,您可以使用pointer(aString)for 这样的参数,而从Delphi 2009 开始,只需一个pointer(AnsiString(aString))类型转换一个aString: string值。

你是如何转换 .h 标头的

于 2011-05-30T17:00:58.803 回答