如何在PostGIS中筛选含Point几何类型的表?能否用SQL实现?
当然可以!在PostGIS里完全能用SQL查询出所有包含Point几何类型的表,分两种常见场景给你具体方案:
1. 查询几何列定义为Point类型的表
如果你的表的几何列是明确声明为POINT类型(而非通用的GEOMETRY类型),直接查询geometry_columns视图就能搞定——这个视图本身就存储了所有空间列的元数据:
SELECT DISTINCT f_table_schema AS schema_name, f_table_name AS table_name FROM geometry_columns WHERE type = 'POINT';
这里用DISTINCT是为了避免同一个表因为有多个Point列而被重复返回,结果会清晰给出模式名和表名。
2. 查询几何列是通用GEOMETRY类型但实际包含Point数据的表
如果你的几何列定义的是通用GEOMETRY,但里面混合了Point、LineString等多种类型,想要找出那些至少有一条Point记录的表,就需要检查实际数据了。这种情况可以写个简单的PL/pgSQL函数来实现:
CREATE OR REPLACE FUNCTION find_tables_with_point_geoms() RETURNS TABLE(schema_name text, table_name text) AS $$ DECLARE rec record; BEGIN FOR rec IN SELECT f_table_schema, f_table_name, f_geometry_column FROM geometry_columns LOOP EXECUTE format( 'SELECT 1 FROM %I.%I WHERE ST_GeometryType(%I) = ''ST_Point'' LIMIT 1', rec.f_table_schema, rec.f_table_name, rec.f_geometry_column ); IF FOUND THEN schema_name := rec.f_table_schema; table_name := rec.f_table_name; RETURN NEXT; END IF; END LOOP; END; $$ LANGUAGE plpgsql;
调用这个函数就能得到结果:
SELECT DISTINCT * FROM find_tables_with_point_geoms();
这个函数会遍历所有空间表,检查每个几何列是否存在Point类型的记录,找到后就返回对应的表信息,DISTINCT同样是为了避免重复返回同一个表。
需要注意的是,第二种方法需要扫描表数据,如果你有大量数据的话可能会慢一点,所以优先用第一种方法,除非你确实需要处理混合类型的几何列。
内容的提问来源于stack exchange,提问作者barteloma




