Vấn đề nhận được zips trong bán kính thông qua MySQL


9

Tôi có một bảng mã zip bao gồm trung tâm lat, lng cho mỗi mã zip. Tôi sử dụng nó để lấy danh sách mã zip trong bán kính dặm cho trước từ bất kỳ điểm tùy ý nào.

Tôi nhận ra rằng, chỉ vì điểm trung tâm của zip không nằm trong bán kính nhất định, không có nghĩa là chính zip không nằm trong bán kính.

Tôi đã sử dụng các kỹ năng nghệ thuật siêu tiên tiến của mình để minh họa điểm ở đây:

nhập mô tả hình ảnh ở đây

  • Các đốm màu xanh lá cây đại diện cho mã zip A, B và C.

  • Các vết bẩn màu đỏ là trung tâm địa lý cho mỗi mã zip

  • Dấu chấm fuchsia là vị trí mục tiêu và ..

  • Vòng tròn màu xanh sần là bán kính 1 dặm từ vị trí mục tiêu

Nếu tôi chạy truy vấn cho tất cả các mã zip trong bán kính 1 dặm từ vết nhòe màu hồng, chỉ có mã zip B và C sẽ được trả về vì điểm trung tâm của zip A không nằm trong bán kính một dặm, mặc dù màu hồng tự làm nhòe rõ ràng là trong mã zip 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

Làm thế quái nào tôi viết một truy vấn sẽ bao gồm zip A trong kết quả?

Tôi có quyền truy cập vào không gian / hình học cho mỗi mã zip mà tôi có thể thêm vào bảng nếu cần, nhưng tôi không biết làm thế nào tôi sẽ sử dụng nó cho mục đích này trong MySQL.


Chỉnh sửa : Tôi đã dành một ngày để đọc tài liệu Oracle và MySQL cho dữ liệu không gian và quản lý để chuyển đổi thành công dữ liệu không gian của tôi sang MySQL . Làm cách nào để viết một truy vấn tương tự sử dụng cột hình học thay vì lat và long? Tôi đang sử dụng dữ liệu 2D .. hình học chỉ là đa giác và đa hình ..

Tôi nghĩ rằng tôi đã tìm ra nó ..

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

Bây giờ tôi sẽ để tiền thưởng mở trong trường hợp ai đó có giải pháp tốt hơn, hiệu quả hơn.

Câu trả lời:


7

Từ lập chỉ mục và truy vấn dữ liệu không gian trong Oracle trong Hướng dẫn dành cho nhà phát triển không gian của Oracle® 11g Phiên bản 2 (11.2):

Truy vấn dữ liệu không gian

Spatial sử dụng mô hình truy vấn hai lớp với các hoạt động của bộ lọc chính và phụ để giải quyết các truy vấn không gian và các phép nối không gian. Thuật ngữ hai lớp chỉ ra rằng hai hoạt động riêng biệt được thực hiện để giải quyết các truy vấn. Nếu cả hai thao tác được thực hiện, tập kết quả chính xác được trả về.

Bạn không thể nối tên liên kết cơ sở dữ liệu (dblink) vào tên của bảng không gian trong truy vấn nếu chỉ mục không gian được xác định trên bảng đó.

Truy vấn không gian

Trong một chỉ mục cây R không gian, mỗi hình học được thể hiện bằng hình chữ nhật giới hạn tối thiểu (MBR). Hãy xem xét lớp sau có chứa một số đối tượng trong Hình 1. Mỗi đối tượng được gắn nhãn với tên hình học của nó (geom_1 cho chuỗi dòng, geom_2 cho đa giác bốn cạnh, geom_3 cho đa giác tam giác và geom_4 cho hình elip) và MBR xung quanh mỗi đối tượng được biểu thị bằng một đường đứt nét.

Hình 1 Hình học với MBR

Mô tả về "Hình 1 Hình học với MBR"

Một truy vấn không gian điển hình là yêu cầu tất cả các đối tượng nằm trong cửa sổ truy vấn, nghĩa là hàng rào hoặc cửa sổ được xác định. Cửa sổ truy vấn động đề cập đến một khu vực hình chữ nhật không được xác định trong cơ sở dữ liệu, nhưng phải được xác định trước khi sử dụng. Hình 2 cho thấy các hình học tương tự như trong Hình 1, nhưng thêm một cửa sổ truy vấn được biểu thị bằng hộp đường chấm chấm nặng.

