2016-08-19 5 views
1

두 개의 선 스트링 Line1, Line2가 있습니다.PostGIS의 ST_DWithin 대신 파이썬으로 멋지게

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

필자가 아는 바로는 평면 좌표 (지형 유형 없음)의 조작 만 지원합니다. 위도/경도에 직접 (예를 들어, 일부 평면 투영 작업

  • 그러나, 세계의 곡률이 무시 될 수 있도록 너무 크지 않다 유도 선에 대해, 하나의 부분이로 "우회"있었다 또는 경도/위도 좌표)

  • ST_DWithin의 문서에서 두 번째 노트와 ST_Expand의 문서에서 첫 번째 주, 다음

    1. 확인하는 경우 두 번째 선 스트링 교차의 경계 상자 당신이하고자하는 경우,

      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 메소드에 제공된 임계 값은 선형 문자열이 정의 된 동일한 좌표 시스템으로 표현됩니다. lon/lat 시스템 내에서 이것은 "중심각"을 나타낼 것입니다 - 문제는 고정 된 eta에 해당하는 great circle distance이 위도와 경도의 특정 값뿐만 아니라 변위의 방향에 의존 할뿐만 아니라 . 그러나 LineStrings가 너무 크지 않고 필요한 정밀도가 너무 높지 않으면 matter that much이되지 않습니다.