postgis使用,通过(点线面)点,线,面以及范围查询范围内的点位
前置条件:
1、安装了postgresql,并且配置好了postgis插件,使用的数据库连接工具 dbeaver企业版
2、创建带有 geometry 类型的表 ,我这用的 4326 坐标系。
CREATE TABLE public.poll_enterprise_gis_geom (
id bigserial NOT NULL,
ent_id int8 NOT NULL, -- 企业表的id
geom geometry(point, 4326) NULL, -- 企业经纬度
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 '企业地图点位信息';
-- Column comments
COMMENT ON COLUMN public.poll_enterprise_gis_geom.ent_id IS '企业表的id';
COMMENT ON COLUMN public.poll_enterprise_gis_geom.geom IS '企业经纬度';
-- Permissions
ALTER TABLE public.poll_enterprise_gis_geom OWNER TO hmecology;
GRANT ALL ON TABLE public.poll_enterprise_gis_geom TO hmecology;
3、插入数据,请根据实际情况插入需要的数据。
1、根据单个点位和距离范围查询周围的点位
-- 找出距离坐标 (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、根据多个点位连成线查询距离范围查询周围的点位
--找到与指定线段距离不超过 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、根据多个点位连成面,获取面内的点位
根据三个点连成面,获取面内的点位,
注意:需要注意在 ST_AddPoint () 第二个参数方法加上
“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通过连表获取图形内的点:
-- 根据三个点连成面,获取面内的点位,需要注意加上
-- “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