2016-08-19 67 views
1

我有兩個linetrings Line1,Line2。PostgreSQL的ST_DWithin替代python shapely

line1 = "LINESTRING(72.863221 18.782499,72.863736 18.770147,72.882275 18.756169,72.881417 18.750805,72.878842 18.736987,72.874379 18.709512,72.860989 18.679593,72.864422 18.653897)" 
line2 = "LINESTRING(72.883133 18.780793,72.882103 18.760314,72.862534 18.716422,72.860474 18.683577)" 

我試圖在勻稱執行以下POSTGIS查詢。截至目前,我還無法找到ST_DWithin命令的替代方法。

road2 = "ST_GeographyFromText('SRID=4326;%s')"%line1 
road4 = "ST_GeographyFromText('SRID=4326;%s')"%line2 
cur.execute("SELECT ST_AsText(road1) from %s as road1,%s as road2 
      where ST_DWithin(road1,road2,500)"%(road2,road4)) 
res = cur.fetchall() 
print res 

有誰知道什麼是ST_DWithin在勻稱的選擇嗎?

回答

0

據我所知,體形只支持平面座標(沒有地理類型)的操作。然而,對於路線]其不是太大,使得在地球的曲率可以忽略不計,一個可部分「規避」這通過:

  • 直接在緯度/經度在一些平面投影工作(例如或LON以下的ST_DWithin文檔中的第二個音符和ST_Expand文檔中的第一個音符,即/ LAT座標)

    1. 檢查所述第二線段形式相交的包圍盒與第一線段形式
    2. 如果是擴大的邊框,檢查是否最小距離的確是低於規定的閾

例如:

from shapely.wkt import dumps, loads 
from shapely.geometry.geo import box 

spec = [ 
    "LINESTRING(72.863221 18.782499,72.863736 18.770147,72.882275 18.756169,72.881417 18.750805,72.878842 18.736987,72.874379 18.709512,72.860989 18.679593,72.864422 18.653897)", 
    "LINESTRING(72.883133 18.780793,72.882103 18.760314,72.862534 18.716422,72.860474 18.683577)" 
] 

lines = list(map(loads, spec)) 

eta = 0.005 

b1 = box(*lines[0].bounds).buffer(eta) 
b2 = box(*lines[1].bounds) 

flag = b2.intersects(b1) and (lines[0].distance(lines[1]) < eta) 
print(eta, flag) 

或者,如果你願意想要檢查整個第二LineString是否在第一個LineString的規定閾值內,你也可以使用buffer方法:

lines[0].buffer(eta).contains(lines[1]) 

此處提供給buffer方法的閾值表示在定義LineStrings的同一座標系中。在lon/lat系統內,這將代表「中心角」 - 問題在於事實上對應於固定的eta不僅取決於經度和緯度的特定值,而且取決於位移的方向。但是,如果LineStrings不是太大,並且所需的精度不是太高,則可能不會matter that much