PostgreSql 使用postgis 存储地理空间信息操作以及jsonb操作示例

Postgresql 使用postgis 存储地理空间信息操作示例

1.postgresql9.4 版本
2.请先安装postgis和postgis_topology 插件
3.jsonb操作自定义函数,9.4以前不支持jsonb单值更新
4.9.5+以解决加入了|| 和jsonb_set 等操作符和函数

#创建数据库
CREATE DATABASE samtest WITH OWNER = postgres ENCODING = 'UTF8' CONNECTION LIMIT = -1;

#添加启用postgis
-- Extension: postgis
-- DROP EXTENSION postgis;
CREATE EXTENSION postgis;
-- Extension: postgis_topology
-- DROP EXTENSION postgis_topology;
CREATE EXTENSION postgis_topology;

#创建表
-- Table: public.poi_test
-- DROP TABLE public.poi_test;
CREATE TABLE public.poi_test ( id bigserial NOT NULL,--自增加id name character varying(50),--动串 location geometry,--地理信息点格式 extinfo jsonb,--其它信息 createtime timestamp without time zone,--时间戳 PRIMARY KEY (id) ) WITH ( OIDS = FALSE );

ALTER TABLE public.poi_test OWNER to postgres;


#创建geo索引 
CREATE INDEX poi_test_location_index ON public.poi_test USING gist (location);

#创建jsonb索引 
CREATE INDEX public_poi_test_index_extinfo ON public.poi_test USING GIN (extinfo);

#插入表
INSERT INTO public.poi_test ( name,location,extinfo,createtime ) VALUES ( '马泉营B口',GeomFromEWKT('SRID=4326;POINT(116.510431 40.040612)'),'{"type":"地铁"}',current_timestamp);
INSERT INTO public.poi_test ( name,createtime ) VALUES ( '汉堡啤酒餐厅',GeomFromEWKT('SRID=4326;POINT(116.511791 40.040477)'),'{"type":"饭店","ali_type":"餐厅"}',createtime ) VALUES ( '马泉营C口停车场',GeomFromEWKT('SRID=4326;POINT(116.510691 40.039383)'),createtime ) VALUES ( '丽苑小区',GeomFromEWKT('SRID=4326;POINT(116.516844 40.041461)'),'{"type":"小区"}',current_timestamp);

#9.4版以下,需要自定义jsonb更新函数
--start------------------------------------------------------------------------------------
/* * derivative work of Matheus de Oliveira's json_manipulator.sql * https://gist.github.com/matheusoliveira/9488951 * * adapted to support postgresql 9.4 jsonb type * no warranties or guarantees of any kind are implied or offered * * license is as Matheus conferred it on 4/9/2015: * matheusoliveira commented on Apr 9 * @hannes-landeholm,I'd like to take credit if you share them * (a link to this gist is more than enough),but I don't care * much about licensing,consider it public domain,modify and * use as you will. * https://gist.github.com/matheusoliveira/9488951 */
--jsonb插入追加
CREATE OR REPLACE FUNCTION public.jsonb_append(data jsonb,insert_data jsonb) RETURNS jsonb IMMUTABLE LANGUAGE sql AS $$ SELECT json_object_agg(key,value)::jsonb FROM ( SELECT * FROM jsonb_each(data) UNION ALL SELECT * FROM jsonb_each(insert_data) ) t;
$$;
--删除
CREATE OR REPLACE FUNCTION public.jsonb_delete(data jsonb,keys text[]) RETURNS jsonb IMMUTABLE LANGUAGE sql AS $$ SELECT json_object_agg(key,value)::jsonb FROM ( SELECT * FROM jsonb_each(data) WHERE key <> ALL(keys) ) t;
$$;
--合并
CREATE OR REPLACE FUNCTION public.jsonb_merge(data jsonb,merge_data jsonb) RETURNS jsonb IMMUTABLE LANGUAGE sql AS $$ SELECT json_object_agg(key,value)::jsonb FROM ( WITH to_merge AS ( SELECT * FROM jsonb_each(merge_data) ) SELECT * FROM jsonb_each(data) WHERE key NOT IN (SELECT key FROM to_merge) UNION ALL SELECT * FROM to_merge ) t;
$$;
--更新
CREATE OR REPLACE FUNCTION public.jsonb_update(data jsonb,update_data jsonb) RETURNS jsonb IMMUTABLE LANGUAGE sql AS $$ SELECT json_object_agg(key,value)::jsonb FROM ( WITH old_data AS ( SELECT * FROM jsonb_each(data) ),to_update AS ( SELECT * FROM jsonb_each(update_data) WHERE key IN (SELECT key FROM old_data) ) SELECT * FROM old_data WHERE key NOT IN (SELECT key FROM to_update) UNION ALL SELECT * FROM to_update ) t;
$$;

