我正在尝试使用Delphi和GDAL18创建isolines.为此,我使用以下代码:
layer:= OGRCreateLayer( ogr_ds,PAnsiChar(WideStringToString('contour')),nil,ogr.wkbLineString,nil); err:= GDALContourGenerate(band,1,aFixedLevel,layer,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]
解决方法
您可能应该在外部声明之后添加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在其C flat API中使用* char参数AFAIK,因此您可以直接使用PAnsiChar:
layer:= OGRCreateLayer( ogr_ds,'contour',nil);
在Delphi 2009之前,你可以使用指针(aString)来表示这样的参数,而且自从Delphi 2009以来,只需要一个指针(AnsiString(aString))来强制转换一个aString:string值.
你是怎么convert the .h header的?