postgis使用,通过(点线面)点,线,面以及范围查询范围内的点位

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容