| 1 | GEOS 3.4 Requirements and Improvements |
| 2 | ------------------------------------------------------------------------------- |
| 3 | |
| 4 | Maximum Version, Minimum Version, Packaging and Linking, Oh My ! |
| 5 | |
| 6 | The GEOS library and C interface are designed in such a way that a client can |
| 7 | link to a generic C Interface lib (libgeos_c), which then calls a second generic library |
| 8 | linked by name (libgeos), then finally the actual current version of libgeos. |
| 9 | With this setup, multiple versions of GEOS can easily sit side by side. PostGIS |
| 10 | uses this convention to link to GEOS. |
| 11 | |
| 12 | strk> PostGIS links against the geos_c library, which have had |
| 13 | the _same_ SONAME since the very beginning |
| 14 | |
| 15 | When does it make sense to declare a MINIMUM version ? |
| 16 | when entry points are called that are only present in newer versions and above |
| 17 | |
| 18 | When does it make sense to declare a MAXIMUM version ? |
| 19 | when behavior changes in an incompatible way in a new version, either API |
| 20 | breakage or perhaps the results of a common operation like noding |
| 21 | |
| 22 | Minimum Version |
| 23 | For a long while, features and fixes were just added to the newest GEOS, so |
| 24 | any client app would just get the newest available GEOS and all is well. |
| 25 | |
| 26 | However, to take advantage of new functionality, clients have to call |
| 27 | entry points explicitly. So a *minimum* version has to be declared. |
| 28 | |
| 29 | With PostGIS 2.1, if new GEOS functionality is required, then the |
| 30 | *minimum* version might be 3.4. |
| 31 | |
| 32 | Maximum Version |
| 33 | With GEOS 3.4, there is a change in noding algorithm, which could have |
| 34 | an effect on output. So a client app's results may be different by upgrading to |
| 35 | GEOS 3.4. This change may be undesirable, so a *maximum* version could be declared, |
| 36 | saying in effect, if you want the same reliable output, you must not go above v3.3x. |
| 37 | |
| 38 | |
| 39 | Packaging -- IANAP (I am not a packager ;-) |
| 40 | |
| 41 | / -> GDAL -> PostGIS |
| 42 | GEOS-> | -> PostGIS |
| 43 | \ -> QGis |
| 44 | |
| 45 | GDAL is unique in that it is designed to be an extensible collection of drivers. |
| 46 | Since the tools are command line oriented and open source, I suspect a substantial |
| 47 | number of GDAL installs are built from source. |
| 48 | |
| 49 | Not so with PostGIS. I suspect that the vast majority of PostGIS installs are by |
| 50 | official installers and packages *only*. |
| 51 | |
| 52 | PostGIS now requires GDAL (for raster). What collection of GDAL drivers are included |
| 53 | by an installer or package of PostGIS that provides GDAL ? and what GEOS version? |
| 54 | Opinions vary on this situation. User surveys and use case based testing are one |
| 55 | option to understand field experience by users. |
| 56 | |
| 57 | |
| 58 | |
| 59 | Misc Background |
| 60 | |
| 61 | GDAL |
| 62 | GDAL is a suite of tools, including gdal raster tools, and ogr vector tools |
| 63 | long ago GEOS was optional to build GDAL, and was used only in ogr vector tools |
| 64 | in practice, ogr tools have required GEOS for some time (years) |
| 65 | |
| 66 | gdal the raster tool now uses GEOS in one place, quoting from #gdal |
| 67 | |
| 68 | EvenR> alg/gdalcutline.cpp needs GEOS for blend distance support |
| 69 | |
| 70 | QGis 2.0 |
| 71 | is coming out very soon. If there was a time to make a change, this is a good time |
| 72 | to do that |
| 73 | |
| 74 | Linkage |
| 75 | |
| 76 | For example on a work XUbuntu Linux machine, I get the following output: |
| 77 | |
| 78 | $ldd /usr/lib/postgresql/9.2/lib/postgis-2.0.so | grep geos |
| 79 | libgeos_c.so.1 => /usr/local/lib/libgeos_c.so.1 (0x00007f73b246c000) |
| 80 | libgeos-3.3.9dev.so => /usr/local/lib/libgeos-3.3.9dev.so (0x00007f73b1569000) |
| 81 | |
| 82 | $ldd `which qgis` | grep geos |
| 83 | .... error output about gdal .so versioning |
| 84 | libgeos_c.so.1 => /usr/local/lib/libgeos_c.so.1 (0x00007fd19145d000) |
| 85 | libgeos-3.3.9dev.so => /usr/local/lib/libgeos-3.3.9dev.so (0x00007fd18da38000) |
| 86 | |
| 87 | $ldd `which ogrinfo` | grep geos |
| 88 | libgeos_c.so.1 => /usr/local/lib/libgeos_c.so.1 (0x00007fd19145d000) |
| 89 | libgeos-3.3.9dev.so => /usr/local/lib/libgeos-3.3.9dev.so (0x00007fd18da38000) |
| 90 | |
| 91 | $ldd `which gdalinfo` | grep geos |
| 92 | libgeos_c.so.1 => /usr/local/lib/libgeos_c.so.1 (0x00007f0d60454000) |
| 93 | libgeos-3.3.9dev.so => /usr/local/lib/libgeos-3.3.9dev.so (0x00007f0d5ca2f000) |
| 94 | |
| 95 | actual libgeos, has naming like this.. |
| 96 | |
| 97 | libgeos.so -> libgeos-3.3.9dev.so |
| 98 | |
| 99 | |
| 100 | My own geos libs on XUbuntu at the moment: |
| 101 | |
| 102 | dbb@xps-8300:~$ ls -l /usr/local/lib/*geos* |
| 103 | -rwxr-xr-x 1 root root 18178990 Oct 1 2012 /usr/local/lib/libgeos-3.3.6dev.so |
| 104 | -rwxr-xr-x 1 root root 18199357 Jan 22 12:07 /usr/local/lib/libgeos-3.3.7.so |
| 105 | -rwxr-xr-x 1 root root 18183679 Mar 8 10:58 /usr/local/lib/libgeos-3.3.9dev.so |
| 106 | -rw-r--r-- 1 root root 49492572 Mar 8 10:58 /usr/local/lib/libgeos.a |
| 107 | -rw-r--r-- 1 root root 2194792 Mar 8 10:58 /usr/local/lib/libgeos_c.a |
| 108 | -rwxr-xr-x 1 root root 979 Mar 8 10:58 /usr/local/lib/libgeos_c.la |
| 109 | lrwxrwxrwx 1 root root 18 Mar 8 10:58 /usr/local/lib/libgeos_c.so -> libgeos_c.so.1.7.9 |
| 110 | lrwxrwxrwx 1 root root 18 Mar 8 10:58 /usr/local/lib/libgeos_c.so.1 -> libgeos_c.so.1.7.9 |
| 111 | -rwxr-xr-x 1 root root 1030668 Oct 1 2012 /usr/local/lib/libgeos_c.so.1.7.6 |
| 112 | -rwxr-xr-x 1 root root 1030668 Jan 22 12:07 /usr/local/lib/libgeos_c.so.1.7.7 |
| 113 | -rwxr-xr-x 1 root root 1029963 Mar 8 10:58 /usr/local/lib/libgeos_c.so.1.7.9 |
| 114 | -rwxr-xr-x 1 root root 956 Mar 8 10:58 /usr/local/lib/libgeos.la |
| 115 | lrwxrwxrwx 1 root root 19 Mar 8 10:58 /usr/local/lib/libgeos.so -> libgeos-3.3.9dev.so |