我有一个带有一堆lat长坐标的csv文件。我还有一个csv文件,其中包含一些特定人员将要站立的职位。对于第二个文件中的每个点,我需要确定它们是否接近(低于1英里)第一个文件中的任何点。我在每个文件中都有大约500个点。
我正在尝试用Java解决这个问题,我想我会使用读取第一个文件的内容并将其放入某种易于搜索的结构中,这样我就不需要保留做IO操作。我不清楚我应该掌握什么类型的数据结构,以便我可以轻松搜索在给定点的半径范围内的数据结构。有人能指出我正确的方向吗?有什么方法可以组织这个,这样我就不需要进行n ^ 2比较了吗?
答案 0 :(得分:0)
这就是我要做的。
按纬度顺序对两个文件中的所有点进行排序。然后同时遍历两个列表,这样对于文件1中的每个点,您将得到文件2中的点列表,其纬度圈在距文件1的点的一英里范围内。您可以使用{{1这里的某个地方subList
的方法。
仍然在文件1中的点的上下文中,过滤掉经度与点1相差超过一英里的子列表中的点。然后,您将拥有一对点,这些点都在一英里的经度内,并且在一英里的纬度范围内。
对于每个这样的对,进行精确计算以确定它们是否真的在彼此相距一英里的“真实距离”内。
答案 1 :(得分:0)
最简单的方法是定义粗网格并将点从第一个列表中闪烁到网格单元格中。您需要为每个点计算一个单元格“id”,并根据该ID输入一个哈希表。 完成后,您可以通过查找正确的单元格并枚举其内容(以及相邻单元格的内容),轻松查找给定纬度/经度的附近点。 诀窍是将lat / long转换为cell id。一种方法是将纬度/长度向上舍入。因此,例如,将(47.43402067,-121.89068567)对转换为“47_-121”字符串。这可能太粗糙,因为在赤道一度大约70英里。您可以通过舍入到某个小数点来收紧它: 例如“47.43_-122.89”。 请注意,当您向北或向南行进时,单元格宽度将变窄。例如,在北纬60度,小区将比赤道窄两倍(它只能覆盖35英里)。
您还可以使用JTS拓扑套件等库中的现有地理空间索引,这些索引可以提供更大的灵活性。
答案 2 :(得分:0)
听起来您希望根据纬度和经度将积分存储在k-d tree。
如果我们知道我们希望所有点在某个点D
的某个距离(lat, lon)
内,则可以很容易地计算与d_lat
单位对应的纬度D
的差异距北/南的距离,以及经纬度为d_lon
或D
的东/西距离的lat-d_lat
单位对应的经度lat+d_lat
的差异最接近a极。使用此功能,我们会在树中为lat-d_lat
和lat+d_lat
以及经度介于lon-d_lon
和lon+d_lon
之间的所有点执行orthogonal range search。然后,我们需要计算每个距离,并拒绝距离D
(lat, lon)
以上的距离 - 但是我们不需要做与没有树一样多的计算(我们应该只会结束)拒绝接近此阶段的大约1-pi / 4 = 21.5%的分数。)
当然,如果它们与您相关,您需要考虑边缘情况:
d_lon
范围内,你需要在树中进行两次不同的搜索(180度的任一侧)。(lat, lon)
在极点的d_lat
纬度范围内,只需查看lat-d_lat
或lat+d_lat
离极点最远的南/南的所有内容。