Usted menciona que la consulta tiene dificultades para el caso de que hay vecinos - esto es debido a que el 'dónde' declaración, que excluye a las observaciones más allá de 1000 unidades de su sistema de coordenadas. En la documentación de st_dwithin estados de los siguientes relativas a distancia: unidades son en los de referencia espacial.
Esto me lleva al segundo punto: 1000 unidades en WGS84 estaría muy lejos. Usted debe usar un sistema de coordenadas proyectadas con st_transform. Para los países Bajos, este sería EPSG 28992.
Para saber los puntos que están dentro de 1000 metros se puede ejecutar la siguiente consulta:
SELECT
postcode, huisnummer, huisletter, huisnummertoevoeging,
ST_X(ST_Transform(geolocatie,28992) :: geometry) as latitude, -- assuming your geometry is in 4326
ST_Y(ST_Transform(geolocatie,28992) :: geometry) as longitude,
ST_Distance(
ST_Transform(geolocatie,28992),
ST_Transform(ST_SetSRID(ST_Point(4.3387478, 51.9808117),4326),28992)) as afstand ,
ST_DWithin(
ST_Transform(geolocatie,28992) ,
ST_Transform(ST_SetSRID(ST_Point(4.3387478, 51.9808117),4326),28992),1000) as within_distance
FROM inspire
ORDER BY afstand
Rendimiento de los sabios, esto puede ser mejorada mediante la adición de una geometría a la mesa en avanzar con el proyecto de la geometría y la adición de un índice.
-- Add the column
ALTER TABLE inspire ADD COLUMN geom_28992 geometry;
-- Set the column
UPDATE inspire SET geom_28992 = st_transform(geom,28992);
-- Create an index
CREATE INDEX idx_geom_28992_inspire ON inspire USING GIST(geom_28992);
Para st_dwithin para trabajar de manera eficiente ambas geometrías necesitan ser indexado: el índice de referencia de la geometría debe estar en una mesa y, con el índice.
-- Reference geom
CREATE TABLE reference_geom AS
SELECT ST_Transform(ST_SetSRID(ST_Point(4.3387478, 51.9808117),4326),28992) geom_28992;
-- Create an index
CREATE INDEX idx_geom_28992_reference_geom ON reference_geom USING GIST(geom_28992);
Por último, se puede ejecutar la consulta
SELECT postcode, huisnummer, huisletter, huisnummertoevoeging,
st_distance(i.geom_28992,g.geom_28992) distance,
true::boolean within_distance
FROM inspire i
INNER JOIN reference_geom g ON st_dwithin(i.geom_28992,g.geom_28992,1000)
UNION ALL
SELECT postcode, huisnummer, huisletter, huisnummertoevoeging,
null AS distance,
false::boolean within_distance
FROM inspire i,reference_geom
WHERE st_dwithin(i.geom_28992,g.geom_28992,1000) = FALSE
Para aplicaciones más interesantes a tener un vistazo más cercano al prójimo problemas en Postgis, por ejemplo aquí y aquí.