使用GDAL和Delphi创建等高线

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),但这并没有帮助。 如果你有任何建议,我会很高兴的。 非常感谢, Mario
[编辑]我发现当我用"nil"代替"layer"(在GDALContourGenerate中)时,出现了同样的错误。所以问题可能出在别的地方。[/编辑]
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;

这取决于dll编译时使用的是stdcall还是其他单词。

至于字符串参数,由于gdal在其C平面API中使用*char参数,因此您可以直接使用PAnsiChar

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

在Delphi 2009之前,你可以使用pointer(aString)作为这些参数的类型,而从Delphi 2009开始,只需要使用pointer(AnsiString(aString))来强制转换aString: string的值。

你是如何转换.h头文件的?


1
非常感谢!我花了很长时间寻找问题,但我没有注意到我忘记了“cdecl”。现在一切都正常工作了! - Mario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接