postgis 範圍搜索
CREATE EXTENSION IF NOT EXISTS postgis SCHEMA public ;
ALTER EXTENSION postgis SET SCHEMA pg_catalog;
CREATE TABLE device_geo
(
id BIGSERIAL,
device_num CHARACTER VARYING ,
geo_location GEOMETRY ( Point , 4326 ) ,
record_time TIMESTAMP WITH TIME ZONE,
PRIMARY KEY ( id)
) ;
CREATE INDEX geo_location_idx ON device_geo USING gist ( geo_location) ;
INSERT INTO device_geo
( device_num, geo_location)
VALUES ( 'device1' , ST_GeometryFromText( 'POINT(longitude latitude)' , 4326 ) ) ;
INSERT INTO device_geo ( device_num, geo_location, record_time)
VALUES ( 'device1' , st_GeomFromText( 'point(116 40)' , 4326 ) , current_timestamp ) ;
UPDATE device_geo
SET geo_location= st_GeomFromText( 'point(116 41)' , 4326 )
WHERE device_num = 'device1' ;
SELECT device_num, st_AsText( geo_location)
FROM device_geo;
SELECT device_num, ST_AsGeojson( geo_location)
FROM device_geo;
SELECT * ,
st_distance( ST_GeomFromText( 'POINT(119.383341323 36.8461558610001)' , 4326 ) ::GEOGRAPHY, t. geo_location::GEOGRAPHY, TRUE ) closestdistance,
st_asgeojson( t. geo_location) geo
FROM device_geo t
WHERE ST_DWithin( ST_GeomFromText( 'POINT(119.383341323 36.8461558610001)' , 4326 ) ::GEOGRAPHY, t. geo_location::GEOGRAPHY,
100 ) ;
SELECT * ,
ST_Distance_Sphere( geo_location, ST_GeometryFromText( 'POINT(longitude latitude)' , 4326 ) ) distance
FROM device_geo
ORDER BY geo_location < - > ST_GeometryFromText( 'POINT(longitude latitude)' , 4326 )
LIMIT 10 OFFSET 0 ;