一、PostGIS 的查询方案实现与分析
本节将首先对整体需求进行介绍,然后重点说明如何在 PostGIS 中进行数据查询实现,以及在实现过程中可能遇到的性能瓶颈。
1、需求描述
以湖南省的路网为例,OSM 数据已成功导入 PostGIS 中,存储在 biz_road_network 表中。

表中大约存储了 17 万条道路信息。这里表示采集时点的道路信息,但我们需要更多维度的信息提取,例如查找湖南省各地市的高速道路里程长度、城市主干道的道路里程长度,甚至需要掌握步行路线的长度,这些应该如何去实现呢?
2、PostGIS 的实现方式
首先来看一下在 PostGIS 完全使用空间检索的方式如何实现。为了实现城市行政区划范围和道路查询,需要使用城市信息表和道路信息表,通过空间检索查询城市行政区划范围内的道路信息。查询 SQL 如下:
SELECT t1.city_code, MAX(t1.city_name) AS city_name, SUM(CASE WHEN r.fclass IN ('motorway', 'motorway_link') THEN ST_Length(r.geom::geography) ELSE 0 END) AS highway_length, SUM(CASE WHEN r.fclass IN ('trunk', 'trunk_link') THEN ST_Length(r.geom::geography) ELSE 0 END) AS trunk_length, SUM(CASE WHEN r.fclass IN ('primary', 'primary_link') THEN ST_Length(r.geom::geography) ELSE 0 END) primary_length, ( r.fclass (, ) ST_Length(r.geom::geography) ) secondary_length, ( r.fclass (, ) ST_Length(r.geom::geography) ) tertiary_length, ( r.fclass (, ) ST_Length(r.geom::geography) ) residential_length, ( r.fclass (, ) ST_Length(r.geom::geography) ) service_length, ( r.fclass (, , ) ST_Length(r.geom::geography) ) pedestrian_length, ( r.fclass ST_Length(r.geom::geography) ) cycleway_length, ( r.fclass ST_Length(r.geom::geography) ) track_length, ( r.fclass (, ) ST_Length(r.geom::geography) ) steps_length, (ST_Length(r.geom::geography)) total_length biz_road_network r biz_city t1 ST_Contains(t1.geom, r.geom) t1.province_code t1.city_code total_length ;





