postgis使用过牙,通過(點線面)點,線纺铭,面以及范圍查詢范圍內的點位
前置條件:
1寇钉、安裝了postgresql,并且配置好了postgis插件舶赔,使用的數(shù)據(jù)庫連接工具 dbeaver企業(yè)版
2扫倡、創(chuàng)建帶有 geometry 類型的表 ,我這用的 4326 坐標系竟纳。
CREATE TABLE public.poll_enterprise_gis_geom (
id bigserial NOT NULL,
ent_id int8 NOT NULL, -- 企業(yè)表的id
geom geometry(point, 4326) NULL, -- 企業(yè)經緯度
CONSTRAINT poll_enterprise_gis_geom_pk PRIMARY KEY (id)
);
CREATE INDEX poll_enterprise_gis_geom_ent_id_idx ON public.poll_enterprise_gis_geom USING btree (ent_id);
COMMENT ON TABLE public.poll_enterprise_gis_geom IS '企業(yè)地圖點位信息';
-- Column comments
COMMENT ON COLUMN public.poll_enterprise_gis_geom.ent_id IS '企業(yè)表的id';
COMMENT ON COLUMN public.poll_enterprise_gis_geom.geom IS '企業(yè)經緯度';
-- Permissions
ALTER TABLE public.poll_enterprise_gis_geom OWNER TO hmecology;
GRANT ALL ON TABLE public.poll_enterprise_gis_geom TO hmecology;
3撵溃、插入數(shù)據(jù),請根據(jù)實際情況插入需要的數(shù)據(jù)锥累。
1缘挑、根據(jù)單個點位和距離范圍查詢周圍的點位
-- 找出距離坐標 (113.73833333333333, 22.856666666666666) 不超過 500 米的點位
SELECT pegg.*
FROM poll_enterprise_gis_geom pegg
WHERE ST_DWithin(pegg.geom, ST_SetSRID(ST_MakePoint(113.73833333333333, 22.856666666666666), 4326)::geography, 500);
結果:
postgis-1.jpg
2、根據(jù)多個點位連成線查詢距離范圍查詢周圍的點位
--找到與指定線段距離不超過 100 米的點位桶略,
SELECT pegg.*
FROM public.poll_enterprise_gis_geom pegg
WHERE ST_Distance(
ST_SetSRID(pegg.geom, 4326)::geography,
ST_MakeLine(
ARRAY[
ST_SetSRID(ST_MakePoint(113.68055555555556, 22.797777777777778), 4326),
ST_SetSRID(ST_MakePoint(113.671, 22.909961111111112), 4326),
ST_SetSRID(ST_MakePoint(113.87414722222222, 22.903891666666667), 4326)
]
)::geography
) <= 100;
結果:
postgis-2.jpg
3语淘、根據(jù)多個點位連成面,獲取面內的點位
根據(jù)三個點連成面际歼,獲取面內的點位惶翻,
注意:需要注意在 ST_AddPoint () 第二個參數(shù)方法加上
“ST_SetSRID(ST_MakePoint(113.73833333333333, 22.856666666666666), 4326)”
其中的點位是第一個點位。
3.1先在畫出圖形:
SELECT ST_MakePolygon(
ST_AddPoint(
ST_MakeLine(
ARRAY[
ST_SetSRID(ST_MakePoint(113.73833333333333, 22.856666666666666), 4326),
ST_SetSRID(ST_MakePoint(113.71780555555556, 22.818538888888888), 4326),
ST_SetSRID(ST_MakePoint(113.69770833333334, 22.851894444444444), 4326)
]
),
ST_SetSRID(ST_MakePoint(113.73833333333333, 22.856666666666666), 4326)
)
)
結果:
postgis-4.jpg
3.2通過連表獲取圖形內的點:
-- 根據(jù)三個點連成面鹅心,獲取面內的點位吕粗,需要注意加上
-- “ST_SetSRID(ST_MakePoint(113.73833333333333, 22.856666666666666), 4326)”
-- 第一個點位
WITH poly AS (
SELECT ST_MakePolygon(
ST_AddPoint(
ST_MakeLine(
ARRAY[
ST_SetSRID(ST_MakePoint(113.73833333333333, 22.856666666666666), 4326),
ST_SetSRID(ST_MakePoint(113.71780555555556, 22.818538888888888), 4326),
ST_SetSRID(ST_MakePoint(113.69770833333334, 22.851894444444444), 4326)
]
),
ST_SetSRID(ST_MakePoint(113.73833333333333, 22.856666666666666), 4326)
)
) AS geom
)
SELECT pegg.*
FROM poll_enterprise_gis_geom pegg
WHERE ST_Within(ST_Transform(pegg.geom, 4326), (SELECT geom FROM poly))
結果:
postgis-3.jpg