postgres postgis 基本使用

postgis 範圍搜索

  • 創建擴展
CREATE EXTENSION IF NOT EXISTS postgis SCHEMA public;
  • 設置給系統的schema
ALTER EXTENSION postgis SET SCHEMA pg_catalog;
  • geo 表
CREATE TABLE device_geo
(
    id           BIGSERIAL,
    device_num   CHARACTER VARYING,
    geo_location GEOMETRY(Point, 4326), -- 84 座標系
    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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章