2017-02-24 12 views
5

Tôi hiện đang xây dựng một ứng dụng để hiển thị tất cả các cây được gắn thẻ địa lý ở một thành phố cụ thể. Các cột chính tôi đang sử dụng để lấy dữ liệu từ bảng như sau,Tìm nạp tất cả các điểm từ cơ sở dữ liệu bên trong hộp giới hạn tọa độ theo hướng đông bắc và tây nam trong MySQL

+-----------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+-----------------+-------------+------+-----+---------+-------+ 
| tree_geotags_id | int(11)  | NO | PRI | None |  | 
| lattitude_dl | double(9,7) | YES |  | NULL |  | 
| longitude_dl | double(9,7) | YES |  | NULL |  | 
+-----------------+-------------+------+-----+---------+-------+ 

Bảng có hơn 158.000 dòng.

Hiện nay tôi đang sử dụng các truy vấn sau đây để có được đầu ra của tôi,

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl, 
    SQRT(
     POW(69.1 * (gt.latitude_dl - [ center_lat ]), 2) + 
     POW(69.1 * ([ center_lon ] - gt.longitude_dl) * COS(gt.latitude_dl/57.3), 2) 
    ) AS distance 
    FROM tree_geotags_t gt 
    HAVING distance < 0.4 ORDER BY distance 

Điều này, không có gì, rồi nó lấy tất cả hồ sơ tại một bán kính 0,4. Tôi sử dụng cuộc gọi ajax để tìm nạp dữ liệu, mỗi khi tọa độ trung tâm của bản đồ thay đổi (trên bản đồ chảo hoặc thu phóng), chuyển dữ liệu đã tìm nạp thành định dạng geojson rồi tải nó lên bản đồ dưới dạng lớp. Vấn đề tôi gặp phải ở đây là ở những nơi có mật độ cây rất cao, phải mất một thời gian dài để bản đồ đặt tất cả các điểm và vì nó lấy nó trên bán kính, nó tải điểm ngay cả bên ngoài khung nhìn.

Tôi cần truy vấn chỉ tải dữ liệu trong tọa độ bên trong chế độ xem, sử dụng tọa độ đông bắc và tây nam làm ranh giới. Tôi đã tìm kiếm khá lâu ở đây nhưng không thể tìm thấy bất cứ điều gì phù hợp với yêu cầu của tôi. Hãy giúp tôi ra. Cảm ơn trước..!!

+0

Thêm mệnh đề WHERE loại trừ các mục nhập có vĩ độ/vĩ độ thấp/lớn hơn giá trị mục tiêu của bạn…? – CBroe

Trả lời

0

Bạn đang ở rất gần. Công thức khoảng cách của bạn (nếu không thô tục không chính xác) chứa hạt giống của kiểm tra hộp giới hạn của bạn.

Hãy thử điều này

SET @distance_unit := 69.0; /* for miles, use 111.045 for km. */ 
SET @radius := 1.0;   /* for radius */ 
SET @center_lat := target_latitude_in_degrees; 
SET @center_lon := target_longitude_in_degrees; 

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl 
    FROM tree_geotags_t gt 
WHERE gt.latitude_dl 
    BETWEEN @center_lat - (@radius/@distance_unit) /*east boundary*/ 
     AND @center_lat + (@radius/@distance_unit) /*west*/ 
    AND gt.longitude_dl 
    BETWEEN @center_lon - (@radius/(@distance_unit * COS(RADIANS(@center_lat)))) /*south*/ 
     AND @center_lon + (@radius/(@distance_unit * COS(RADIANS(@center_lat)))) /*north*/ 

Giả sử bạn biết phía đông, phía tây, phía bắc, và ranh giới phía nam của khung giới hạn của bạn thay vì trung tâm của nó. Đó là một sự thích nghi dễ dàng của đoạn mã trên.

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl 
    FROM tree_geotags_t gt 
WHERE gt.latitude_dl BETWEEN @east AND @west 
    AND gt.longitude_dl BETWEEN @south AND @north 

Câu hỏi về cách lấy được các cạnh của hộp giới hạn từ các góc của nó là tầm thường miễn là tọa độ hộp giới hạn ở độ. Nếu chúng được đưa ra trong một số đơn vị chiếu (như transverse UTM coordinate s), không có cách nào câu trả lời sẽ phù hợp với bài đăng Tràn ngăn xếp.

Truy vấn này có thể được thực hiện nhanh chóng bằng chỉ mục ghép trên (latitude_dl, longitude_dl, tree_geotags_id) Tìm kiếm theo vĩ độ sẽ sử dụng quét phạm vi chỉ mục và kinh độ và id có thể được truy xuất trực tiếp từ chỉ mục.

Có gì sai với công thức khoảng cách của bạn? It's cartesian, nhưng bạn cần công thức luật cosin hình cầu vì bạn đang đối phó với các tọa độ hình cầu.

Điều này sẽ không hoạt động gần cực bắc hoặc cực nam (vì cos (vĩ độ) có xu hướng về 0 ở đó) nhưng không sao; bạn đang đối phó với cây cối, và chúng chưa phát triển ở đó.

Đây là một bài viết toàn diện về chủ đề. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

+0

Cảm ơn bạn đã sửa chữa, nhưng tôi thực sự đang tìm kiếm một truy vấn sẽ giúp tôi có được tất cả các điểm bên trong khung nhìn. Tôi đang nhận tọa độ cho tất cả 4 góc, đông bắc, tây bắc, đông nam và tây nam. Tuy nhiên, tôi không thể xây dựng một truy vấn bằng cách sử dụng các giá trị này, để có được tất cả các cây ở giữa các tọa độ này. –

+0

Điều này là do, khi tôi phóng to, nó vẫn tải điểm bên ngoài chế độ xem. Nếu có thể tránh được, hiệu suất có thể trở nên nhanh hơn nhiều. –

+0

Tôi daresay bạn đang overthinking vấn đề. –

Các vấn đề liên quan