﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
13788	GEOSGeometry.transform() silently no-ops when GDAL isn't available or srid is None	Robert Coup	Robert Coup	"`GEOSGeometry.transform()` uses the GDAL library to re-project geometries. If GDAL is not available however, it silently does nothing.

Geodjango-Users discussion thread: http://groups.google.com/group/geodjango/browse_thread/thread/788cafdbd592d617

Current behaviour if GDAL is unavailable:
 * `.transform(clone=False)` (the default) does nothing
 * `.transform(clone=True)` returns `None`

Also related:
 * `.transform(clone=False)` (the default) called on a geometry where `.srid` is `None` does nothing
 * `.transform(clone=True)` called on a geometry where `.srid` is `None` returns `None`

Since `transform(clone=False)` (the default) mutates the geometry, it should raise an exception if it can't do what the caller asked.

The attached patch:
 * short-circuits re-projection if the source and destination SRIDs match
 * makes `.transform()` raise a GEOSGeometry.Error if GDAL isn't available
 * adds tests around the new behaviour
 * adds a `FutureWarning` if the srid of the geometry is `None` or <0, pointing out that in 1.5 the behaviour will change an error will be raised.
 * adds some docs, including notes to the backwards-incompatibilities for 1.3

The backwards incompatible behaviour change is being introduced because:
 * `.transform()` no-op'ing if source & destination SRIDs don't match is NOT what the caller wants - it is in all cases a bug.
 * It's unlikely the user was manually checking either the return value (`clone=True`) or the geometry's srid (`clone=False`) and raising their own exception, the more common case would be to assert on `HAS_GDAL`.
"		closed	GIS	dev		fixed	transform geos gdal	jbronn	Accepted	1	0	0	0	0	0
