【问题标题】:GDAL in iOS, runtime dll proj4 not available, OGR functions do not workiOS 中的 GDAL,运行时 dll proj4 不可用,OGR 功能不起作用
【发布时间】:2013-05-21 09:03:13
【问题描述】:

我在 iOS 上编译 gdal 有一些问题(gdal 内部使用 proj 进行某些操作)

我正在为 iOS 开发,并且想使用这个库来执行坐标转换,但是有些函数需要 proj dll 并且在运行时我得到这个错误:

ERROR 6: Unable to load PROJ.4 library (libproj.dylib), creation of
OGRCoordinateTransformation failed.
Transformation failed.

我认为 proj dll 应该作为静态库包含,但我找不到如何执行此操作

( 其他问题,仅提一下:我无法访问EPSG 数据库和gcs.csv,因此似乎只有SetGeogCS() 方法可用于设置坐标系,但我不知道我使用了哪些参数应该用来获取“EPSG:3003”坐标系,“Italia fuso ovest”)

CLLocationCoordinate2D transform( char *s_srs, double x, double y)

{
    OGRSpatialReference oSourceSRS, oTargetSRS;
    OGRCoordinateTransformation *poCT;

    /* oSourceSRS.importFromEPSG( atoi(papszArgv[i+1]) );
    //oTargetSRS.importFromEPSG( atoi(papszArgv[i+2]) ); */

    /*
    oSourceSRS.SetWellKnownGeogCS(s_srs);
    */
    oSourceSRS.SetGeogCS( "My geographic coordinate system",
                         "WGS_1984",
                         "My WGS84 Spheroid",
                         SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING,
                         "Greenwich", 0.0,
                         "degree",
                         atof(SRS_UA_DEGREE_CONV) );

    /*
    oTargetSRS.SetWellKnownGeogCS("WGS84");
    */
    oTargetSRS.SetGeogCS( "My geographic coordinate system",
                   "WGS_1984",
                   "My WGS84 Spheroid",
                   SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING,
                   "Greenwich", 0.0,
                   "degree",
                         atof(SRS_UA_DEGREE_CONV) );


    poCT = OGRCreateCoordinateTransformation( &oSourceSRS,
                                             &oTargetSRS );


    if( poCT == NULL || !poCT->Transform( 1, &x, &y ) ) {
        printf( "Transformation failed.\n" );
        return CLLocationCoordinate2DMake(x, y);
    } else {
        return CLLocationCoordinate2DMake(x, y);
    }

}

【问题讨论】:

  • 我正在使用 gdal 1.9.2,因为我没有设法在 iOS 中编译 1.10 版本

标签: ios gdal ogr


【解决方案1】:

您需要先下载并构建适用于 iOS 的 proj4。然后您可以使用 ./configure 标志将 GDAL 指向您的 iOS 版本的 proj4

--with-static-proj4=/path/to/your/libproj

确保路径是包含 proj4 的 include 目录和 lib 目录的父目录。

例如,我在 Mac 上的目录是:

/Users/myUsername/iOS_builds/{device_arch}/iphoneos.platform/iphoneos.7.0.sdk

device arch 可以是 i386、armv7 或 armv7s,具体取决于我要编译的目标。该目录具有“include”和“lib”的子目录,它们又具有用于链接到 GDAL 的 .h 文件和 libproj.a 文件。

我正在开发一个脚本,用于帮助在 github 上构建 GDAL 和相关库。 https://github.com/afarnham/preflight

如果您没有安装 Xcode 5,您可能需要对该脚本中指定的编译器进行一些编辑才能使其工作。此外,一些配置标志可能需要为 GDAL 更新。不过,它应该可以帮助您入门。

【讨论】:

  • 我终于设法编译了...但只有 gdal 的旧版本 1.9.2 无法编译 10.1
【解决方案2】:

根据this的帖子,可以通过添加解决iOS中的问题

export PROJSO=/Library/Frameworks/PROJ.framework/PROJ

到您的.bash_profile。我在 Linux 上遇到了同样的问题,任何建议表示赞赏:)

【讨论】:

  • 这是 OSX ,不是 iOS ;我确实通过对 cfg 文件(参数 extra_cflags -DPROJ_STATIC=1 )进行一些更改并在静态库中编译 proj 源解决了这个问题。
  • 对于我提到的其他问题(未找到 epsg 数据库),我已修复添加此行:setenv("GDAL_DATA", [NSBundle mainBundle].bundlePath.UTF8String, TRUE);
  • xandriksson,也有类似的问题:stackoverflow.com/q/61164590/630169。您找到解决方案了吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
相关资源
最近更新 更多