首页 > 代码库 > 如何查询postgresql+openstreetmap

如何查询postgresql+openstreetmap

先行输入:psql gis
\d  显示当前数据表
               List of relations Schema |        Name        | Type  |  Owner   --------+--------------------+-------+---------- public | geography_columns  | view  | postgres public | geometry_columns   | table | gis public | planet_osm_line    | table | user public | planet_osm_nodes   | table | user public | planet_osm_point   | table | user public | planet_osm_polygon | table | user public | planet_osm_rels    | table | user public | planet_osm_roads   | table | user public | planet_osm_ways    | table | user public | spatial_ref_sys    | table | gis(10 rows)

再进入某一个数据表,语句为:\d planet_osm_roads

就会出现如下的显示:

Table "public.planet_osm_roads" Column | Type | Modifiers --------------------+----------+----------- osm_id | bigint | access | text | addr:housename | text | addr:housenumber | text | addr:interpolation | text | admin_level | text | aerialway | text | aeroway | text | amenity | text | .... waterway | text | wetland | text | width | text | wood | text | z_order | integer | way_area | real | way | geometry |

然后就可以进行访问操作了,如下:

SELECT osm_id,name,way FROM planet_osm_roads LIMIT 1;

 

但是,后来在python中发现,psycopg2似乎不支持\d的输入,所以,我后来又换了一种查询的方法:

select planet_osm_roads.\"OSM_ID\", ST_AsText(planet_osm_roads.\"the_geom\") from public.planet_osm_roads;

这个语句相对来说更加正规一点,但是使用起来会麻烦一些,需要从最头上进入到数据库中,但是,查询结果肯定是一样的。

另外,由于openstreetmap中的the_geom是通过geometry数据类型来存储的,所以以上我使用了ST_AsTExt 函数进行格式转换。

格式转换之后,显示为:

( ‘LINESTRING(12936024.28 4839648.07,12935424.71 4838722.06,12934892.21 4837629.71,12934289.2 4836007.5,12933955.4 4834815.49,12933523.99 4834253.51,12932398.66 4833859.51,12930942.93 4833698.73,12930017.2 4833337.34,12928792.52 4832545.6,12927333.4 4830992.71,12926605.54 4830332.04,12925976.25 4830134.83,12925216.94 4830137.07,12924226.69 4830471.27,12923535.34 4830870.63,12923537.07 4831566.67,12923670.37 4832229,12924035.56 4832857.78,12924368.51 4833585.97,12924703.14 4834446.89,12923880.16 4835708.54,12922724.27 4836241.84,12922132.27 4836939.92,12921903.85 4838034.36,12921642.24 4839195.88,12921447.77 4840290.58,12921153.05 4841352.77,12920474.79 4841645.26,12918234.82 4842608.73)‘)

应该代表的是各个node的GPS坐标值。

 

另外附上ST的函数集合:

获取几何对象的WKT描述 ST_AsText(geometry)
获取几何对象的WKB描述 ST_AsBinary(geometry)
获取几何对象的空间参考ID ST_SRID(geometry)
获取几何对象的维数 ST_Dimension(geometry)
获取几何对象的边界范围 ST_Envelope(geometry)
判断几何对象是否为空 ST_IsEmpty(geometry)
判断几何对象是否不包含特殊点(比如自相交) ST_IsSimple(geometry)
判断几何对象是否闭合 ST_IsClosed(geometry)
判断曲线是否闭合并且不包含特殊点 ST_IsRing(geometry)
获取多几何对象中的对象个数 ST_NumGeometries(geometry)
获取多几何对象中第N个对象 ST_GeometryN(geometry,int)
获取几何对象中的点个数 ST_NumPoints(geometry)
获取几何对象的第N个点 ST_PointN(geometry,integer)
获取多边形的外边缘 ST_ExteriorRing(geometry)
获取多边形内边界个数 ST_NumInteriorRings(geometry)
同上 ST_NumInteriorRing(geometry)
获取多边形的第N个内边界 ST_InteriorRingN(geometry,integer)
获取线的终点 ST_EndPoint(geometry)
获取线的起始点 ST_StartPoint(geometry)
获取几何对象的类型 GeometryType(geometry)
类似上,但是不检查M值,即POINTM对象会被判断为point ST_GeometryType(geometry)
获取点的X坐标 ST_X(geometry)
获取点的Y坐标 ST_Y(geometry)
获取点的Z坐标 ST_Z(geometry)
获取点的M值 ST_M(geometry)