PostGIS:空間關係

轉發:https://blog.csdn.net/qq_35732147/article/details/85615057數據庫

目錄函數

1、ST_Equals測試

2、ST_Intersects、ST_Disjoint、ST_Crosses和ST_Overlapsspa

3、ST_Touches.net

4、ST_Within和ST_Contains3d

5、ST_Distance和ST_DWithincode

6、空間關係練習blog


   

    到目前爲止,咱們只使用了測量(ST_Area、ST_Length)、序列化(ST_GeomFromText)或者反序列化(ST_AsGML)幾何圖形(geometry)的空間函數。這些函數的共同之處在於它們一次只能處理一個幾何圖形。索引

    空間數據庫之因此強大,是由於它們不只能存儲幾何圖形,並且還可以比較幾何圖形之間的關係ip

    諸如"哪個是離公園最近的自行車位?"或者"地鐵線路和街道的交叉路口在哪裏?"的問題,只能經過比較表示自行車位、街道和地鐵線路的幾何圖形來回答。

    OGC標準定義瞭如下一組用於比較幾何圖形的方法。

1、ST_Equals

    ST_Equals(geometry A, geometry B)用於測試兩個圖形的空間相等性。

_images/st_equals.png

    若是兩個相同類型的幾何圖形具備相同的x、y座標值,即若是第二個圖形與第一個圖形的座標信息相等(相同),則ST_Equals()返回TRUE

    首先,讓咱們從nyc_subway_stations表中檢索點數據,咱們只選"Broad St"的條目。

  1.   SELECT name, geom, ST_AsText(geom)
  2.   FROM nyc_subway_stations
  3.   WHERE name = 'Broad St';

    而後,將幾何圖形表示數據插入ST_Equals()進行測試:

  1.   SELECT name
  2.   FROM nyc_subway_stations
  3.   WHERE ST_Equals(geom, '0101000020266900000EEBD4CF27CF2141BC17D69516315141');

    注意:點在空間數據表中的表示不是很容易理解(0101000020266900000EEBD4CF27CF2141BC17D69516315141),但它是座標值的精確表示。對於像相等這樣的測試,使用精確的座標信息進行比較是必要的。

2、ST_Intersects、ST_Disjoint、ST_Crosses和ST_Overlaps

    ST_Intersects、ST_Crosses和ST_Overlaps測試幾何圖形是否相交。

_images/st_intersects.png

    若是兩個圖形有相同的部分,即若是它們的邊界或內部相交,則ST_Intersects(geometry A, geometry B)返回TRUE。

_images/st_disjoint.png

    ST_Intersects()方法的對立方法是ST_Disjoint(geometry A, geometry B)。

    若是兩個幾何圖形沒有重合的部分,則它們不相交,反之亦然。

    事實上測試"not intersect"一般比測試"disjoint"更有效,由於intersect測試可使用空間索引

_images/st_crosses.png

    對於multipoint/polygon、multipoint/linestring、linestring/linestring、linestring/polygon和linestring/multipolygon的比較,若是相交生成的幾何圖形的維度小於兩個源幾何圖形的最大維度,且相交集位於兩個源幾何圖形的內部,則ST_Crosses(geometry A, geometry B)將返回TRUE。

_images/st_overlaps.png

    ST_Overlaps(geometry A, geometry B)比較兩個相同維度的幾何圖形,若是它們的結果集與兩個源幾何圖形都不一樣但具備相同維度,則返回TRUE。

    讓咱們以寬街地鐵站(Broad Street subway station)爲例,使用ST_Intersects()函數肯定其所在社區:

  1.   SELECT name, ST_AsText(geom)
  2.   FROM nyc_subway_stations
  3.   WHERE name = 'Broad St';

  1.   SELECT name, boroname
  2.   FROM nyc_neighborhoods
  3.   WHERE ST_Intersects(geom, ST_GeomFromText('POINT(583571 4506714)',26918));

3、ST_Touches

    ST_Touches()測試兩個幾何圖形是否在它們的邊界上接觸,但在它們的內部不相交。

_images/st_touches.png

    若是兩個幾何圖形的邊界相交,或者只有一個幾何圖形的內部與另外一個幾何圖形的邊界相交,則ST_Touches(geometry A, geometry B)將返回TRUE。