Lớp Hình 2 với Cửa sổ Truy vấn

Mô tả "Lớp Hình 2 với Cửa sổ Truy vấn"

Trong Hình 2, cửa sổ truy vấn bao gồm các phần của hình học geom_1 và geom_2, cũng như một phần của MBR cho geom_3 nhưng không có hình học geom_3 thực tế. Cửa sổ truy vấn không bao gồm bất kỳ phần nào của hình học geom_4 hoặc MBR của nó.

Toán tử lọc chính

Toán tử SDO_FILTER, thực hiện phần bộ lọc chính của quy trình hai bước liên quan đến mô hình xử lý truy vấn không gian Oracle. Bộ lọc chính sử dụng dữ liệu chỉ mục để xác định chỉ khi một tập hợp các cặp đối tượng ứng cử viên có thể tương tác. Cụ thể, bộ lọc chính kiểm tra xem MBR của các đối tượng ứng cử viên có tương tác hay không, chứ không phải chính các đối tượng đó có tương tác hay không. Cú pháp toán tử SDO_FILTER như sau:

SDO_FILTER(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2)

Trong cú pháp trước:

  • hình học1 là một cột loại SDO_GEOMETRY trong một bảng. Cột này phải được lập chỉ mục không gian.

  • hình học2 là một đối tượng của loại SDO_GEOMETRY. Đối tượng này có thể hoặc không thể đến từ một bảng. Nếu nó đến từ một bảng, nó có thể hoặc không được lập chỉ mục không gian.

  • param là một chuỗi tùy chọn loại VARCHAR2. Nó có thể chỉ định một hoặc cả hai từ khóa min_resolution và max_resolution.

Các ví dụ sau chỉ thực hiện thao tác bộ lọc chính (không có hoạt động của bộ lọc thứ cấp). Họ sẽ trả về tất cả các hình học được hiển thị trong Hình 2 có MBR tương tác với cửa sổ truy vấn. Kết quả của các ví dụ sau là hình học geom_1, geom_2 và geom_3.

Ví dụ1 thực hiện thao tác lọc chính mà không chèn cửa sổ truy vấn vào bảng. Cửa sổ sẽ được lập chỉ mục trong bộ nhớ và hiệu suất sẽ rất tốt.

Bộ lọc chính của Ví dụ1 với Cửa sổ Truy vấn Tạm thời

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';   

Trong ví dụ1, (x1, y1) và (x2, y2) là các góc dưới bên trái và phía trên bên phải của cửa sổ truy vấn.


1
Thật tuyệt .. Vì vậy, tôi nên tạo hình học hình tròn để biểu thị bán kính và sau đó chỉ cần xem đa giác nào giao nhau .. thú vị .. thx cho thông tin
Tôi đã vật lộn một con gấu một lần.

Yeah..go on ... Hy vọng nó hoạt động tốt cho bạn.
l.lijith

5

Bất kỳ nỗ lực nào để bao gồm A có thể sẽ bao gồm D, E, F, G. Vấn đề không thể được giải quyết mà không có đường dẫn chính xác xác định từng khu vực mã zip.

Tìm một cơ sở dữ liệu như vậy, sau đó xây dựng một SPATIALchỉ mục bằng cách sử dụng các đa giác tùy ý.


Tôi biết tôi cần dữ liệu không gian (và tôi có dữ liệu đó, nhưng nó nằm trong bảng Oracle và tôi không tìm thấy nhiều thông tin về cách chuyển đổi nó) .. vấn đề là tìm ra cách truy vấn dữ liệu.
Tôi vật lộn một con gấu một lần.

Nếu bạn hài lòng với hiệu suất của mã mới, đó có lẽ là điều tốt nhất. Lưu ý: Truy vấn liệt kê khoảng cách đến mỗi zip, vì vậy có thể không có tiềm năng tối ưu hóa. (Tôi sẽ ngạc nhiên một cách thú vị nếu bạn nhận được mã tốt hơn.)
Rick James

