I have a few questions about geometry and geography in PostGIS.
I am currently using PostGIS and Postgresql.
Most of my spatial data is from Korea which is basically latitude and longitude.
For testing, I have created two tables with the same latitude and longitude data but different data types, one for geography with SRID 4326 and the other for geometry with SRID 5186.
create table geometry_stores
(
id serial primary key,
location geometry(POINT, 5186) not null
);
create table geography_stores
(
id serial primary key,
location geography(POINT, 4326) not null
);
You can find more details of EPSG 5186 on this link https://epsg.io/5186
Here is a list of question I have got:
PostGIS has this method
ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
is
distance_of_srid
a unit of EPSG? Is there any way I can convert meters (e.g. 1km) todistance_of_srid
with EPSG 5186?I understand that geography calculation measures the distances between points as true paths over a sphere while geometry calculation measures the distances between points as true paths over a Cartesian plane. Then if I give exactly the same distance to the following queries, they are supposed to yield different results or same results? because my understanding is that geometry with SRID 5186 is already projected with distortion of earth, then they should yield the same results?
select * from geography_stores where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 4326), same_distance_meter)
select * from geometry_stores where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), same_distance_degree)
When I calculate distance on the geometry table with the following query, it gives me a degree, not meters. Is there any way I can convert this degree to meters with consideration of distortion of the earth?
select st_distance(location, st_setsrid(st_point(126.970769, 37.555479), 5186)) from geometry_stores where id = 1;
I have tried with this query but got some error of
Only lon/lat coordinate systems are supported in geography. Where: SQL function "st_distancesphere" during inlining
select st_distancesphere(location, st_setsrid(st_point(126.970769, 37.555479), 5186)) from geometry_stores where id = 1;
I have read documents at the PostGIS website and some questions in StackOverflow but still got those three questions. Thank you guys for your help.
------------------------------- UPDATED -----------------------------------------
- The column for my spatial data is geometry(POINT, 5186) so the table definition would be as following. Note that it is not geometry(POINT, 4326) not to convert it to geometry(POINT, 5186) on calculation. Should I store my data in geometry(POINT, 4326) and convert it on calculation?
create table geometry_stores
(
id serial primary key,
location geometry(POINT, 5186) not null
);
- I executed following query and got results as follows:
select st_distance(st_setsrid(st_makepoint(126.808183, 37.463557), 4326)::geography,
st_setsrid(st_makepoint(126.970769, 37.555479), 4326)::geography);
st_distance
--------------
17627.3138509
select st_distance(st_setsrid(st_makepoint(126.808183, 37.463557), 5186)::geometry,
st_setsrid(st_makepoint(126.970769, 37.555479), 5186)::geometry)
st_distance
--------------
0.186772218169622
It seems that the second's query gives me degree while the first one gives me meters. Am I doing something wrong in my query, please?
- For st_within, I populated 3M data in geometry_stores table and the spatial data spread over at least 10km. I executed the following query.
select *
from users
where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), 0.001)
This query gives me 158 rows and geometry viewer displays as per picture below.
Let's execute the same query with distance 1 not 0.0001
select *
from users
where st_dwithin(location, st_setsrid(st_point(126.970769, 37.555479), 5186), 1)
This query gives me 32792923 rows which is all data in the table.
Considering that the spatial data spread over at least 10km, it seems that the st_within query calculates the distance between two geometries with a unit (degeree) of EPSG5186 not meters. Then, I'd like to know if I can convert meters to the unit (degree) of EPSG5186 because I'd like to query with meters, not degree which I don't know how far a unit (degree) of EPSG5186 is.