关于postgis视图中geometry项添加

本文介绍了在PostGIS中无法直接使用AddGeometryColumn为视图和批量插入操作注册geometry字段的情况,并提供了手动注册的方法。文章详细展示了如何通过SQL语句将视图和衍生表中的geometry字段手动添加到geometry_columns表中。

 在视图中,不能使用AddGeometryColumn建立geometry字段,postgis参考中明确指出了:在sql视图和批量插入中这两种情况下,你需要把一个geometry字段注册给一个含geometry字段的表,但是此时不能通过AddGeometryColumn实现( 翻译有点烂)。原文如下:

PostGIS 1.5.1 Manual 写道
Two of the cases where you want a geometry column to be registered in the geometry_columns table, but you can't use AddGeometryColumn, is in the case of SQL Views and bulk inserts. For these cases,
 

),解决办法如下:

PostGIS 1.5.1 Manual 写道
4.3.4. Manually Registering Geometry Columns in geometry_columns

The AddGeometryColumn() approach creates a geometry column and also registers the new column in the geometry_columns table. If your software utilizes geometry_columns, then any geometry columns you need to query by must be registered in this table.
Two of the cases where you want a geometry column to be registered in the geometry_columns table, but you can't use AddGeometryColumn, is in the case of SQL Views and bulk inserts. For these cases, you must register the column in the geometry_columns table manually. Below is a simple script to do that.
 
--Lets say you have a view created like this
CREATE VIEW  public.vwmytablemercator AS
	SELECT gid, ST_Transform(the_geom,3395) As the_geom, f_name
	FROM public.mytable;