CREATE OR REPLACE FUNCTION public.jsonb_lint(from_json jsonb,ntab integer DEFAULT 0) RETURNS jsonb LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT (CASE substring(from_json::text FROM '(?m)^[\s]*(.)') /* Get first non-whitespace */ WHEN '[' THEN (E'[\n' || (SELECT string_agg(repeat(E'\t',ntab + 1) || jsonb_lint(value,ntab + 1)::text,E',\n') FROM jsonb_array_elements(from_json)) || E'\n' || repeat(E'\t',ntab) || ']') WHEN '{' THEN (E'{\n' || (SELECT string_agg(repeat(E'\t',ntab + 1) || to_json(key)::text || ': ' || jsonb_lint(value,\n') FROM jsonb_each(from_json)) || E'\n' || repeat(E'\t',ntab) || '}') ELSE from_json::text END)::jsonb $$;

CREATE OR REPLACE FUNCTION public.jsonb_unlint(from_json jsonb) RETURNS jsonb LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT (CASE substring(from_json::text FROM '(?m)^[\s]*(.)') /* Get first non-whitespace */ WHEN '[' THEN ('[' || (SELECT string_agg(jsonb_unlint(value)::text,',') FROM jsonb_array_elements(from_json)) || ']') WHEN '{' THEN ('{' || (SELECT string_agg(to_json(key)::text || ':' || jsonb_unlint(value)::text,') FROM jsonb_each(from_json)) || '}') ELSE from_json::text END)::jsonb $$;
--end------------------------------------------------------------------------------------------------------------------------------------
#全量替换更新
update public.poi_test set location=GeomFromEWKT('SRID=4326;POINT(116.510691 40.039383)') where name='马泉营C口停车场';
update public.poi_test set extinfo='{"type":"饭店","ali_type":"餐厅"}'::jsonb where name='汉堡啤酒餐厅';
#字符串替换更新
select replace(extinfo::text,'"type": "饭店"','"type":"饭店111"')::jsonb from public.poi_test ;
update public.poi_test set extinfo=replace(extinfo::text,'"type":"字符串替换更新"')::jsonb where name='汉堡啤酒餐厅';    
#使用自定义函数更新jsonb_update
select jsonb_update('{"type":"饭店","ali_type":"餐厅"}'::jsonb,'{"type":"1111"}'::jsonb);
update public.poi_test set extinfo=jsonb_update(extinfo::jsonb,'{"type":"自定义函数更新1"}'::jsonb) where name='汉堡啤酒餐厅';
update public.poi_test set extinfo='[{"type":"饭店","ali_type":"餐厅"}]'::jsonb where name='汉堡啤酒餐厅';
#jsonb_update
select jsonb_append('{"type":"饭店2","ali_type":"餐厅2"}'::jsonb,'{"aaa":"aaaa"}'::jsonb);
#jsonb_delete
select jsonb_delete('{"type":"饭店2",array['type']);
#jsonb_merge
select jsonb_merge('{"type":"饭店2",'{"aaaa":"合并的"}'::jsonb);



#查询
select *,ST_AsText(location),extinfo::jsonb from public.poi_test where name like '马泉%';
select *,ST_AsText(location) from public.poi_test where name = '丽苑小区';
select *,ST_AsText(location) from public.poi_test where extinfo @>'{"type":"地铁"}';
select *,extinfo->'type' as type from public.poi_test where extinfo @>'{"type":"地铁"}';


#查询500M内的地点,按近远排序 
select *,ST_distance(GeomFromEWKT('SRID=4326;POINT(116.510431 40.040612)'),location) km from public.poi_test where ST_distance(GeomFromEWKT('SRID=4326;POINT(116.510431 40.040612)'),location)<0.005 order by km asc;
select *,location)*1000<5 order by km asc;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果是个PostGreSQL的数据,于是装数据库,但这个也不懂呀,而且本系统用的Oracle,于是得解决迁移转换的问题。 总结下来两个思路。1、PostgresToOracle多金的
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么查看PostgreSQL数据库中所有表”文章能帮助大...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正确。  pg_hba.conf文件在Postgre安装文件目录下的data文件夹中。解决方案1、进入到data目录下,找到pg_hba.conf文件
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本地localhost访问正常,在相同网段的远程机器访问报如下错误
wamp 环境 这个提示就是说你的版本低于10了。 先打印php_info(),查看自己的版本(我这边是已经处理后的,之前的忘记截图了)
psycopg2.OperationalError: SSL SYSCALL error: EOF detected 问题提示:exception psycopg2.OperationalError
项目 postgres 连接不上, 所有连接报错 :psql: FATAL: sorry, too many clients already问题原由程序使用连接未及时释放, 连接一直处于 idle 状态处理方式1、 程序里面未释放的连接, 在使用后及时释放
服务器在同一个数据目录上启动了两个PostgreSQL实例(它已经删除postmaster.pid并使用了新的端口号,因此绕过了这种行为的正常保护措施被绕过),导致PostgreSQL的误操作postgresql 报错 FATAL: the database system is
问题原因:数据库崩溃,内存不足造成 或者 数据已损坏,磁盘故障造成首先介绍一下背景,在测试Deepgreen(Greenplum升级版)数据库时,pgbench并发数设置过多,导致数据库卡死了,在进行连接、重启、关闭时,都报同样
第 11 届 PostgreSQL 中国技术大会于 2022 年 1 月 7 日至 9 日在武汉光谷会展酒店成功举办。作为 PostgreSQL 技术领域的年度盛事,postgreSQL 中文社区旨在搭建开放、合作共享的平台,基于开源,创新驱动,共同探讨数据库行业数字化发展方向和未来新机遇。
即将到来的 PostgreSQL 15 已经确认会增加 MERGE 语句,MERGE 可以在单个语句中实现 INSERT、UPDATE 以及 DELETE 操作。在此之前,我们可以使用 INSERT … ON CONFLICT DO …. 语句代替该功能。
本文介绍了PostgreSQL 访问和操作 MySQL 数据库的外部数据包装器:mysql_fdw。mysql_fdw 提供了读写 MySQL 外部表、连接池、WHERE 条件下推、返回字段下推、预编译语句、JOIN 下推、聚合函数(min、max、sum、avg、count)下推、ORDER BY 下推以及 LIMIT OFFSET 下推等功能。
本文给大家分享了一些 PostgreSQL 实用小技巧。
PostgreSQL 全球开发组于 2021-05-20 发布了 PostgreSQL 14 的第一个 beta 版本。本文介绍了该版本中的主要新特性和增强功能,包括性能、新的 multirange 类型、SQL 语句、管理、复制和恢复、安全以及其他方面。
本文介绍了 PostgreSQL 横向子查询(LATERAL)的语法的作用。SELECT 就像一个循环语句,而 LATERAL 就像是一个嵌套循环语句,对于左侧表中的每行记录执行一次子查询操作。
PostgreSQL 15 增加了大量符合 SQL/JSON 标准的函数,使得 JSON 数据的处理更加简单。
PostgreSQL 支持多个不同级别的灵活加密技术,包括密码加密、字段加密、存储加密、传输加密、认证加密以及应用加密,可以保护数据不因数据库服务器被盗、内部管理员或者不安全的网络传输而导致泄露。
目录1.编译incubator-datasketches-cpp编译datasketches-cpp项目编译datasketches-cpp项目的PythonWrapperforDatasketches2.编译incubator-datasketches-postgresql3.Verifyinginstallationofdatasketches-postgresqlwithatestdatabase4.AdvancedExamplesofdata
连接pg需要指定以下的参数:·主机地址·端口·数据库名·用户·密码 如果没有指定上面的参数的话,pg会从环境变量中寻找以下的变量值:·PGHOST或PGHOSTADDR·PGPORT·PGDATABASE·PGUSER·PGPASSWORD 如果只是指定了前面四个参数,pg会尝试寻找口令文件。
pg库也是常用的数据库之一,有些刚开始接触开发的老师可能不熟,这里简单介绍一下,总体使用方法和mysql类似,所以这里只讲配置方法。这个地方test1是数据库1,test2是数据库2,yml文件一定要主要好格式,建议用properties。MyBaitsSqlSessionFactory配置文件。不同数据源的dao层要放到对应文件夹下。TimedConfig配置文件。文件夹格式,这里直接放贴图。Bd3Config配置文件。下面是数据源的配置文件。