shapefile æ•°æ®å¯¼å…¥åŠç©ºé—´æŸ¥è¯¢ ----------------------------- å¯¼å…¥æ•°æ® ~~~~~~~~~~ `èŒƒä¾‹æ•°æ® <../../_static/files/sampledata.rar>`__ 包å«çº½çº¦å¸‚çš„è¡—é“ã€åœ°é“ç«™ç‰ä¿¡æ¯ï¼Œè·¯å¾„: \nyc_shapefile 使用 shp2pgsqlå¯¼å…¥æ•°æ® ^^^^^^^^^^^^^^^^^^^^^^^^^^^ **导入 nyc_census_blocks æ•°æ®** .. code:: sh shp2pgsql \ -D \ -I \ -s 26918 \ nyc_census_blocks.shp \ nyc_census_blocks \ | gsql dbname=yukontutorial å…¶ä¸ï¼š - ``-D``: 使用 ``dump format`` æ–¹å¼ï¼Œè¿™ä¸ªè¦æ¯”默认的 ``insert format`` 快很多。 - ``-I``: åŠ è½½æ•°æ®å®ŒæˆåŽï¼Œä¸º geometry 类型的列创建一个索引 - ``-s``: æ•°æ®çš„ srid 值。 - ``nyc_census_blocks.shp``: è¦åŠ 载的数æ®é›† - ``nyc_census_blocks``: åŠ è½½åŽåœ¨æ•°æ®åº“ä¸åˆ›å»ºçš„表å - ``gsql dbname=yukontutorial`` : 将数æ®å¯¼å…¥åˆ° ``yukontutorial`` æ•°æ®åº“ä¸ å½“ä½ çœ‹åˆ°æœ‰å¦‚ä¸‹è¾“å‡ºæ—¶ï¼Œåˆ™è¯´æ˜Žæ•°æ®å¯¼å…¥æˆåŠŸ .. code:: text Field popn_total is an FTDouble with width 11 and precision 0 Field popn_white is an FTDouble with width 11 and precision 0 Field popn_black is an FTDouble with width 11 and precision 0 Field popn_nativ is an FTDouble with width 11 and precision 0 Field popn_asian is an FTDouble with width 11 and precision 0 Field popn_other is an FTDouble with width 11 and precision 0 Shapefile type: Polygon Postgis type: MULTIPOLYGON[2] SET SET BEGIN NOTICE: CREATE TABLE will create implicit sequence "nyc_census_blocks_gid_seq" for serial column "nyc_census_blocks.gid" CREATE TABLE NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "nyc_census_blocks_pkey" for table "nyc_census_blocks" ALTER TABLE addgeometrycolumn -------------------------------------------------------------------- public.nyc_census_blocks.geom SRID:26918 TYPE:MULTIPOLYGON DIMS:2 (1 row) CREATE INDEX COMMIT ANALYZE 然åŽé‡æ–°è¿žæŽ¥åˆ° ``yukontutorial`` æ•°æ®åº“,输入 ``\d`` 查看新创建的表: .. code:: text yukontutorial=# \d List of relations Schema | Name | Type | Owner | Storage --------+---------------------------+----------+-------+---------------------------------- public | geography_columns | view | omm | public | geometry_columns | view | omm | public | geomodel_columns | view | omm | public | nyc_census_blocks | table | omm | {orientation=row,compression=no} public | nyc_census_blocks_gid_seq | sequence | omm | public | raster_columns | view | omm | public | raster_overviews | view | omm | public | spatial_ref_sys | table | omm | {orientation=row,compression=no} (8 rows) åŒç†ï¼Œä¾æ¬¡å¯¼å…¥å‰©ä½™çš„æ•°æ®é›†ï¼š - nyc_neighborhoods.shp - nyc_streets.shp - nyc_subway_stations.shp **ä½ å¯èƒ½ä¼šå¥½å¥‡ .shp 文件到底是什么?** 通常æ¥è¯´ ``shp`` 文件一般指的是 ``.shp``, ``.shx``,\ ``.dbf`` 还有一些其他类型文件且å‰ç¼€å称一致的文件集åˆã€‚\ ``shp`` å³ shape file ,通常å•ç‹¬çš„一个 ``shp`` 文件时没有什么用的,必须和其他类型的文件结åˆä½¿ç”¨ã€‚ å¿…è¦æ–‡ä»¶ï¼š - ``.shp``\ :å˜å‚¨åœ°ç†è¦ç´ çš„å‡ ä½•ä¿¡æ¯ - ``.shx``\ :å˜å‚¨è¦ç´ å‡ ä½•å›¾å½¢çš„ç´¢å¼•ä¿¡æ¯ - ``.dbf``: å˜å‚¨åœ°ç†è¦ç´ 的属性信æ¯ï¼ˆéžå‡ 何信æ¯ï¼‰ å¯é€‰æ–‡ä»¶ï¼š - ``.prj``\ :å˜å‚¨ç©ºé—´å‚考信æ¯ï¼Œå³åœ°ç†åæ ‡ç³»ç»Ÿä¿¡æ¯å’ŒæŠ•å½±åæ ‡ç³»ç»Ÿä¿¡æ¯ã€‚使用 well-known æ–‡æœ¬æ ¼å¼è¿›è¡Œæ述。 **é‚£ SRID åˆæ˜¯ä»€ä¹ˆï¼Ÿ** 大多数导入过程都是ä¸è¨€è‡ªæ˜Žçš„,但å³ä½¿æ˜¯ç»éªŒä¸°å¯Œçš„ GIS 专业人员也å¯èƒ½è¢« SRID 难倒。 ``SRID`` 表示 ``Spatial Reference IDentifier(空间å‚è€ƒæ ‡è¯†ç¬¦)``\ 。它定义了我们数æ®çš„地ç†åæ ‡ç³»ç»Ÿå’ŒæŠ•å½±çš„æ‰€æœ‰å‚数。 SRID å¾ˆæ–¹ä¾¿ï¼Œå› ä¸ºå®ƒå°†æœ‰å…³åœ°å›¾æŠ•å½±çš„æ‰€æœ‰ä¿¡æ¯ï¼ˆå¯èƒ½éžå¸¸å¤æ‚ï¼‰æ‰“åŒ…ï¼ˆæ›´å…·ä½“çš„è¯´åº”è¯¥æ˜¯æ˜ å°„ï¼‰åˆ°ä¸€ä¸ªæ•°å—ä¸ã€‚ ä½ å¯ä»¥åœ¨ä»¥ä¸‹é“¾æŽ¥ä¸æŸ¥æ‰¾æˆ‘们在上é¢ä½¿ç”¨çš„投影的定义:\ `SRID <http://spatialreference.org/ref/epsg/26918/>`__ æ•°æ®æ“作 ~~~~~~~~~~ 我们想知é“纽约市街é“的总长度是多少应该怎么åšï¼Ÿ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: sql select SUM(ST_LENGTH(GEOM)) from nyc_streets; ä½ å¯ä»¥çœ‹åˆ°å¦‚下输出: .. code:: sql yukontutorial=# select SUM(ST_LENGTH(GEOM)) from nyc_streets ; sum --------------- 10418904.7172 (1 row) è¿™æ ·æˆ‘ä»¬å°±å¯ä»¥çŸ¥é“纽约市街é“总长度为 10418904.7172m ``ST_Length(geometry geom)``\ :如果 geom 的类型是 ``LineString`` 或者 ``MultiLineString``,那么就返回这个 geometry 的长度。 ``sum``\ :èšåˆå‡½æ•°ï¼Œå¯ä»¥è®¡ç®— ``nyc_streets`` 表ä¸æ¯ä¸€è¡Œ geometry 对象长度的总和。 我们想知é“纽约市最西边的地é“站是哪一个? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: SQL select st_x(geom),name from nyc_subway_stations order by st_x(geom) limit 1; 输出结果: .. code:: SQL yukontutorial=# select st_x(geom),name from nyc_subway_stations order by st_x(geom) limit 1; st_x | name ------------------+------------- 563292.117258056 | Tottenville (1 row) ``ST_X(geometry a_point);``: 如果 geometry 是一个点,则返回它的 x åæ ‡ï¼Œå¦åˆ™è¿”回 NULL。 现在我们知é“ä½äºŽçº½çº¦å¸‚最西边的地é“站是 Tottenville。 我们想知é“è·ç¦» Broad St 地é“ç«™ 10m 范围内的街é“有那些? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我们å¯ä»¥å…ˆæŸ¥è¯¢ä¸€ä¸‹ ``Broad St`` 地é“站的具体ä½ç½®ï¼š .. code:: sql select st_astext(geom) from nyc_subway_stations where name='Broad St'; 输出结果: .. code:: SQL yukontutorial=# select st_astext(geom) from nyc_subway_stations where name='Broad St'; st_astext ------------------------------------------ POINT(583571.905921312 4506714.34119218) (1 row) 现在我们知é“了 ``Borad St`` 地é“站的具体地点为 ``POINT(583571.905921312 4506714.34119218)``\ , 接下æ¥å¯ä»¥æŸ¥è¯¢è·ç¦»åœ°é“ç«™ 10m 范围内的街é“了。 .. code:: sql SELECT name FROM nyc_streets WHERE ST_DWithin( geom, ST_GeomFromText('POINT(583571.905921312 4506714.34119218)',26918), 10 ); 输出结果: .. code:: text name ----------- Wall St Broad St Nassau St (3 rows) 现在我们å¯ä»¥çŸ¥é“è·ç¦» ``Broad St`` 地é“ç«™ 10m 内的街é“有这 3 个。 ``ST_AsText(geometry g1)``: 返回 WKT å½¢å¼çš„ geometry æ•°æ®ã€‚ ``ST_GeomFromText(text WKT, integer srid);`` : 返回由 WKT å½¢å¼è¡¨ç¤ºçš„ geometry æ•°æ®ç±»åž‹ã€‚åŒæ—¶æŒ‡å®šå®ƒçš„ SRID。 ``ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid)`` : 如果 g1 å’Œ g2 ç›¸è· distance_of_srid 之内,则返回真,å¦åˆ™è¿”回å‡ã€‚ 我们想知é“纽约市人å£å¯†åº¦æœ€å¤§çš„社区是哪一个? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: SQL SELECT n.name, Sum(c.popn_total) / (ST_Area(n.geom) / 1000000.0) AS popn_per_sqkm FROM nyc_census_blocks AS c JOIN nyc_neighborhoods AS n ON ST_Intersects(c.geom, n.geom) GROUP BY n.name, n.geom ORDER BY 2 DESC limit 1; 输出结果: .. code:: SQL name | popn_per_sqkm -------------------+------------------ North Sutton Area | 68435.1328377268 (1 row) 从结果ä¸æˆ‘们å¯ä»¥çœ‹åˆ° North Sutton Area 的人å£å¯†åº¦æ˜¯æœ€å¤§çš„。 ``ST_Intersects( geometry geomA , geometry geomB )``: 返回 geomA å’Œ geomB 是å¦ç›¸äº¤