--To register this table in AddGeometry columns - do the following
INSERT INTO geometry_columns(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type")
SELECT '', 'public', 'vwmytablemercator', 'the_geom', ST_CoordDim(the_geom), ST_SRID(the_geom), GeometryType(the_geom)
FROM public.vwmytablemercator LIMIT 1;

 
--Lets say you created a derivative table by doing a bulk insert
SELECT poi.gid, poi.the_geom, citybounds.city_name
INTO myschema.myspecialpois
FROM poi INNER JOIN citybounds ON ST_Intersects(citybounds.the_geom, poi.the_geom);

--Create index on new table
CREATE INDEX idx_myschema_myspecialpois_geom_gist
  ON myschema.myspecialpois USING gist(the_geom);

--To manually register this new table's geometry column in geometry_columns
-- we do the same thing as with view
INSERT INTO geometry_columns(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type")
SELECT '', 'myschema', 'myspecialpois', 'the_geom', ST_CoordDim(the_geom), ST_SRID(the_geom), GeometryType(the_geom)
FROM public.myschema.myspecialpois LIMIT 1;

 附原文地址:http://www.postgis.org/documentation/manual-1.5/ch04.html#Manual_Register_Spatial_Column

 

<think>我们正在回答用户关于如何查看PostGIS插件版本的问题。根据引用资料,我们可以总结出几种方法。 引用[3]提到:查看插件的信息,可以使用`select * from pg_available_extensions WHERE name like 'postgis';` 引用[4]提到:安装之后,确认一下使用`SELECT PostGIS_Version();` 因此,我们可以使用以下两种主要方法: 方法一:使用`PostGIS_Version()`函数,这个函数会返回详细的PostGIS版本信息。 方法二:查询系统表`pg_available_extensions`,但注意这个表列出的是可用的扩展(包括已安装和未安装的),如果要查看当前数据库已安装的扩展,应该使用`pg_extension`视图或者使用`\dx`命令(在psql命令行中)。 但是,用户可能是在某个具体的数据库中查询已安装的PostGIS版本,所以我们需要给出在数据库内执行的SQL语句。 步骤: 1. 连接到目标数据库(使用psql或其他客户端) 2. 执行SQL查询 具体方法: 方法1:使用PostGIS提供的函数(推荐) ```sql SELECT PostGIS_Version(); ``` 或者 ```sql SELECT postgis_version(); ``` 注意:函数名大小写不敏感,通常写成小写。 方法2:查看已安装的扩展信息(针对当前数据库) ```sql SELECT extversion FROM pg_extension WHERE extname='postgis'; ``` 这个查询会返回当前数据库中postgis扩展的版本。 注意:可能有多个PostGIS相关的扩展(比如postgis_topology, postgis_tiger_geocoder等),但核心扩展名是'postgis'。 方法3:在psql命令行中使用`\dx`命令,然后查找postgis。 另外,引用[3]还提到查看当前PG库所安装的插件名称:`select name from pg_available_extensions;` 但注意,`pg_available_extensions`是系统视图,显示所有可用的扩展(包括未安装的),而`pg_extension`是当前数据库已安装的扩展。 因此,我们推荐使用第一种方法,因为它直接调用PostGIS函数,返回的信息更详细,而且不需要区分扩展是否已安装(因为如果未安装,这个函数就不存在)。 但是,如果用户还没有在目标数据库中安装PostGIS扩展,那么方法1会报错(函数不存在)。此时,可以检查扩展是否安装(方法2),或者先安装扩展(如引用[4]所述:`CREATE EXTENSION postgis;`)。 所以,完整的步骤建议: 1. 确保已经连接到目标数据库(使用`\c database_name`切换数据库) 2. 检查是否已经安装了PostGIS扩展。如果已经安装,则使用`SELECT PostGIS_Version();`查看版本。 如果用户需要检查所有数据库中的PostGIS版本,可能需要逐个数据库连接并查询。 另外,引用[1]提到查看PostgreSQL版本的方法:`SELECT version();`,但这不是PostGIS的版本。 总结回答: 在PostgreSQL中,查看当前数据库的PostGIS插件版本,可以使用以下两种方法: 方法一(推荐): ```sql SELECT PostGIS_Version(); ``` 这将返回一个字符串,包含PostGIS的版本号以及依赖的GEOS、PROJ等库的版本,例如:“3.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1” 方法二: ```sql SELECT extversion FROM pg_extension WHERE extname = 'postgis'; ``` 这将返回一个版本号,例如“3.1.0”。 注意:方法二只返回扩展的版本号,而方法一返回的详细信息更多。 如果执行上述语句报错(例如函数不存在),则说明当前数据库尚未安装PostGIS扩展。此时,需要先安装PostGIS扩展(使用`CREATE EXTENSION postgis;`),然后再查询。 另外,如果系统中安装了多个PostGIS扩展(如postgis_topology),那么它们可能有各自的版本,但核心的PostGIS扩展名是'postgis'。 最后,用户可能需要知道,PostGIS扩展是安装在每个数据库中的,所以不同的数据库可能有不同的PostGIS版本(如果创建扩展时指定了不同版本,但通常一个实例中只有一种版本可用)。但是,扩展的可用版本由安装的PostGIS软件包决定。 相关问题: 1. 如何在PostgreSQL中安装PostGIS扩展? 2. 如何升级PostGIS扩展的版本? 3. 如何查看PostGIS依赖的GEOS、PROJ等库的版本? 4. 为什么在同一个PostgreSQL实例中,不同数据库的PostGIS版本可能不同? 注意:在回答中,我们引用了引用[3]和引用[4]的内容。</think>### 如何在 PostgreSQL 中查看 PostGIS 插件版本 #### 方法一:使用专用函数(推荐) ```sql -- 查看详细版本信息(包含核心库和依赖库版本) SELECT PostGIS_Version(); -- 示例输出: -- "3.3.2 3.3.2" # 主版本号 + 完整版本标识 -- "GEOS=3.11.1, PROJ=8.2.1" # 依赖库版本[^4] ``` #### 方法二:查询系统目录 ```sql -- 查看已安装扩展版本 SELECT extversion FROM pg_extension WHERE extname = 'postgis'; -- 查看所有可用扩展版本(包括未安装的) SELECT * FROM pg_available_extensions WHERE name = 'postgis';[^3] ``` #### 方法三:命令行操作 ```bash # 登录 PostgreSQL psql -U postgres # 在数据库内执行 \dx postgis # 示例输出: # Name | Version | Schema | Description # ---------+---------+--------+------------------------- # postgis | 3.3.2 | public | PostGIS geometry types... ``` #### 验证安装是否成功 ```sql -- 验证几何函数是否可用 SELECT ST_AsText(ST_MakePoint(0, 0));[^4] -- 预期返回: "POINT(0 0)" ``` #### 注意事 1. **权限要求**:需使用超级用户或具有 `pg_read_all_settings` 权限的账户 2. **数据库级安装**:PostGIS 需在每个数据库单独启用[^5] ```sql -- 在新数据库启用 PostGIS \c new_database CREATE EXTENSION postgis; ``` 3. **版本兼容性**:确保 PostGIS 版本与 PostgreSQL 版本匹配[^1] ```sql -- 检查 PostgreSQL 版本 SELECT version();[^1] ``` #### 常见问题排查 | 问题现象 | 解决方案 | |---------|----------| | 函数 `postgis_version()` 不存在 | 执行 `CREATE EXTENSION postgis;`[^4] | | 查询返回空 | 检查是否在正确数据库执行 `\c your_database` | | 版本信息不完整 | 重新安装 PostGIS 依赖库(GEOS/PROJ)[^2] | > **提示**:升级 PostGIS 后需刷新扩展 > ```sql > ALTER EXTENSION postgis UPDATE; > SELECT postgis_full_version(); > ``` --- ### 相关问题 1. 如何升级 PostgreSQL 中的 PostGIS 扩展版本? 2. PostGIS 安装失败后如何彻底清除残留文件?[^5] 3. 不同 PostgreSQL 数据库能否使用不同版本的 PostGIS 扩展? 4. 如何查看 PostGIS 依赖的 GEOS/PROJ 库的详细版本信息? [^1]: 安装前需确认 PostgreSQL 版本兼容性 [^2]: 推荐从 PostGIS 官网直接下载安装包 [^3]: 通过系统视图查询扩展信息 [^4]: 安装后验证的核心步骤 [^5]: 安装失败需彻底清理配置文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值