MySQL을 통해 반지름이 좁아지는 문제


9

각 우편 번호에 대한 중심 위도, 경도가 포함 된 우편 번호 표가 있습니다. 임의의 지점에서 주어진 마일 반경 내의 우편 번호 목록을 얻는 데 사용합니다.

지퍼의 중심점이 주어진 반경 내에 있지 않다고해서 지퍼 자체가 반경 내에 있지 않다는 것은 아닙니다.

나는 여기에 요점을 설명하기 위해 초 고급 예술 기술을 사용했습니다.

여기에 이미지 설명을 입력하십시오

  • 녹색 줄무늬 얼룩은 우편 번호 A, B 및 C를 나타냅니다.

  • 빨간색 얼룩은 각 우편 번호의 지리적 중심입니다.

  • 자홍색 점은 대상 위치입니다.

  • 울퉁불퉁 한 파란색 원은 대상 위치에서 반경 1 마일입니다.

핑크 스머지에서 1 마일 반경 내의 모든 우편 번호에 대한 쿼리를 실행하면 핑크 스머지 자체가 있더라도 지퍼 A의 중심점이 1 마일 반경 내에 있지 않기 때문에 우편 번호 B와 C 만 반환됩니다. 우편 번호 A에 명확하게 있습니다.

SELECT *,
        p.distance_unit
                 * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                 * COS(RADIANS(z.y))
                 * COS(RADIANS(p.longpoint) - RADIANS(z.x))
                 + SIN(RADIANS(p.latpoint))
                 * SIN(RADIANS(z.y)))) AS dist
  FROM standard_zip AS z
  JOIN (   /* these are the query parameters */
        SELECT  $lat  AS latpoint,  $lng AS longpoint,
                $miles AS radius,      69 AS distance_unit
    ) AS p ON 1=1
  WHERE z.y
     BETWEEN p.latpoint  - (p.radius / p.distance_unit)
         AND p.latpoint  + (p.radius / p.distance_unit)
    AND z.x
     BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
         AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
  ORDER BY dist

결과에 zip A를 포함하는 쿼리를 어떻게 작성합니까?

필요한 경우 테이블에 추가 할 수있는 각 우편 번호에 대한 공간 / 기하학에 액세스 할 수 있지만 MySQL 에서이 목적으로 어떻게 사용할지 모릅니다.


편집 : 나는 공간 데이터에 대한 Oracle 및 MySQL 문서를 읽는 데 하루를 보냈으며 공간 데이터를 MySQL로 성공적으로 변환했습니다 . 위도 및 경도 대신 기하학 열을 사용하는 유사한 쿼리를 작성하는 방법은 무엇입니까? 2D 데이터를 사용하고 있습니다. 형상은 다각형과 다중 다각형입니다.

내가 알아 낸 것 같아 ..

select
  *
from
  (
    select
      MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
      zip
    from
      zip_spatial
    group by
      zip
    order by
      miles asc
  ) d
where
  d.miles < 5

누군가가 더 좋고 더 효율적인 솔루션을 가지고 있다면 지금 현상금을 열어 두겠습니다.

답변:


7

에서 오라클의 인덱싱 및 쿼리 공간 데이터 오라클 공간 개발자 가이드 11g 릴리스 2 (11.2)에서 :

공간 데이터 쿼리

Spatial은 기본 및 보조 필터 작업과 함께 2 계층 쿼리 모델을 사용하여 공간 쿼리 및 공간 조인을 해결합니다. 2 계층이라는 용어는 쿼리를 해결하기 위해 두 개의 별개의 작업이 수행됨을 나타냅니다. 두 작업을 모두 수행하면 정확한 결과 집합이 반환됩니다.

공간 인덱스가 해당 테이블에 정의 된 경우 데이터베이스 링크 (dblink) 이름을 쿼리의 공간 테이블 이름에 추가 할 수 없습니다.

공간 쿼리

공간 R- 트리 인덱스에서 각 지오메트리는 최소 경계 사각형 (MBR)으로 표시됩니다. 그림 1에 여러 개체가 포함 된 다음 계층을 고려하십시오. 각 객체에는 지오메트리 이름 (선 문자열의 경우 geom_1, 4면 다각형의 경우 geom_2, 삼각 다각형의 경우 geom_3, 타원의 경우 geom_4)로 레이블이 지정되며 각 오브젝트 주변의 MBR은 점선으로 표시됩니다.

