복붙노트

[SQL] 사용 MySQL의 공간적 확장은 원 내부의 점을 선택합니다

SQL

사용 MySQL의 공간적 확장은 원 내부의 점을 선택합니다

나는 MySQL의 '점'이 가득 좌표라는 컬럼을 포함하는 테이블라는 플래그를 가지고있다. 나는 100m 반경과 함께 위도와 경도 위치에 따라 원 내에서 모든 플래그 어디서 쿼리를 수행해야합니다.

보기의 사용의 관점에서이 사용자의 위치를 ​​기반으로합니다. 예를 들어, 휴대 전화는 사용자의 위도와 경도 위치를 줄 것이다 다음 API의이 부분에 전달합니다. 그것은 100m의 반경과 사용자의 주위에 보이지 않는 원을 만든 다음이 원에있는 플래그를 반환하는 API까지 다음이다.

내가 확실히 내가이 보이지 않는 원을 만들 만이 반경 내에서 포인트를 선택하는 SQL을 사용하는 방법을 확실 해요로 만드는 방법을 모르겠어요 API의 일부입니다.

이것이 가능한가? 내가 이렇게 도움이 될 것입니다 MySQL의 공간적 기능이 있습니까?

나는 버퍼 () 함수는이 작업을 수행 할 수 있지만 내가 (예 : 예를 들어 SQL)를 사용하는 방법에 관한 모든 문서를 찾을 수 있다고 생각합니다. 이상적으로는 쇼가 나를 어떻게 기능 또는 가장 가까운을 사용하는 것으로 대답을해야합니다. 내가 지리 점 등이 좌표를 저장하고있어 어디 내가 효율을 극대화 부탁 해요 무엇을 할 수있는 지리 공간 기능을 사용해야합니다.

플래그 테이블 :

예 행 :

1 | [기하학 - 25B] | Tenacy AB

플래그 테이블을 위해 나는 위도, 경도 위치와 Y 좌표와 X 좌표 (UTM)가

사용자의 위치는 표준 위도 / 경도입니다하지만 난 UTM이 위치를 Conver 유럽 수있는 라이브러리가

