From 6f19b2fd55b50f01d12d2e55e7ad8bffbb7ee592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Poulhi=C3=A8s?= Date: Wed, 10 Nov 2010 14:06:29 +0100 Subject: [PATCH] half-broken commit. Extension for ossim writen in C++: more or less working. SegFault in the init function of ossim application setup.py: takes care of compiling the extensions correctly --- setup.py | 11 ++++ src/ossimmodule.cpp | 145 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 setup.py create mode 100644 src/ossimmodule.cpp diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..d2f9a86 --- /dev/null +++ b/setup.py @@ -0,0 +1,11 @@ +from distutils.core import setup, Extension + +module1 = Extension('ossim', + sources = ['src/ossimmodule.cpp'], + libraries = ['ossim'], + ) + +setup (name = 'Ossim Height', + version = '1.0', + description = 'This is a demo package', + ext_modules = [module1]) diff --git a/src/ossimmodule.cpp b/src/ossimmodule.cpp new file mode 100644 index 0000000..ebc50d0 --- /dev/null +++ b/src/ossimmodule.cpp @@ -0,0 +1,145 @@ +#include +#include +#include +#include +#include +#include + +#include +#include + + +// ripped from ossim-height +// FIXME: add correct headers (licence & friends) +static void f(void){ + + char *argv[] = {"ossim-height", "-h"}; + + //"-P", "/tmp/toto", "3.3", "3.3"}; + int argc = sizeof(argv); + + ossimArgumentParser argumentParser(&argc, argv); + + ossimInit::instance()->addOptions(argumentParser); + + ossimInit::instance()->initialize(argumentParser); + + argumentParser.getApplicationUsage()->setApplicationName( + argumentParser.getApplicationName()); + + argumentParser.getApplicationUsage()->setDescription( + argumentParser.getApplicationName()+ + " Returns a MSL and ellipoid height given a lat lon position"); + + argumentParser.getApplicationUsage()->addCommandLineOption( + "-h or --help", "Shows help"); + + argumentParser.getApplicationUsage()->setCommandLineUsage( + argumentParser.getApplicationName()+ + " "); + + + if(argumentParser.read("-h") || argumentParser.read("--help")|| + (argc != 3)) + { + argumentParser.getApplicationUsage()->write(std::cout); + exit(0); + } + + if (argumentParser.errors()) + { + argumentParser.writeErrorMessages(std::cout); + exit(1); + } + + ossimGpt gpt; + gpt.latd(ossimString(argumentParser.argv()[1]).toDouble()); + gpt.lond(ossimString(argumentParser.argv()[2]).toDouble()); + + ossim_float64 hgtAboveMsl = ossimElevManager::instance()-> + getHeightAboveMSL(gpt); + ossim_float64 hgtAboveEllipsoid = ossimElevManager::instance()-> + getHeightAboveEllipsoid(gpt); + ossim_float64 geoidOffset = ossimGeoidManager::instance()->offsetFromEllipsoid(gpt); + ossim_float64 mslOffset = 0.0; + + if(ossim::isnan(hgtAboveEllipsoid)||ossim::isnan(hgtAboveMsl)) + { + mslOffset = ossim::nan(); + } + else + { + mslOffset = hgtAboveEllipsoid - hgtAboveMsl; + } +#if 1 /* Tmp until this functionality is added back. */ + std::vector cellList; + ossimElevManager::instance()->getOpenCellList(cellList); + + if (!cellList.empty()) + { + std::cout << "Opened cell: " << cellList[0] << std::endl; + } + else + { + std::cout << "Did not find cell for point!" << std::endl; + } +#endif + + std::cout << "MSL to ellipsoid delta: "; + if (!ossim::isnan(mslOffset)) + { + std::cout << std::setprecision(15) << mslOffset; + } + else + { + std::cout << "nan"; + } + std::cout << "\nHeight above MSL: "; + if (!ossim::isnan(hgtAboveMsl)) + { + std::cout << std::setprecision(15) << hgtAboveMsl; + } + else + { + std::cout << "nan"; + } + std::cout << "\nHeight above ellipsoid: "; + if (!ossim::isnan(hgtAboveEllipsoid)) + { + std::cout << std::setprecision(15) << hgtAboveEllipsoid << std::endl; + } + else + { + std::cout << "nan" << std::endl; + } + std::cout << "Geoid value: "; + if (!ossim::isnan(geoidOffset)) + { + std::cout << std::setprecision(15) << geoidOffset << std::endl; + } + else + { + std::cout << "nan" << std::endl; + } +} + + +static PyObject * +ossim_height(PyObject *self, PyObject *args) +{ + f(); + return Py_BuildValue("i", 0); +} + + +static PyMethodDef OssimMethods[] = { + {"height", ossim_height, METH_VARARGS, + "Give the height of a given point."}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +PyMODINIT_FUNC +initossim(void) +{ + (void) Py_InitModule("ossim", OssimMethods); +}