MBR이있는 형상

"MBR이있는 그림 1 형상"에 대한 설명

일반적인 공간 쿼리는 쿼리 창 내에있는 모든 개체, 즉 정의 된 펜스 또는 창을 요청하는 것입니다. 동적 쿼리 창은 데이터베이스에 정의되어 있지 않지만 사용하기 전에 정의해야하는 사각형 영역을 나타냅니다. 그림 2는 그림 1과 동일한 형상을 보여 주지만, 점선으로 표시된 쿼리 창을 추가합니다.

그림 2 쿼리 창이있는 레이어

"조회 창이있는 그림 2 레이어"에 대한 설명

그림 2에서 쿼리 창은 geom_1 및 geom_2 기하학의 일부와 geom_3에 대한 MBR의 일부를 다루지 만 실제 geom_3 기하학은 포함하지 않습니다. 쿼리 창은 geom_4 지오메트리 또는 MBR의 일부를 다루지 않습니다.

기본 필터 연산자

SDO_FILTER 연산자는 Oracle Spatial 쿼리 처리 모델과 관련된 2 단계 프로세스의 기본 필터 부분을 구현합니다. 기본 필터는 인덱스 데이터를 사용하여 후보 개체 쌍 집합이 상호 작용할 수 있는지 여부 만 결정합니다. 특히 기본 필터는 개체 자체가 상호 작용하는지 여부가 아니라 후보 개체의 MBR이 상호 작용하는지 확인합니다. SDO_FILTER 연산자 구문은 다음과 같습니다.

SDO_FILTER(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2)

위의 구문에서 :

  • geometry1은 테이블에서 SDO_GEOMETRY 유형의 열입니다. 이 열은 공간적으로 색인화되어야합니다.

  • geometry2는 SDO_GEOMETRY 유형의 객체입니다. 이 개체는 테이블에서 가져 오거나 나올 수 없습니다. 테이블에서 가져온 경우 공간적으로 색인화 될 수 있습니다.

  • param은 VARCHAR2 유형의 선택적 문자열입니다. min_resolution 및 max_resolution 키워드 중 하나 또는 둘 다를 지정할 수 있습니다.

다음 예는 기본 필터 작업 만 수행합니다 (보조 필터 작업 없음). 쿼리 창과 상호 작용하는 MBR이있는 그림 2에 표시된 모든 형상을 반환합니다. 다음 예제의 결과는 geom_1, geom_2 및 geom_3입니다.

Example1은 쿼리 창을 테이블에 삽입하지 않고 기본 필터 작업을 수행합니다. 창은 메모리에서 색인화되며 성능은 매우 좋습니다.

예 1 임시 쿼리 창이있는 기본 필터

SELECT A.Feature_ID FROM TARGET A  WHERE sdo_filter(A.shape, SDO_geometry(2003,NULL,NULL,
                                       SDO_elem_info_array(1,1003,3),
                                       SDO_ordinate_array(x1,y1, x2,y2))
                           ) = 'TRUE';   

Example1에서 (x1, y1) 및 (x2, y2)는 쿼리 창의 왼쪽 아래 및 오른쪽 위 모서리입니다.


1
내가 반경을 나타내는 원의 형상을 만든 다음 바로 폴리곤이 교차하는납니다 너무 멋져요 .. .. 재미 있습니다 .. 정보를 들으
나는 일단 곰 씨름.

그래 .. 계속 ... 잘 작동합니다.
l.lijith

5

A를 포함하려는 시도에는 D, E, F, G가 포함될 수 있습니다. 각 우편 번호 영역을 정의하는 정확한 경로가 없으면 문제를 해결할 수 없습니다.

이러한 데이터베이스를 찾은 다음 SPATIAL임의의 다각형을 사용하여 색인을 작성하십시오.


나는 공간 데이터가 필요하다는 것을 알고 있습니다. (그리고 그것을 가지고 있지만 Oracle 테이블에 있으며 변환 방법에 대한 많은 정보를 찾지 못했습니다). 문제는 데이터를 쿼리하는 방법을 알아내는 것입니다.
나는 곰 한 번 씨름했다.

