转载地址:https://blog.csdn.net/qq_36588972/article/details/78902195

参考资料:
pgrouting路径导航
https://www.cnblogs.com/nidaye/p/4567761.html
在线转换shp和json格式图形化工具
http://mapshaper.org/
pgsql语法
http://www.yiibai.com/html/postgresql/2013/080556.html
pgsql几何类型的使用
https://www.cnblogs.com/alianbog/p/5657325.html
http://blog.csdn.net/shixiaoguo90/article/details/30034429
pgsql判断点是否在面内
http://blog.sina.com.cn/s/blog_673c98be0101gz8v.html
PostGIS的Geometry数据类型
Geometry可以说是PostGIS最重要的一个概念,是“几何体”的意思,由于PostGIS很
好地遵守OGC的”Simple Feature for Specification for SQL”规范,目前支持的几何体类型包含其实例有WKT格式如下:
POINT(1 1)
MULTIPOINT(1 1, 3 4, -1 3)
LINESTRING(1 1, 2 2, 3 4)
POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))
MULTIPOLYGON((0 0, 0 1, 1 1, 1 0, 0 0), (5 5, 5 6, 6 6, 6 5, 5 5))
MULTILINESTRING((1 1, 2 2, 3 4),(2 2, 3 3, 4 5))
而geometry具体表现又有两种形式,一种叫做WKT(Well Known Text)形式,如上面的
例子。或者使用如下SQL语句浏览:
select AsText(pt) from test1;
另一种叫做“Canonical Form”形式,看上去是一串古怪的数字,其实是一种增强的十六
进制编码,使用如下SQL语句就可以浏览了:
select pt from test1;
EWKT、EWKB和Canonical格式
EWKT和EWKB相比OGC WKT和WKB格式主要的扩展有3DZ、3DM、4D坐标和内嵌空间参考支持。
以下以EWKT语句定义了一些几何对象:
POINT(0 0 0) ——3D点
SRID=32632;POINT(0 0) ——内嵌空间参考的点
POINTM(0 0 0) ——带M值的点
POINT(0 0 0 0) ——带M值的3D点
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) ——内嵌空间参考的带M值的多点
以下语句可以使用EWKT格式插入一个点要素到一个表中:
INSERT INTO table ( SHAPE, NAME )
VALUES ( GeomFromEWKT('SRID=4326;POINTM(116.39 39.9 10)'), '北京' )
Canonical格式是16进制编码的几何对象,直接用SQL语句查询出来的就是这种格式。
postgis3d空间语法以及函数应用:
网上关于postgis的函数有很多,这里简单使用几个我用的到的函数进行测试
在执行几何类型的sql语句的时候一定要注意类型的转换、表空间列的属性或者使用适当的类型,不然执行会报错,下面的sql语句亲测没有任何问题
插入:
insert into SSS(geometryType) values(ST_GeomFromText('POINTZ(116.39 21 39.9)', 4326));
修改:
UPDATE eee SET geometryType = ST_GeomFromText('POINTM(116.39 21 39.9)',4326)
新增:
CREATE TABLE weq (id serial PRIMARY KEY, details VARCHAR(10000), template VARCHAR(255), create_time VARCHAR(255), modeUrl VARCHAR(255), geoJson VARCHAR(255), geometryType geometry(POINTM,4326))
A是否包含B,包含返回t,不包含返回f
SELECT ST_Contains(st_astext(geometrytype),'POINTZ(151 50 30)') FROM videodata
找到 POINT(1000 1000) 100米范围内的查询如下:
SELECT * FROM geotable
WHERE ST_DWithin(geocolumn, ‘POINT(1000 1000)’, 100.0);
查询点在面内,包含返回t,不包含返回f
SELECT ST_Contains(st_astext(ST_MakePolygon(ST_GeomFromText('LINESTRINGZ (0 0 1,0 2 1,2 2 1,2 0 1,0 0 1) '))),'POINTZ(1 1 5)')
或者
SELECT ST_Contains( ST_MakePolygon(ST_GeomFromText(ST_ASTEXT(geometrytype))),st_pointz(0,0,0)) FROM videodata
点是否在面内,包含返回t,不包含返回f
sql语句如下:
select * from tb_data_region_polygon0 where ST_Within(st_geomfromtext('point(114.186684 30.512029)',4326),geom);
select * from tb_data_region_polygon0 where ST_DWithin(st_geomfromtext('point(114.186684 30.512029)',4326),geom,0);
select * from tb_data_region_polygon0 where ST_Covers(geom,st_geomfromtext('point(114.186684 30.512029)',4326));
postgis 中 geomery 使用 ST_distance 计算出来的单位竟然是弧度,不是米,找了一段时间问题,发现是没有使用投影坐标引起的
于是在计算的时候,先将点变成投影坐标,再来计算。
使用ST_Transform(geom, 2346)转换之后就是以米为单位的数据了
结果以米为单位(计算长度):
SELECT ST_Length(ST_Transform(geom, 2346)) FROM ditie
这里的2346中国西安80高丝克里投影的编号,是分带的,使用的中央经线在南京。
加上这个,我们能正确计算出来距离,也是米。
但是如果把应用发到别的城市,比如苏州,就会出现问题,解决方法:
查询ditie表点到每个线的距离,条件是在80000米之内的点
select
(ST_distance(
geom::geography,
ST_GeomFromText('POINT(121 32)', 4326)::geography))
from ditie
where
ST_dwithin(geom::geography,
ST_GeomFromText('POINT(121 32)', 4326)::geography, 80000)
这样把geometry转成geography,转换之后,全球都可以使用了
下面这种办法查出来的结果也是以米为单位的两点间的距离
SELECT ST_Distance(
ST_Transform(ST_GeomFromText('POINT(-87.734087560562 43.770129071141)',4326),26986),
ST_Transform(ST_GeomFromText('POINT(-87.747382933006 43.759234252055)', 4326),26986)
);
在项目中,我们也可以直接把坐标存成 geography格式的,这样就能避免数据转来转去的了:
ST_GeographyFromText('SRID=4326;POINT(-110 30)')
改变表的空间字段srid为4326
update table_name set the_geom = st_geomfromtext(ST_AsText(the_geom),4326)

