Reputation: 2315
I'm trying to load a bunch of latitude/longitude pairs into a PostGIS geography type so as to be able to query by location.
In particular I have a table with float latitude and longitude columns and a geography(Point, 4326)
column. I would like to do
update mytable set geography = ???
The documentation appears to suggest that the following should work:
update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' ||
longitude || ')');
It doesn't. I don't know what it's interpreting this point as meaning, but it only allows the longitude to lie between -90 and 90, so it's clearly not a longitude.
So, what do I do?
Upvotes: 35
Views: 29252
Reputation: 43642
Here are some different ways to make geography types:
Convert numeric long
and lat
columns to a geog
geography type:
UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography
Convert a geom
geometry column (SRID=4326) to a geog
geography type using a simple cast:
UPDATE mytable SET geog = geom::geography
Transform a projected geom
geometry column to a geog
geography type:
UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography
Note that the last two examples work on any geometry type. Also, the conversion from geometry to geography is often implicit, and these examples work without ::geography
, however explicit casts are usually a good practice for these things.
Upvotes: 15
Reputation: 1151
To perform exchange between lat and lng you may use:
update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')');
with or without srid.
Upvotes: 5
Reputation: 2315
...sigh. Stupidity on my part. Apparently the correct order is longitude, latitude. I was fooled into thinking that both coordinates had the same range (-180 to 180) so thought something more subtle was going on.
Upvotes: 42