[postgis-devel] geohash is a strange beast

Nicklas Avén nicklas.aven at jordogskog.no
Wed Feb 24 13:07:26 PST 2016

```Sorry for the noise.

I realize everything of course is as it should.
Geohash only have 5 bit steps.

One box can only be divided in 32 smaller boxes, not just 2 as I
thought.

I found my brain at home.

/Nicklas

On Wed, 2016-02-24 at 14:54 +0100, Nicklas Avén wrote:
> Hello
>
> First I thought that this was a bug in PostGIS.
> But now I am not sure. It is likely just a smelling brain fart.
>
> First what made me start thinking:
>
> The query:
> SELECT ST_Box2dFromGeoHash('0');
>
> I expect to get the western half of the world back like :
> "BOX(-180 -90,0 90)"
>
> from my understanding after reading for instance this post:
> http://www.bigfastblog.com/geohash-intro
>
> But it doesn't. It returns:
> "BOX(-180 -90,-135 -45)"
>
> The reason is that geohash is coded with base32
>
> So the function have no way to understand if we on bit level mean 0 or
> 00 or 000 or 0000 or 00000
>
> The way the function is written it iterates all 5 bit-positions and if
> there is a 0 it divides the eastern and southern part.
> lon goes through those divisions
> starts with -180 to 180
> -180 to 0
> -180 to -90
> -180 to -135
>
> and lat through
> -90 to 90
> -90 to 0
> -90 to -45
>
> 3 rounds for lon and 2 for lat.
>
> That is what the 5 bits in the base32 representation of 0 does.
>
> Worst is that I guess this happens on all geohashes that ends with 0.
> How to know how many bits to use?
>
> And in the PostGIS case I have a question about if we are doing this
> right.
>
> We are assuming the maximum precision from the inputed 0
> Is it not more right to assume the worst precision?
>
> I hope I am totally wrong in all this or geohash is far from that usable
> that I thought.
>
> Did I forget my brain at home today?
>
> Best Regards
>
> Nicklas Avén
>
>
> _______________________________________________
> postgis-devel mailing list
> postgis-devel at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/postgis-devel
>

```