đó cũng là những gì tôi đang nghĩ Tôi sẽ đưa tiền thưởng cho bạn trước khi hết giờ và dù sao bạn cũng nhận được một nửa số tiền đó .. chỉ muốn xem những phản hồi khác tôi có thể nhận được trước tiên.
Tôi vật lộn một con gấu một lần.

3

Bạn đang làm sai. Đầu tiên, nếu có thể, hãy sử dụng PostGIS - đây là giải pháp RDMBS hàng đầu với giải pháp Không gian.

Sau đó, bạn muốn làm theo các bước sau.

  1. Kéo xuống ZCTA (Khu vực lập bảng mã Zip) từ bộ dữ liệu TIGER của điều tra dân số . Mã zip không thực sự biết chắc chắn. Chính thức, mã zip chỉ được sử dụng nội bộ bởi USPS. Bởi vì tất cả mọi người sử dụng chúng, bao gồm cả chính phủ, nguồn có thẩm quyền thứ hai đã trở thành các shapefiles ZCTA.
  2. Nhập các shapefiles này vào cơ sở dữ liệu của bạn, với PostgreSQL bạn có thể dễ dàng sử dụng shp2pgsql
  3. Lập chỉ mục hình học bạn đã nhập.

    CREATE INDEX ON census_zcta USING gist (geog);
    ANALYZE census_zcta;
  4. Chạy truy vấn Điểm ưa thích (POI) đối với các shapefiles. Điểm đáng chú ý trong trường hợp của bạn là Dây đầu vào, nó sẽ trông như thế này,

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

1609.344 mét = 1 dặm

MySQL

Với MySQL bạn sẽ có

  1. Sử dụng ogr2ogr để xuất các câu lệnh chèn MySQL cho Shapefile điều tra dân số.
  2. Sử dụng MBRIntersectsđể sử dụng các chỉ số không gian. Kết thúc truy vấn sẽ trông giống như

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

3
1) tôi biết tôi đã làm sai. đó là lý do tại sao tôi hỏi 2) công ty tôi làm việc có quyền truy cập phải trả tiền cho các ranh giới mã zip nội bộ. chúng tôi đã làm việc trực tiếp với usps cho dự án này và 3) nói chung, cho thấy OP sử dụng một bộ công cụ hoàn toàn khác không phải là một câu trả lời thích hợp.
Tôi vật lộn một con gấu một lần.

1
@iwrestledabearonce Bạn có thể thực hiện tất cả những thứ này với MySQL 8, chỉ cần thay thế ST_DWithinbằngMBRIntersects
Evan Carroll

1
"truy cập phải trả tiền để sử dụng ranh giới mã zip nội bộ" bạn có biết tên của sản phẩm đó không? AFAIK không có điều đó. (mặc dù USPS cung cấp 2 sản phẩm dữ liệu và một số API để giải mã địa chỉ)
Evan Carroll

1
cảm ơn bạn đã thêm thông tin về mysql. +1. api không công khai và nó không được liệt kê trên anywebsite, trên thực tế, url điểm cuối thậm chí không có tên miền, chúng tôi yêu cầu nó trực tiếp từ địa chỉ IP. tuy nhiên, để chứng minh api tồn tại, nó được liệt kê trong tài liệu này (3 đề cập đến EDDM là những cái tôi đang đề cập đến) usps.com/business/web-tools-apis/archive/ trộm
Tôi đã vật lộn Một lần.

1
Điều đó thực sự có vẻ hợp pháp nếu bạn rút khỏi điểm cuối EDDM / SelectZIP. Điều đó không được quảng cáo cho mục đích đó, nhưng để tìm ra điểm cuối đó.
Evan Carroll

1

Kiểm tra bộ dữ liệu này từ GreatData.com (lưu ý rằng đây không phải là nguồn mở mà là dịch vụ phải trả tiền).

Họ sử dụng mật độ dân số thay vì trung tâm của zip.

Và làm thế nào để sử dụng loại dữ liệu không gian máy chủ sql để có được kết quả chính xác nhanh.

Hi vọng điêu nay co ich.


Dữ liệu này có sẵn cho MySQL hay chỉ dành cho SQL Server?
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.