해결법

  1. ==============================

    1.위도 / 경도 거리 계산을 지원하는 MySQL은 어떤 지형 공간 확장 기능이 없습니다. MySQL을 5.7으로있다.

    위도 / 경도 거리 계산을 지원하는 MySQL은 어떤 지형 공간 확장 기능이 없습니다. MySQL을 5.7으로있다.

    당신은 지구 표면에 근접 원을 요구하고 있습니다. 당신은 당신의 플래그 테이블에서 각 행에 대한 위도 / 경도 값을 가지고 귀하의 질문에 언급, 또한 유니버설 횡 메르카토르 (UTM)는 여러 가지 다른 UTM 영역 중 하나에 값을 예상. 내가 영국 병기 조사가 제대로 매핑 기억한다면, UTM 그지도 항목을 찾는 데 유용합니다.

    그것은 UTM에서 동일한 영역에서 두 점 사이의 거리를 계산하는 간단한 사항입니다 : 직교 거리가 트릭을 수행합니다. 점은 서로 다른 영역에있는 때, 그 계산은 작동하지 않습니다.

    따라서, 귀하의 질문에 설명 된 응용 프로그램에 대한, 그것은 하버 사인 또는 다른 적절한 공식을 사용하여 계산 그레이트 서클 거리를 사용할 필요가있다.

    MySQL은 지리 정보로 보강 기하학적 프리미티브와 같은 다양한 평면 형상 (점, 폴리 라인, 다각형 등)를 표현하는 방법을 지원한다. 5.6 MySQL을 구현하는 거리 미등록 기능이 ST_Distance (P1, P2). 그러나,이 기능은 데카르트의 거리를 반환합니다. 그래서 위도와 경도를 기반으로 계산 전적으로 적합합니다. 위도 라인이 극 가까이 더 가까이 함께 성장하기 때문에 경도 (동서)의 정도와 같은 온대 위도 정도면 거리 (남북)으로 거의 2 배 위도 대한다의 정도에서.

    그래서, 원형 근접 공식 정품 위도와 경도를 사용해야합니다.

    응용 프로그램에서는이 같은 쿼리 주어진 latpoint, longpoint의 열 법령 마일 내의 모든 플래그 점을 찾을 수 있습니다 :

     SELECT id, coordinates, name, r,
            units * DEGREES( ACOS(
                       COS(RADIANS(latpoint)) 
                     * COS(RADIANS(X(coordinates))) 
                     * COS(RADIANS(longpoint) - RADIANS(Y(coordinates))) 
                     + SIN(RADIANS(latpoint)) 
                     * SIN(RADIANS(X(coordinates))))) AS distance
       FROM flags
       JOIN (
            SELECT 42.81  AS latpoint,  -70.81 AS longpoint, 
                   10.0 AS r, 69.0 AS units
            ) AS p ON (1=1)
      WHERE MbrContains(GeomFromText (
            CONCAT('LINESTRING(',
                  latpoint-(r/units),' ',
                  longpoint-(r /(units* COS(RADIANS(latpoint)))),
                  ',', 
                  latpoint+(r/units) ,' ',
                  longpoint+(r /(units * COS(RADIANS(latpoint)))),
                  ')')),  coordinates)
    

    당신이 20km 내에서 지점을 검색하려면, 쿼리의 줄을 변경

                   20.0 AS r, 69.0 AS units
    

    이것은, 예를 들어

                   20.0 AS r, 111.045 AS units
    

    r은 당신이 검색하고자하는 반경이다. 단위는 지구 표면에 위도의 정도에 따라 거리 단위 (당신이 원하는대로 마일, km, 펄롱,)입니다.

    이 쿼리는 다음 나머지 점에 대한 거리를 생성하는 대원 거리 공식을 사용, 너무 멀리 귀하의 출발점에서 확실히있는 점을 제외 긴 MbrContains와 함께 / 위도 경계를 사용합니다. 모든이의 설명은 여기에서 찾을 수 있습니다. 테이블이의 MyISAM 액세스 방법을 사용하여 공간 인덱스가있는 경우, MbrContains는 빠른 검색을 얻기 위해 그 인덱스를 이용합니다.

    사각형 내에서 마지막으로 선택 위의 쿼리는 모든 점. 이 같은 쿼리를 마무리, 근접하여 그들을 원 만 점에 그 아래로 축소하고, 주문하려면 :

     SELECT id, coordinates, name
       FROM (
             /* the query above, paste it in here */
            ) AS d
      WHERE d.distance <= d.r
      ORDER BY d.distance ASC 
    
  2. ==============================

    2.최신 정보

    최신 정보

    긴 / 위도를 사용하여 계산 거리에 사용 ST_Distance_Sphere ()

    http://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html#function_st-distance-sphere

  3. ==============================

    3.이 테이블의 좌표가 표기된 컬럼 "포인트"의 포인트 () 데이터 형식으로 저장되어있는 가정한다. 함수 X (포인트) 및 Y (A 지점)는 각각 포인트 값의 위도 및 경도 값을 추출한다.

    이 테이블의 좌표가 표기된 컬럼 "포인트"의 포인트 () 데이터 형식으로 저장되어있는 가정한다. 함수 X (포인트) 및 Y (A 지점)는 각각 포인트 값의 위도 및 경도 값을 추출한다.

    SET @lat = the latitude of the point
    SET @lon = the longitude of the point
    SET @rad = radius in Kilometers to search from the point
    SET @table = name of your table
    
    SELECT
        X(point),Y(point),*, (
          6373 * acos (
          cos ( radians( @lat ) )
          * cos( radians( X(point) ) )
          * cos( radians( Y(point) ) - radians( @lon ) )
          + sin ( radians( @lat ) )
          * sin( radians( X(point) ) )
        )
    ) AS distance
    FROM @table
    HAVING distance < @rad
    

    당신이 마일을하고 싶은 경우, 3959로 상수 6373을 대체

    쿼리 구문을 줄이기 위해 원하는 사람들을 위해, 여기 하버 사인 공식에 따라 거리 함수를 구현하기위한 사용자 정의 MySQL의 기능의 일반적인 구현입니다.

    CREATE FUNCTION HAVERSINE ( coord1 POINT, coord2 POINT )
    RETURNS DOUBLE
    DETERMINISTIC
    BEGIN
        DECLARE dist DOUBLE;
        SET rlat1 = radians( X( coord1 ) );
        SET rlat2 = radians( X( coord2 ) );
        SET rlon1 = radians( Y( coord1 ) );
        SET rlon2 = radians( Y( coord2 ) );
        SET dist  = ACOS( COS( rlat1 ) * COS( rlon1 ) * COS( rlat2 ) * COS( rlon2 ) + COS( rlat1 ) * SIN( rlon1 ) * COS( rlat2 ) * SIN( rlon2 ) + SIN( rlat1 ) * SIN( rlat2 ) ) * 6372.8;
        RETURN dist;
    END
    
  4. ==============================

    4.버퍼는 버퍼가 다각형이기 때문에, MySQL은 <5.6에 많은 도움이되지 않습니다, 그리고 MySQL의 <5.6에서 폴리곤 작업은 꽤 쓸모가 "최소 경계 사각형"(MBR)로 구현됩니다.

    버퍼는 버퍼가 다각형이기 때문에, MySQL은 <5.6에 많은 도움이되지 않습니다, 그리고 MySQL의 <5.6에서 폴리곤 작업은 꽤 쓸모가 "최소 경계 사각형"(MBR)로 구현됩니다.

    MySQL은 5.6 이후, 전체가 아닌 MBR st_ * 작업이 실행되었다. 그러나 당신을위한 가장 좋은 방법은, 원의 경우, 문서화되지 않은 기능이 ST_Distance를 사용하는 것입니다 :

    select *
    from waypoints
    where st_distance(point(@center_lon, @center_lat), coordinates) <= radius;
    

    서류 미 비자이기 때문에, 찾기 힘들었다 :-) 그러나 누구의 저자도 언급 한 버그 보고서를 작성이 블로그에 언급 한 것. (블로그를 인용)하지만주의 사항이 있습니다 :

    거리의 단위)의 경우 WGS84 좌표 (도의 단위로 동일하다고 1) 수단을 지적한다. 당신이 미터 거리 필요하면 미터에 해당하는 단위가 그 전망 조정 시스템 (예를 들어, UTM 또는 유사)를 사용합니다.

    그래서, 경우에 이러한주의로 가고, 또는 MySQL의 <5.6의 경우에, 당신은 자신 만의 거리 함수를 작성해야합니다 싶지 않아요.

  5. ==============================

    5.내 버전이 도움이되기를 바랍니다

    내 버전이 도움이되기를 바랍니다

    SELECT 
        *
    FROM 
        `locator`
    WHERE
        SQRT(POW(X(`center`) - 49.843317 , 2) + POW(Y(`center`) - 24.026642, 2)) * 100 < `radius`
    

    여기 http://dexxtr.com/post/83498801191/how-to-determine-point-inside-circle-using-mysql 사항

  6. ==============================

    6.에서: https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql

    에서: https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql

    SELECT
        id, (
          6371 * acos (
          cos ( radians(78.3232) )
          * cos( radians( lat ) )
          * cos( radians( lng ) - radians(65.3234) )
          + sin ( radians(78.3232) )
          * sin( radians( lat ) )
        )
    ) AS distance
    FROM markers
    HAVING distance < 30
    ORDER BY distance
    LIMIT 0 , 20;
    

    (모든 상수를 대체 할 기억이 예 킬로미터입니다)

  7. ==============================

    7.당신이 사용할 수있는:

    당신이 사용할 수있는:

    SELECT name, lat, lng   
    FROM vw_mytable 
    WHERE ST_Contains(ST_Buffer(
              ST_GeomFromText('POINT(12.3456 34.5678)'), (0.00001*1000)) , mypoint) = 1  
    

    식 : 당신에게주고 직경 1000 미터 인 원 위의 0.00001 * 1000 내부의 한 Statment, 그것의 존재는, mypoint 내 포인트 컬럼의 이름, 이름 열이 점에 불과 레이블, 여기에 뷰에 적용 북 ST_X (mytable.mypoint)과 함께 내부보기 계산 ST_Y (mytable.mypoint) 그들과 함께 LNG 단순히 나에게 위도와 LNG의 테 리터럴 값을 보여줍니다. 그것은 당신에게 원에 속하는 모든 좌표를 제공 할 것입니다.

  8. ==============================

    8.MySQL은 5.7.6의 같은 완전성을 위해서, 대한. 동일한 결과를 얻을 ST_Distance_Sphere 기능을 사용할 수 있습니다 :

    MySQL은 5.7.6의 같은 완전성을 위해서, 대한. 동일한 결과를 얻을 ST_Distance_Sphere 기능을 사용할 수 있습니다 :

    SET @pt1 = ST_GeomFromText('POINT(12.3456 34.5678)');
    
    SELECT * from 
    (SELECT * ,(ST_Distance_Sphere(@pt1, location, 6373)) AS distance FROM mydb.Event ORDER BY distance) x WHERE x.distance <= 30;
    

    이 경우, 우리는 거리에서 지구의 대략 반경 (6373)과 점 (@ PT1)을 제공한다. 거리가 30km 이하인 곳이 코드는 데이터베이스에 포함 된 그 시점 (위도 34.5678 긴 12.3456) 모든 점 사이 (킬로미터)의 거리를 계산합니다.

  9. from https://stackoverflow.com/questions/21168380/use-mysql-spatial-extensions-to-select-points-inside-circle by cc-by-sa and MIT license