PostGIS: ST_Equals false when ST_Intersection=100% of geometry?
My guess is that you coordinate transformations have introduced tiny rounding errors (see an example below). As there is no way to set the tolerance in ST_Equals, this is causing ST_Equals to return false for some geometries that only differ in the nth decimal place, as the geometries have to be identical in every respect -- see the intersection matrix definition in libgeos. You can check this with a really extreme example,
SELECT ST_Equals(
ST_MakePoint(0,0),
ST_MakePoint(0,0.000000000000000000000000000000000000000000000000000000000001));
which returns false.
If you use ST_SnapToGrid you can impose a given precision, for example, to ten decimal places,
SELECT ST_Equals(
ST_MakePoint(0,0),
ST_SnapToGrid(
ST_MakePoint(0,0.00000000000000000000000000000000000000000000001),
10));
now returns true.
If you were to run,
CREATE table matchdata AS
SELECT a.*
FROM gg2014 a, gg2013 b
WHERE ST_Equals(ST_SnapToGrid(a.g1, 5), ST_SnapToGrid(b.g1, 5));
setting an appropriate tolerance, I suspect your problems would disappear.
Here is a link to a Postgis developer discussion about tolerance which suggests it is less than trivial to implement.
I did a couple of conversions between British National Grid (EPSG:27700) and lat/lon to illustrate the point about rounding precision, taking a point somewhere in London,
SELECT ST_AsText(ST_Transform(ST_SetSrid(ST_MakePoint(525000, 190000),27700),4326));
returns POINT(-0.19680497282746 51.5949871603888)
and reversing this,
SELECT ST_AsText(ST_Transform(ST_SetSrid(ST_MakePoint(-0.19680497282746, 51.5949871603888),4326),27700));
returns POINT(525000.000880007 189999.999516211)
which is off by less than a millimeter, but more than enough to make ST_Equals return false.
Did you run ST_IsValid check on your geometries? If they are invalid, all bets are off. ST_Intersects and the other family of GEOS spatial relationship functions will often just return false because the area is not well-defined from an intersection matrix point of view. The reason doing ST_Buffer probably works is because it's converting your invalid geometries to valid ones. ST_Buffer(...,tinybit) is what is known as a "poor man's try to make my geometry valid" tool.