4、ST_Within和ST_Contains

    ST_Within()和ST_Contains()測試一個幾何圖形是否徹底位於另外一個幾何圖形內。

_images/st_within.png

    若是第一個幾何圖形徹底位於第二個幾何圖形內,則ST_Within(geometry A, geometry B)返回TRUE,ST_Within()測試的結果與ST_Contains()徹底相反。

    若是第二個幾何圖形徹底包含在第一個幾何圖形內,則ST_Contains(geometry A, geometry B)返回TRUE。

5、ST_Distance和ST_DWithin

    一個常見的GIS問題是"找到這個物體周圍距離X的全部其餘物體"。

    ST_Distance(geometry A, geometry B)計算兩個幾何圖形之間的最短距離,並將其做爲浮點數返回。這對於實際報告幾何圖形之間的距離很是有用。

  1.   SELECT ST_Distance(
  2.  ST_GeometryFromText( 'POINT(0 5)'),
  3.  ST_GeometryFromText( 'LINESTRING(-2 2, 2 2)'));

    爲了測試兩個幾何圖形之間的距離是否在某個範圍以內,ST_DWithin()函數提供了一個這樣的的功能。

    這對於"在距離道路500米的緩衝區內有多少棵樹?"這樣的問題頗有用,你沒必要計算實際的緩衝區,只需測試距離關係便可。

_images/st_dwithin.png

    再次使用咱們的寬街地鐵站(Broad Street subway station),咱們能夠找到地鐵站附近(10米內)的街道:

  1.   SELECT name
  2.   FROM nyc_streets
  3.   WHERE ST_DWithin(
  4.  geom,
  5.  ST_GeomFromText( 'POINT(583571 4506714)',26918),
  6.   10
  7.  );

    咱們能夠在地圖上驗證答案,Broad St站其實是在Wall、Broad和Nassau街道的十字路口。

_images/broad_st.jpg

6、空間關係練習

    下面是咱們在文章上面部分涉及到的一些函數,它們應該對練習有用!

    還請記住咱們如今數據庫中已經具備的表:

  • nyc_census_blocks
    • blkid, popn_total, boroname, geom
  • nyc_streets
    • name, type, geom
  • nyc_subway_stations
    • name, geom
  • nyc_neighborhoods
    • name, boroname, geom

    練習:

    ①名爲"Atlantic Commonts"的街道的geometry值是什麼?

  1.   SELECT ST_AsText(geom)
  2.   FROM nyc_streets
  3.   WHERE name = 'Atlantic Commons';

    ②Atlantic Commons(大西洋公地)位於哪一個社區(neighborhood)和行政區(borough)?

  1.   SELECT name, boroname
  2.   FROM nyc_neighborhoods
  3.   WHERE ST_Intersects(
  4.  geom,
  5.  ST_GeomFromText( 'LINESTRING(586782 4504202,586864 4504216)', 26918)
  6.  );

    注意:嘿,爲何要將"MULTILINESTRING"變成"LINESTRING"呢?由於在空間上,它們描述的是相同的形狀。

    更重要的是,咱們還對座標進行了四捨五入,以使它們更易於閱讀,這實際上改變告終果:咱們如今不能使用ST_Touches()方法來找出哪些道路鏈接Atlantic Commons,由於座標再也不與原來的座標徹底相同。

    ③Atlantic Commons與哪些街道相連?

  1.   SELECT name
  2.   FROM nyc_streets
  3.   WHERE ST_DWithin(
  4.  geom,
  5.  ST_GeomFromText( 'LINESTRING(586782 4504202,586864 4504216)', 26918),
  6.   0.1
  7.  );

_images/atlantic_commons.jpg

    ④大約有多少人住在Atlantic Commons上(距離Atlantic Commons50米之內)?

  1.   SELECT Sum(popn_total)
  2.   FROM nyc_census_blocks
  3.   WHERE ST_DWithin(
  4.  geom,
  5.  ST_GeomFromText( 'LINESTRING(586782 4504202,586864 4504216)', 26918),
  6.   50
  7.  );

相關文章
相關標籤/搜索