MongoDB tìm khoảng cách

Làm cách nào để tính khoảng cách tuyến đường giữa nhiều điểm GeoJSON trong MongoDB?

Dưới đây là một số ví dụ về dữ liệu của tôi

{ 
 _id: 599cfc236ed0d81c98007f66
 tracerId: 59a07ea26ed0d81d78001acd
 loc { 
      type: "2dsphere",
      coordinates: [ 159.9, -37.92 ]
     },
 date: 2017-08-26 00:16:42,
 speed: 58,
}
{ 
 _id: 59a074d46ed0d81d78001acc
 tracerId: 59a07ea26ed0d81d78001acd
 loc { 
      type: "2dsphere",
      coordinates: [ 160, -38.20 ]
     },
 date: 2017-08-26 00:18:42,
 speed: 75,
}
{ 
 _id: 59a074d46ed0d81d78ac11cc
 tracerId: 59a07ea26ed0d81d78001acd
 loc { 
      type: "2dsphere",
      coordinates: [ 160.222, -38.92 ]
     },
 date: 2017-08-26 00:20:42,
 speed: 60,
}
- stackoverflow. com

ghi bàn. 2

câu trả lời được chấp nhận

Như đã chỉ ra trong các nhận xét, sẽ cố gắng vẽ một bức tranh tương tự ở đây bằng Java. Giả sử tên cơ sở dữ liệu của bạn là

{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }
7 và tên bộ sưu tập là
{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }
8 và loại tài liệu là
{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }
9 có thể được mô hình hóa thành

Về cơ bản, bạn sẽ tạo một trường có vĩ độ/kinh độ được lưu trữ dưới dạng một mảng hoặc dưới dạng tài liệu phụ, đại loại như một trong số này

{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }

Sau đó lập chỉ mục trường loc mới một cách thích hợp

db.places.ensureIndex( { loc : "2d" } )

Cuối cùng, bạn có thể sử dụng một trong các toán tử để truy vấn một điểm cho 20 kết quả gần nhất

db.places.find( { loc : { $near : [50,50] } } ).limit(20)

Tất nhiên, bạn có thể chỉ cần sử dụng MongoDB để lưu trữ dữ liệu, sau đó lấy thông tin ra khỏi DB bằng hàm find() và thực hiện tính toán phía máy khách nhưng tôi cho rằng đó không phải là điều bạn muốn làm

Nếu phần khoảng cách của phương trình là những gì bạn muốn

http. //www. mongodb. org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand

Toán tử $geoNear cũng sẽ trả về khoảng cách. Một ví dụ

> db.runCommand( { geoNear : "places" , near : [50,50], num : 10 } );
{
        "ns" : "test.places",
        "near" : "1100110000001111110000001111110000001111110000001111",
        "results" : [
                {
                        "dis" : 69.29646421910687,
                        "obj" : {
                                "_id" : ObjectId("4b8bd6b93b83c574d8760280"),
                                "y" : [
                                        1,
                                        1
                                ],
                                "category" : "Coffee"
                        }
                },
                {
                        "dis" : 69.29646421910687,
                        "obj" : {
                                "_id" : ObjectId("4b8bd6b03b83c574d876027f"),
                                "y" : [
                                        1,
                                        1
                                ]
                        }
                }
        ],
        "stats" : {
                "time" : 0,
                "btreelocs" : 1,
                "btreelocs" : 1,
                "nscanned" : 2,
                "nscanned" : 2,
                "objectsLoaded" : 2,
                "objectsLoaded" : 2,
                "avgDistance" : 69.29646421910687
        },
        "ok" : 1
}

Các yếu tố

db.places.ensureIndex( { loc : "2d" } )
0 là những gì bạn đang tìm kiếm, cũng có một tùy chọn khoảng cách hình cầu

Đối với tất cả điều này, cách sử dụng khoảng cách và hơn thế nữa, hãy xem tại đây để biết thêm thông tin về chỉ mục địa lý và cách sử dụng chúng

Bạn có thể giới hạn truy vấn khoảng cách đối với những tài liệu nằm trong khoảng cách tối đa của một điểm. Bạn chỉ định khoảng cách tối đa bằng cách sử dụng các đơn vị được chỉ định bởi hệ tọa độ. Ví dụ: nếu hệ tọa độ sử dụng mét, bạn chỉ định khoảng cách tối đa tính bằng mét

Để chỉ định khoảng cách bằng phương pháp find() , hãy sử dụng $maxDistance operator. Use the following form:

db.collection.find( { <location field> : { $near : [ x , y ] , $maxDistance : <distance> } } )

Để chỉ định khoảng cách bằng lệnh geoNear , hãy sử dụng maxDistance option. Use the following form:

db.runCommand( { geoNear: "collection", near: [ x, y ], maxDistance: <distance> } )

Giới hạn số lượng kết quả¶

Theo mặc định, các truy vấn không gian địa lý sử dụng phương thức find() trả về 100 tài liệu, được sắp xếp theo khoảng cách. Để giới hạn kết quả khi sử dụng phương thức find() , hãy sử dụng limit() method, as in the following prototype:

db.collection.find( { <location field>: { $near: [ x, y ] } } ).limit(<n>)

Để giới hạn tập kết quả khi sử dụng lệnh geoNear , hãy sử dụng num option. Use the following form:

________số 8

Để giới hạn kết quả tìm kiếm không gian địa lý theo khoảng cách, hãy xem Truy vấn khoảng cách

Truy vấn giới hạn¶

Truy vấn có giới hạn trả về tài liệu trong hình dạng được xác định bằng toán tử $within . Các truy vấn giới hạn của MongoDB hỗ trợ các hình dạng sau.

  • vòng kết nối
  • Hình chữ nhật
  • đa giác

