ST_DWithin takes parameter as degree , not meters , why?

If your geometry is in WGS84, i.e. srid 4326, you can cast the geometries to geography to have the units in meters

SELECT *
FROM theuser
WHERE ST_DWithin(
  point::geography,
  ST_GeomFromText('POINT(120.9982 24.788)',4326)::geography,
  100 -- DISTANCE IN METERS
);

As it referenced here, https://postgis.net/docs/ST_DWithin.html, there are two different signatures for ST_DWithin function.

If anyone wants to use meters directly, the second signature which has a boolean flag will work.

As a JPA example, I'm posting my query below.

    @Query("select f from Facility as f where dwithin(f.address.coordinates, :center, 10000, true) = TRUE")
    List<Facility> findAllByDistance(@Param("center") Point point);

From the docs:

For Geometries: The distance is specified in units defined by the spatial reference system of the geometries.

If your data is in SRID=4326 the distance you are specifying is in degrees.

You either have to use ST_Transform and meter based coordinate system, or one of the two functions: ST_Distance_Sphere (faster, less accurate) or ST_Distance_Spheroid.


I would't recommend you to transform to meters every time you want to use DWithin, by the way if you want meters you need an equal area projection like Albers projection (there are many), why dont you try ST_Buffer(point, degrees) , and see what it does on google earth, make measures and find a number that you like, normally you need predefined ranges, something like very near = 0.00008, near = 0.0005, far = 0.001, really far = 0.01, really really far= 0.1, etc. (all in degrees).

In a previous question you asked for the fastest way, you are in the right direction.