转载于:https://www.cnblogs.com/telwanggs/p/10556787.html

(转)postgresql+postgis空间数据库使用总结相关推荐

  1. PostgreSql+PostGis创建空间数据库

    目录 一 准备安装包... 1 二 postgresql在window下安装步骤... 1 三 图形化管理工具-pgadmin. 4 四 命令行工具-SQL shell(psql)... 5 五 Po ...

  2. 【空间数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程

    PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询.外键.触发器.视图.事务 ...

  3. 地图的开发研究--基于openlayers+geoserver+tomcat的离线地图--postgis空间数据库

    此节主要介绍以下内容: 1.安装配置postgresql和postgis,升级postgresql为空间数据库,导入.shp格式的地图,转化为空间数据. 2.深入研究geoserver的用法和功能,实 ...

  4. 使用ArcGIS10.2连接PostgreSQL创建空间数据库并进行要素编辑

    记一次使用ArcGIS10.2连接postgresql创建空间数据库并编辑: 刚开始下载了postgres12版本的,使用ArcGIS10.2连接不上,原来ArcGIS10.2只能连接PostgreS ...

  5. windows下GeoscenePro2.1连接postgis空间数据库

    1.postgis空间数据库的安装 a. 什么是空间数据库 PostGIS是一个空间数据库,Oracle Spatial和SQL Server(2008和之后版本)也是空间数据库. 空间数据库像存储和 ...

  6. 如何快速搭建基于PostgreSQL的空间数据库(SDE)

    如何快速搭建基于PostgreSQL的空间数据库(SDE) 1        安装准备 1.1 ArcGIS平台 ArcGIS Desktop 10.5以及ArcGIS Enterprise 10.5 ...

  7. PostgreSql+PostGIS和uDig的安装

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 总体来说,这两款开源软件均是很好安装的,一般按照提示一步一步 ...

  8. PostgreSQL PostGIS 的5种空间距离排序(knn)算法

    摘要: 标签 PostgreSQL , PostGIS , operator , ops , knn 背景 PostgreSQL GiST索引支持排序接口,可以支撑空间.标准.数组.文本向量.文本等类 ...

  9. 安装教程:PostgreSQL + PostGIS + pgAdmin

    ----Picture from <Guide to Maritime Informatics> 安装于2022/3/25,安装于Win10系统,总用时20分钟 安装版本: Postgre ...

最新文章

  1. 《父亲家书》选:给初为人师的儿子
  2. ASP.NET 获取IIS应用程序池的托管管道模式
  3. SAP ECC6.0-中建信息版
  4. ZOOKEEPER安装及测试
  5. mysql list列表批量更新数据,Mybatis传入List实现批量更新的示例代码
  6. 【云端大数据实战】大数据误区、大数据处理步骤分析
  7. mysql超长sql查询_超长SQL怎么查询?MySQL列长度限制有哪些 | 学步园
  8. Android中Log日志的管理之log工具类
  9. 【LeetCode笔记】46. 全排列(Java、DFS回溯、队列)
  10. Windows系统自带WMI应用的查询使用
  11. 计算机英语讲课笔记05
  12. python入门——P37类和对象:面向对象编程
  13. 敏捷开发一千零一问系列之六:业务人员怎样参与开发?
  14. 为什么我十分喜欢C,却很不喜欢C++
  15. Java String、StringBuffer、StringBuilder区别
  16. 网络协议及socket
  17. docker视频教程 百度云网盘
  18. Windows 7硬盘安装工具 NT6 HDD Installer v3.0(含图文教程)
  19. stm32实现红外自发自收
  20. 一键添加QQ群的方式(更新中。。。)

热门文章

  1. 编译器前端概述与可信编译器
  2. (26)FPGA编码器设计(第6天)
  3. FPGA阻塞赋值与非阻塞赋值用法
  4. 信息审计服务器功能,审计服务器是什么意思?如何使用Audit和目录审计
  5. 计算机网络|UDP用户数据报服务
  6. centos中多台主机免密登录_centos免密码使用密钥登录
  7. mysql连接费时_连接mysql和 建索引花费
  8. cdev_alloc和cdev_init
  9. 向shell脚本中传入参数
  10. SpringSecurity的认识和整合流程