2012-06-20 26 views
25

Tôi muốn tìm một địa điểm gần nhất từ ​​sau bảng cơ sở dữ liệuLàm thế nào để tìm vị trí gần nhất bằng cách sử dụng vĩ độ và kinh độ từ cơ sở dữ liệu sql?

Address       Latitude    longitude 

Kathmandu 44600, Nepal    27.7     85.33333330000005 
Los, Antoniterstraße    37.09024    -95.71289100000001 
Sydney NSW, Australia    49.7480755    8.111794700000019 
goa india       15.2993265    74.12399600000003 

Tôi đã lấy này tất cả dữ liệu từ bản đồ google. Ở đây tôi phải tìm vị trí gần nhất từ ​​một nơi. Giả sử tôi đang ở vị trí Surkhet vĩ độ của nó là 28,6 và kinh độ là 81,6, làm thế nào tôi có thể tìm thấy nơi gần nhất từ ​​nơi Surkhet.

+0

bạn đã xem liên kết * có liên quan * ở bên trái >>> một số người trong số họ nhìn về chủ đề cho bạn. –

+2

@Dagon - Tôi giả sử bạn có nghĩa là * khác * còn lại? –

+0

@Damien_The_Unbeliever um tôi sống ở bán cầu phía nam, bên trái của chúng tôi là quyền của bạn :-) –

Trả lời

16

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

Đây là Query nhất

+0

khoảng cách 25 ở đây là trong dặm ?? – Sripaul

+7

Có. 3959 - Miles, 6371 - Kilômet –

+0

@Krishna Karki, liệu điều này có trả về một lat và lon nếu tôi đặt nó vào chức năng? –

67

địa điểm Tìm kiếm lân cận với MySQL

Dưới đây là các câu lệnh SQL mà sẽ tìm ra 20 địa điểm gần nhất mà là trong vòng bán kính 25 dặm về phía 37, -122 phối hợp. Nó tính toán khoảng cách dựa trên vĩ độ/kinh độ của hàng đó và vĩ độ/kinh độ mục tiêu, sau đó chỉ yêu cầu các hàng có giá trị khoảng cách nhỏ hơn 25, đặt hàng toàn bộ truy vấn theo khoảng cách và giới hạn nó thành 20 kết quả. Để tìm kiếm theo km thay vì dặm, thay thế 3959 với 6371.

Bảng Cấu trúc:

id,name,address,lat,lng 

LƯU Ý - Đây vĩ độ = 37 & kinh độ = -122. Vì vậy, bạn chỉ cần vượt qua của riêng bạn.

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * 
cos(radians(lng) - radians(-122)) + sin(radians(37)) * 
sin(radians(lat)))) AS distance FROM your_table_name HAVING 
distance < 25 ORDER BY distance LIMIT 0 , 20; 

Bạn có thể tìm thấy chi tiết here.

+3

Cũng đi qua cái này. Nó giải thích tất cả mọi thứ theo cách tốt đẹp. https://developers.google.com/maps/articles/phpsqlsearch – Scorpion

+0

Cảm ơn bạn rất nhiều vì đã truy vấn. Tôi phải tìm vị trí gần nhất từ ​​Surkhet vĩ độ là 28,6 và kinh độ là 81,6. Cách đưa điểm này vào truy vấn này .. Vui lòng đề xuất tôi .. :) –

+0

Xem ghi chú. Tôi đã chỉnh sửa câu trả lời của mình. Bạn cần phải vượt qua lat & lng của bạn thay cho 37 & -122, – Scorpion

3

Để tìm vị trí lân cận, bạn có thể sử dụng Geocoder Class. Vì bạn có Geopoints (vĩ độ và kinh độ), mã hóa địa lý đảo ngược có thể được sử dụng. Mã hóa địa lý đảo ngược là quá trình chuyển đổi tọa độ (vĩ độ, kinh độ) thành địa chỉ (một phần). Khám phá this để biết thêm thông tin.

0

SQL có một vấn đề. Trong bảng như:

`ubicacion` (
    `id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT , 
    `latitud` DOUBLE NOT NULL , 
    `longitud` DOUBLE NOT NULL , 
    PRIMARY KEY (`id_ubicacion`)) 

Sự thay đổi id_ubicacion khi sử dụng:

SELECT `id_ubicacion` , (3959 * ACOS(COS(RADIANS(9.053933)) * COS(RADIANS(latitud)) * COS(RADIANS(longitud) - RADIANS(- 79.421215)) + SIN(RADIANS(9.053933)) * SIN(RADIANS(latitud)))) AS distance 
FROM ubicacion 
HAVING distance <25 
ORDER BY distance 
LIMIT 0 , 20 
0
sesach : (3959 * acos(cos(radians('.$_REQUEST['latitude'].')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.$_REQUEST['longitude'].')) + sin(radians('.$_REQUEST['latitude'].')) * sin(radians(latitude)))) <='.$_REQUEST['mile']; 
0

Khi phương pháp này nên thực hiện nó là đẹp hơn để lọc đầu tiên trên vĩ độ và kinh độ, và sau đó tính toán approximative khoảng cách bình phương . Đối với các nước Bắc Âu, nó sẽ giảm khoảng 0,3% trong vòng 1000 km.

Vì vậy, thay vì tính toán khoảng cách như:

dist_Sphere = r_earth * acos (sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1) 

người ta có thể tính giá trị gần đúng (giả thiết rằng lat = lat 1 gần lat 2) như

const cLat2 = cos lat^2 
const r_earth2 = r_earth^2 
dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2) 

Sắp xếp theo Dist_App 2 và sau đó chỉ cần lấy căn bậc hai ra khỏi kết quả.

0
SELECT latitude, longitude, SQRT(
    POW(69.1 * (latitude - [startlat]), 2) + 
    POW(69.1 * ([startlng] - longitude) * COS(latitude/57.3), 2)) AS distance 
FROM TableName HAVING distance < 25 ORDER BY distance; 

nơi [starlat][startlng] là vị trí bắt đầu từ đâu đo khoảng cách và 25 là khoảng cách trong km.

Bạn nên thực hiện quy trình được lưu trữ để sử dụng truy vấn vì nó sẽ kiểm tra nhiều hàng để tìm kết quả.

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