osm2pgsql导入OSM至PostGIS后查询maxspeed字段报错求助
解决osm2pgsql导入后缺失
maxspeed字段的问题 这个问题我之前也碰到过,核心原因是osm2pgsql默认的导入配置没有把maxspeed这个OSM标签映射成PostgreSQL的列。虽然Overpass里能看到目标区域的道路带有这个属性,但如果导入时没配置对应的映射规则,数据库里自然就不会生成这个字段。下面给你两种实用的解决思路:
方法1:修改style文件重新导入(推荐,适合频繁查询)
osm2pgsql通过style文件决定哪些OSM标签要转换为数据库列,默认配置只包含了常用标签,maxspeed不在其中。你可以自定义映射规则:
- 找到默认style文件的位置,通常是
/usr/share/osm2pgsql/default.style(不确定的话可以用osm2pgsql --help查看默认路径)。 - 复制一份作为自定义配置:
cp /usr/share/osm2pgsql/default.style ~/custom_osm.style - 打开自定义style文件,添加一行
maxspeed的映射规则:
解释一下:node,way maxspeed text linearnode,way表示这个标签适用于节点和道路要素;text是字段类型(因为maxspeed可能带单位,比如"50 mph",用text更灵活;如果只存纯数字可以改成numeric);linear是针对线性要素的处理标记。 - 清空原有导入的表(比如
DROP TABLE planet_osm_line;),然后用自定义style重新导入数据:
重新导入后,osm2pgsql -d your_postgis_db -S ~/custom_osm.style your_osm_file.osm.pbfplanet_osm_line表就会出现maxspeed字段,你原来的SQL查询就能正常执行了。
方法2:利用hstore查询未映射标签(无需重新导入,适合临时查询)
如果导入数据时你启用了--hstore参数,那么所有未被style文件包含的OSM标签都会被存在tags这个hstore类型的列里。你可以直接通过这个列查询maxspeed:
select *, tags->'maxspeed' as maxspeed from planet_osm_line where highway is not null and tags->'maxspeed' is not null;
要是之前没开hstore,这个方法就用不了,只能选择方法1。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