Truy vấn giới hạn không trả về kết quả được sắp xếp. Kết quả là MongoDB có thể trả về các truy vấn giới hạn nhanh hơn các truy vấn lân cận. Truy vấn giới hạn có dạng sau

db.places.find( { loc: { $near: [ -70, 40 ] } } )
0

Các phần sau đây mô tả từng hình dạng được hỗ trợ bởi các truy vấn có giới hạn

Vòng kết nối¶

Để truy vấn tài liệu có tọa độ bên trong đường bao của hình tròn, hãy chỉ định tâm và bán kính của hình tròn bằng toán tử $within . Xem xét truy vấn nguyên mẫu sau. $center option. Consider the following prototype query:

db.places.find( { loc: { $near: [ -70, 40 ] } } )
1

Truy vấn ví dụ sau trả về tất cả các tài liệu có tọa độ tồn tại trong vòng tròn có tâm là [-74, 40. 74] và có bán kính 10 , sử dụng chỉ mục không gian địa lý trên loc field:

db.places.find( { loc: { $near: [ -70, 40 ] } } )
2

Toán tử $within sử dụng $center tương tự . MongoDB không sắp xếp các truy vấn sử dụng toán tử $maxDistance, but $center has different performance characteristics. MongoDB does not sort queries that use the $within không được sắp xếp, không giống như các truy vấn sử dụng $near operator.

Hình chữ nhật¶

Để truy vấn tài liệu có tọa độ bên trong đường viền của hình chữ nhật, hãy chỉ định góc dưới bên trái và góc trên bên phải của hình chữ nhật bằng cách sử dụng $within operator and $box option. Consider the following prototype query:

db.places.find( { loc: { $near: [ -70, 40 ] } } )
3

Truy vấn sau đây trả về tất cả các tài liệu có tọa độ tồn tại trong hình chữ nhật có góc dưới bên trái tại [ 0,[0,[0,[0,[0, 0 ] and the upper-right corner is at [ 3, 3 ], using a geospatial index on the loc field:

db.places.find( { loc: { $near: [ -70, 40 ] } } )
4

Đa giác¶

1. 9 新版功能. Hỗ trợ truy vấn đa giác.

Để truy vấn các tài liệu có tọa độ bên trong đa giác, hãy chỉ định các điểm của đa giác trong một mảng, sử dụng toán tử $within với . MongoDB tự động kết nối điểm cuối cùng trong mảng với điểm đầu tiên. Xem xét truy vấn nguyên mẫu sau. $polygon option. MongoDB automatically connects the last point in the array to the first point. Consider the following prototype query:

db.places.find( { loc: { $near: [ -70, 40 ] } } )
5

Truy vấn sau trả về tất cả tài liệu có tọa độ tồn tại trong đa giác được xác định bởi [ [0,0], [3,3], [6,0] ]:

db.places.find( { loc: { $near: [ -70, 40 ] } } )
6

Truy vấn các kết quả phù hợp chính xác¶

Bạn có thể sử dụng db. thu thập. find() để truy vấn đối sánh chính xác trên một vị trí. Các truy vấn này có dạng sau.

db.places.find( { loc: { $near: [ -70, 40 ] } } )
7

Truy vấn này sẽ trả về bất kỳ tài liệu nào có giá trị [ x, y ].

Các truy vấn không gian địa lý chính xác chỉ có thể áp dụng cho một số trường hợp lựa chọn hạn chế, các truy vấn gần và giới hạn cung cấp nhiều kết quả hữu ích hơn cho nhiều ứng dụng hơn

Tính Khoảng cách Sử dụng Hình học Hình cầu¶

Khi bạn truy vấn bằng cách sử dụng chỉ mục 2d , MongoDB sẽ tính toán khoảng cách bằng hình học phẳng theo mặc định, là mô hình điểm trên một bề mặt phẳng.

Theo tùy chọn, bạn có thể hướng dẫn MongoDB tính toán khoảng cách bằng cách sử dụng hình học hình cầu, mô hình này mô hình hóa các điểm trên một bề mặt hình cầu. Hình học cầu rất hữu ích để lập mô hình tọa độ trên bề mặt Trái đất

Để tính khoảng cách bằng hình cầu, hãy sử dụng các tùy chọn và toán tử truy vấn hình cầu của MongoDB

  • find() với toán tử $nearSphere .
  • find() với $centerSphere .
  • geoNear với { hình cầu. Tùy chọn true } .

也可以参考

地里空间

Để biết thêm thông tin về sự khác biệt giữa tính toán khoảng cách phẳng và hình cầu, hãy xem Tính toán khoảng cách

Làm cách nào để tìm khoảng cách trong MongoDB?

Sử dụng $geoNear để biết khoảng cách giữa một vị trí nhất định và người dùng.

Công thức Haversine hoạt động như thế nào?

Công thức haversine xác định khoảng cách vòng tròn lớn giữa hai điểm trên một hình cầu dựa trên kinh độ và vĩ độ của chúng . Quan trọng trong điều hướng, nó là trường hợp đặc biệt của một công thức tổng quát hơn trong lượng giác cầu, định luật haversine, liên quan đến các cạnh và góc của các tam giác cầu.

Làm cách nào để tìm khoảng cách giữa hai địa điểm trong laravel?

Hãy thử đoạn mã dưới đây. CHỌN vĩ độ, kinh độ, SQRT( POW(69. 1 * (vĩ độ - [startlat]), 2) + POW(69. 1 * ([startlng] - kinh độ) * COS(vĩ độ / 57. 3), 2)) Khoảng cách AS.