基于纬度,经度和半径查询附近位置的方法

时间:2014-10-29 07:27:32

标签: java json algorithm api

例如,我有一个像这样的JSON数据库:

[
  {
    "address": "America",
    "location": {
      "lng": 106.669633,
      "lat": 10.771883
    },
    "name": "724 (100) Pyrmon"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.668821,
      "lat": 10.767997
    },
    "name": "900 (100) Glassdor"
  },
  {
    "address": "328A, Đường Lê Hồng Phong, Ward 1, Quận 10, TP.HCM, Việt Nam",
    "location": {
      "lng": 106.676276,
      "lat": 10.763239
    },
    "name": "Booking Office Of Phuong Trang Buslines"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.690329,
      "lat": 10.768556
    },
    "name": "Opposite Pyrmont"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.691759,
      "lat": 10.763937
    },
    "name": "150 Washington"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.681683,
      "lat": 10.76965
    },
    "name": "596 - 598 Nguyễn Đình Chiểu"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.690158,
      "lat": 10.77509
    },
    "name": "17 Bà Huyện Thanh Quan"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.699749,
      "lat": 10.774052
    },
    "name": "101 Jase"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.682621,
      "lat": 10.778547
    },
    "name": "274 Lost Region"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.67305,
      "lat": 10.765617
    },
    "name": "66 Office Base"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.689733,
      "lat": 10.763817
    },
    "name": "118 Yen The"
  },
  {
    "address": "America",
    "location": {
      "lng": 106.69313,
      "lat": 10.765497
    },
    "name": "112 Glangdie"
  },
]

现在我必须制作一个算法(用任何编程语言,如果在Java中,它会很好),它将输入纬度,经度和距离D.输出将是JSON数据,其中包含距离输入距离小于D的附近地点的信息。

我已经研究过这个算法,特别是在维基百科上,http://en.wikipedia.org/wiki/Geographical_distance#Singularities_and_discontinuity_of_latitude.2Flongitude

但是我找不到从数据库查询的方法,如果数据库是 BIG ,我必须查询每一行(或者在这种情况下是每个JSON对象)来与所选位置进行比较,这将是一个非常缓慢的表现。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以尝试通过使用输入半径过滤围绕圆的外接正方形内的位置来减少比较。在SQL中,它看起来像:WHERE lng>=(:lng - :radius) AND lng<=(:lng + :radius) AND lat>=(:lat - :radius) AND lat<=(:lat + :radius),其中:lng:lat - 输入坐标,:radius - 以弧度为单位的输入半径。