새 코드의 성능에 만족한다면 아마도 최고 일 것입니다. 참고 : 쿼리는 모든 우편까지의 거리를 나열하므로 최적화 가능성이 없을 수 있습니다. (더 나은 코드를 얻으면
Rick James

그것은 내가 생각하는 것의 일종입니다. 시간이 초과되기 전에 현상금을 줄 것이고 어쨌든 절반을 얻습니다. 다른 반응을 먼저보고 싶을뿐입니다.
나는 곰 한 번 씨름했다.

3

당신은 잘못하고있다. 먼저 가능하면 공간 솔루션이 포함 된 RDMBS 인 PostGIS를 사용하십시오.

그런 다음이 단계를 수행하려고합니다.

  1. 인구 조사의 TIGER 데이터 세트에서 ZCTA (우편 번호 도표 영역)를 아래로 당깁니다 . 우편 번호는 실제로 확실하지 않습니다. 우편 번호는 공식적으로 USPS에서만 사용합니다. 정부를 포함한 모든 사람이이를 사용하기 때문에 가장 권위있는 두 번째 출처는 ZCTA 형태 파일이되었습니다.
  2. 이 모양 파일을 데이터베이스로 가져 오십시오. PostgreSQL을 사용하면 쉽게 사용할 수 있습니다 shp2pgsql
  3. 가져온 형상을 색인합니다.

    CREATE INDEX ON census_zcta USING gist (geog);
    ANALYZE census_zcta;
  4. shapefile에 대해 POI (Point-of-Interest) 조회를 실행하십시오. 귀하의 경우 관심 지점은 입력 코드입니다. 이것은 다음과 같습니다.

    SELECT *
    FROM census_zcta AS zcta
      WHERE ST_Intersects( zcta, ST_MakePoint(long,lat)::geog );

ℹ 1609.344 미터 = 1 마일

MySQL

MySQL을 사용하면

  1. ogr2ogr을 사용하여 Census Shapefile에 대한 MySQL insert 문을 출력하십시오.
  2. 사용 MBRIntersects공간 인덱스를 활용. 최종 검색어는 다음과 같아야합니다.

    SELECT *
    FROM zcta
    WHERE MBRIntersects( geom, Point(long,lat) )
      AND ST_Intersects ( geom, Point(long,lat) );

3
1) 내가 잘못하고 있다는 것을 안다. 그래서 내가 물었다. 2) 내가 일하는 회사는 usps 내부 우편 번호 경계에 대한 액세스 권한을 지불했습니다. 우리는이 프로젝트를 위해 usps와 직접 협력했으며, 3) 일반적으로 OP가 완전히 다른 툴셋을 사용하는 것은 적절한 대답이 아니라고 제안합니다.
나는 곰 한 번 씨름했다.

1
당신은 MySQL의 8이 물건의 모든 작업을 수행 할 수 있습니다 @iwrestledabearonce도 바로 대체 ST_DWithin와 함께MBRIntersects
에반 캐롤

1
"usps 내부 우편 번호 경계선에 대한 유료 액세스" 해당 제품의 이름을 알고 있습니까? AFAIK는 없습니다. (USPS는 2 개의 데이터 제품과 주소 디코딩을위한 일부 API를 제공하지만)
Evan Carroll

1
mysql에 대한 정보를 추가해 주셔서 감사합니다. +1. api는 공개되지 않으며 어떤 웹 사이트에도 표시되지 않습니다. 실제로 엔드 포인트 URL에는 도메인 이름이 없으므로 IP 주소에서 직접 요청합니다. 그러나 api가 존재한다는 것을 증명하기 위해이 문서에수록되어 있습니다 (EDDM을 나타내는 3은 내가 참조하는 것임
나는 곰과 씨름했다 한번.

1
EDDM / SelectZIP 엔드 포인트를 제거하는 경우 실제로 합법적 인 것 같습니다. 그것은 그 목적을 위해 광고되지는 않지만 그 끝점을 찾는 것에 대한 조언입니다.
Evan Carroll

1

GreatData.com 에서이 데이터 세트를 확인하십시오 (오픈 소스가 아니라 유료 서비스 임).

우편 중심 대신 인구 밀도를 사용합니다.

그리고 SQL Server 공간 데이터 유형을 사용하여 정확한 결과를 얻는 방법.

도움이 되었기를 바랍니다.


이 데이터 세트는 MySQL에서만 사용할 수 있습니까, 아니면 SQL Server에서만 사용할 수 있습니까?
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.