首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何根据Java中的两个纬度+经度点测量距离并创建边界框?

在Java中,您可以使用Geometry类根据经度和纬度计算两点之间的距离。然后,通过计算出的距离和一点的位置创建一个边界框。首先,需要获取当前地图服务或地图API以提供位置数据。常用的地图服务和地图API有Google Maps v3Open Street Map等,您可以将这些服务集成到您的项目中。

下面是一个用例,展示了如何计算两点之间的距离并创建边界框:

代码语言:java
复制
// 为您的地图服务或地图API创建一个连接实例

// 使用Google Maps API创建一个地图实例实例
public static void main(String[] args) throws IOException {
    // 创建地图实例
    MapsInitializer.initialize();

    // 计算两点之间的距离
    double distance = calculateDistance(
        "北京市", // 起点经度,格式:"经度纬度"
        "106.407496", // 起点纬度
        "39.904221", // 终点纬度
        "116.407370" // 终点经度
    );

    // 创建边界框
    BoundingBox bbox = createBoundingBox(
        "百度地图", // 图层名称,可选
        null, // 坐标类型,可选
        distance, // 矩形大小,默认单位为米
        1 // 填充比例,默认为1.0
    );

    // 将边界框转换为字符串
    String bboxJSON = JSONObject.toJSONString(bbox);
    System.out.println("边界框: " + bboxJSON);
}

// 计算两点之间的距离
private static double calculateDistance(
    String start, // 起点的经度和纬度格式,"经度纬度"
    double startLat, // 起点的纬度
    double startLong, // 起点的经度
    String end, // 目的地的经度和纬度格式
    double endLat,
    double endLong
) throws IOException {
    // 将输入字符串转换为纬度(float)和经度(float)
    double lat1 = Double.parseDouble(start.substring(0, latSeparatorIndex));
    double lon1 = Double.parseDouble(start.substring(latSeparatorIndex + lonSeparatorLength));
    double lat2 = Double.parseDouble(end.substring(0, latSeparatorIndex));
    double lon2 = Double.parseDouble(end.substring(latSeparatorIndex + lonSeparatorLength));

    // 创建Geometry实例
    Geometry geometry = ShapeUtility.createEllipsoidGreatCircles(lat1, lon1, lat2, lon2);

    // 计算两点间的距离
    double distance = geographyService.getDistanceInKm(geometry.getCentroid().getGeometry(), new DefaultLatLng(0, 0));

    return distance;
}

// 根据距离和位置点创建边界框
private static BoundingBox createBoundingBox(
    String layerName, // 图层名称
    String coordinateType, // 坐标类型
    double distance, // 矩形大小,默认单位为米
    double fillFraction // 填充比例,默认为1.0
) throws JSONException {
    // 设置填充比例
    double scale = 0.8 / distance;

    // 获取当前地图服务或地图API提供的地理坐标系
    CoordinateSystem cs = GeographyLibrary.WGS84.getCoordinateSystem();

    // 创建位置点
    Position position = Position.fromDegrees(
        (coordinateType == null ? 0 : Integer.parseInt(coordinateType)),
        (coordinateType == null ? 0 : Integer.parseInt(coordinateType)),
        distance
    );

    // 创建矩形边界框
    BoundingBox bbox = new BoundingBox();
    bbox.setCentroid(position, cs);
    bbox.setSize(Rectangle.fromDegrees(
        bbox.getCentroid().getNorth(),
        bbox.getCentroid().getSouth(),
        bbox.getCentroid().getEast(),
        bbox.getCentroid().getWest()
    ));

    // 计算坐标类型对应的宽度和高度
    int width = (int) (distance * scale);
    int height = (int) (distance * scale);

    // 检查并添加图层样式,创建图层
    if (layerName == null || layerName.isEmpty()) {
        return bbox;
    }

    // 创建形状
    Rectangle rectangle = Rectangle.fromDegrees(
        bbox.getCentroid().getNorth(),
        bbox.getCentroid().getSouth(),
        bbox.getCentroid().getEast() - width / 2,
        bbox.getCentroid().getWest() - width / 2
    );

    // 如果需要,更新矩形大小
    if ((width * height >= distance) || (fillFraction > 0.7)) {
        rectangle.setSize(Rectangle.fromDegrees(
            bbox.getCentroid().getNorth() - width/2,
            bbox.getCentroid().getSouth() - width/2,
            bbox.getCentroid().getEast() - width/2 + height,
            bbox.getCentroid().getWest() - width/2 + height
        ));
    }

    // 发送请求生成图层
    BoundingBoxResponse response = getLayerManager().getRenderer(layerName, bbox).renderAsMultiPolygon(rectangle, null);

    // 将结果转换为JSON
    JSONObject jsonResponse = new JSONObject<>();
    jsonResponse.put("type", response.getLayerName());
    return BoundingBox.fromJSON(jsonResponse);
}

// 获取图层管理器
private static ILayerRendererManager getLayerManager() {
    // ...(实现图层管理方法)
}

// 获取地理信息服务层
private static IGeoLayerService getGeographyLayerService() {
    // ...(实现地理信息管理服务)
}

// 解析输入字符串
private static int lonSeparatorIndex = -1;
private static int latSeparatorIndex = -1;
private static int lonSeparatorLength = 0;
private static int latSeparatorLength = 0;

// 解析纬度和经度字符串
private static int latSeperatorIndex = -1;
private static int lonSeperatorIndex = -1;
private static int latSeperatorLength = 0;
private static int lonSeperatorLength = 0;

// 解析输入字符串
private static int readLonSeperatorIndex(String s) {
    lonSeperatorIndex = s.indexOf(":");
    lonSeperatorLength = s.substring(lonSeperatorIndex).length();
    lonSeperatorIndex++;
    return lonSeperatorIndex;
}

// 解析输入字符串
private static int readLatSeperatorIndex(String s) {
    latSeperatorIndex = s.indexOf(":");
    latSeperatorLength = s.substring(latSeperatorIndex).length();
    latSeperatorIndex++;
    return latSeperatorIndex;
}
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

geohash之2d 地理空间索引

例如,您可能会写一个查询来查找餐馆距离酒店特定距离,或查找某个特定邻域内博物馆。 本文档介绍了如何在文档存储位置数据以及如何创建地理空间索引。...考虑以下两个例子: loc : [ x, y ] loc : { x: 1, y: 2 } 所有文件必须以相同顺序存储位置数据。如果您将纬度经度用作坐标系,请始终先存储经度。...2d索引默认范围为经度纬度使用边界值-180(含180)和180(不含)。 重要 2d索引默认边界允许应用程序插入无效纬度大于90或小于-90文档。...默认情况下,2d地理空间索引假设经度纬度边界为-180(含180 度), 即180度(即[-180,180 ))。MongoDB返回一个错误,拒绝指定范围之外坐标数据文档。...转换: 到弧度距离:用与距离测量相同单位将距离除以球体半径(例如地球)。 弧度距离:将弧度测量值乘以要转换距离单位系统球体半径(例如地球)。

2.2K40

Redis GeoHash核心原理解析

但是对于空间上一个(二维,包括经度纬度),如何排序呢?又如何索引呢?解决方法很多,下文介绍一种方法来解决这一问题。...临界问题 由于GeoHash是将区域划分为一个个规则矩形,对每个矩形进行编码,这样在查询附近POI信息时会导致以下问题,比如红色是我们位置,绿色两个分别是附近两个餐馆,但是在查询时候会发现距离较远餐馆...计算出GeoHash值,然后和数据库精度更高GeoHash值做前缀比较 8.空间索引 常见问题:如何根据自己所在位置查询来查询附近50米POI(point of interest,比如商家、景点等...每个POI都有经纬度信息,用图1bSQL语句在mySQL建立了POI_spatial表,其中lat和lng两个字段来代表纬度经度。为后续分析方便起见,我人造了40万个POI数据。...根据这个思路我们执行SQl查询(图5)(注:经度纬度每隔0.001度,距离相差约100米,由此推算出矩形左下角和右上角坐标),发现过滤后正好剩下两个POI。

1.5K20
  • Redis 到底是怎么实现“附近的人”这个功能

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象;...距离单位和用户给定范围单位保持一致。 - WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    93630

    Redis 到底是怎么实现“附近的人”这个功能呢?

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象;...距离单位和用户给定范围单位保持一致。 WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    1.2K10

    Redis 到底是怎么实现“附近的人”这个功能

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象...距离单位和用户给定范围单位保持一致。 - WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    79520

    如何高效率地实现它?

    具体在产品技术上实现原理,也很容易理解: 1)现在移动端(ios、android等),通过系统API很容易抓到用户当前位置(即经纬度数据); 2)根据第1步纬度数据,很容易计算出两个之间距离...对于IM新手来说,可能对于第2步根据纬度数据计算出两距离,觉得有点难度,实际上根据数据公式(自已百度一下吧,有点复杂,哥不贴了),用代码来实现,只有短短十来行代码。...下面是一个简单Java版实现: /** * 计算地球上任意两(经纬度)距离 * * @param long1 第一经度 * @param lat1 第一纬度...技术难点主要包括: 1)如何高效地进行两距离计算,对于高并发服务端来说,像上一节代码那样,一个一个计算,还是有点不高效; 2)如何高效地进行地理围栏圈定(难道是把所有当前在线用户,离我距离都一一算一遍...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内

    1.9K00

    简单几步,实现 Redis 查询 “附近的人”

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象;...距离单位和用户给定范围单位保持一致。 WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    61120

    是什么能让 APP 快速精准定位到我们位置?

    本文包含以下内容,阅读完需要约10分钟: 我们日常生活遇到哪些定位场景 简单复习一下经纬度 geohash原理解析 geohash存在边界问题 如何解决边界问题 计算两距离计算 geohash...答案就是 geohash geohash通过算法将1个定位经度纬度2个数值,转换成1个hash字符串。如果2个地方距离越近,那么他们hash值前缀越相同。...指定一个位置纬度坐标值。 根据十字坐标图和二分法,将纬度经度划分成1和0二进制数字串。 按照“偶数位放经度,奇数位放纬度”算法,合并经度纬度这2个二进制数字串。...B距离我们更近一,但是,由于A 和腾大在一个hash区块内,所以,就得出了A是最佳选择。这就是边界问题。 边界问题 如何解决边界问题 那么如何解决这个边界问题,给出最近最优算法方案呢?...答案就是:把定位附近8个方向geohash都算出来。最后分别计算这些和自己距离(由于范围很小,数量就也很少,计算量就很少)过滤掉不满足条件就ok了。

    1.6K30

    基于单目和低成本GPS车道定位方法

    图1给出了所提出方法框架,提出方法有三个输入:相机、GPS和参考地图,构成轨迹GPS如下所示: 其中px和py分别表示经度纬度坐标,w是当前GPS时间戳,参考地图位置r可以定义如下: 其中...rx和ry分别表示经度纬度坐标,j是参考点位置编号,GPS提供车辆当前位置,创建25mx25m区域本地搜索地图,从参考地图中选择本地地图参考点,该参考地图落在当前GPS位置当前所在区域内...,因此,其时间戳rw可以定义如下: 其中k是参考点在局部地图中位置编号,使用简单最近点算法计算比较这些与当前本地GPS位置之间距离,然后使用滑动窗口技术,如图2所示 图2.使用滑动窗口地图匹配过程图示...图5清楚地说明了车辆中心和中间车道之间关系 图5.说明如何获得车辆中心和中间车道之间偏离距离 车辆中心相对于中间车道估计距离公式如下: 式,d_m是车辆中心相对于中间车道估计距离,单位为米...图7.所提出方法定性定位结果 根据表1,测量GPS位置比估计位置具有更高方差和更高平均值,这表明GPS测量不够精确,无法定位车辆精确位置,与实测GPS相比,我们提出方法估计位置具有较小均值和方差值

    1K20

    看用 Redis 如何实现微信「​附近的人」​功能?

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象;...距离单位和用户给定范围单位保持一致。 - WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    92050

    Redis 到底是怎么实现“附近的人”这个功能呢?

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象;...距离单位和用户给定范围单位保持一致。 WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    1.9K20

    揭开Redis“附近的人”神秘面纱

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象...距离单位和用户给定范围单位保持一致。 - WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    97820

    Redis 实现「附近的人」

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象;...距离单位和用户给定范围单位保持一致。 - WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    72520

    【翻译】GeoJSON格式规范-RFC7946

    一个position是一个数值数组,必须有两个或更多元素。头两个元素是经度纬度,或者是东距或北距(应该是测量学上概念),按照这个顺序并且使用十进制。海拔可能被作为可选第三个元素。...译者思考: “这条线可能与沿参考椭球曲面的测地线路径明显不同”, 这句话意思我理解是,上述线是基于经纬度,而不是基于地理距离,不同纬度经度地理距离是不一样。...相同纬度互补边界没有跨越反子午线: "bbox": [-178.0, -20.0, 177.0, -16.0] 覆盖了355度经度。...东北角纬度总是比西南角纬度大,但是跨越反子午线边界东北角经度是小于西南角经度。 5.3...., -90.0, 180.0, maxlat] 在地球仪上观看时,一个刚好接触北极形成一个近似球冠切片边界从西南角北纬最小纬度,西经“westlon”度延伸到东北角北纬90度,东经“eastlon

    6.9K80

    10个机器学习中常用距离度量方法

    在更深入地研究不同距离测量之前,我们先要有一个关于它们如何工作以及如何选择合适测量大致概念。 距离度量用于计算给定问题空间中两个对象之间差异,即数据集中特征。...因此,没有充分考虑到值差异。 6、半正矢距离 Haversine distance 半正矢距离测量是球面上两之间最短距离。因此常用于导航,其中经度纬度和曲率对计算都有影响。...半正矢距离公式如下: 其中r为球面半径,φ和λ为经度纬度。...通过动态规划找到一条弯曲路径最小化距离,该路径必须满足以下条件: 边界条件:弯曲路径在两个时间序列起始点和结束点开始和结束 单调性条件:保持时间顺序,避免时间倒流 连续条件:路径转换限制在相邻时间上...总结 在这篇文章,简要介绍了十种常用距离测量方法。本文中已经展示了它们是如何工作如何在Python实现它们,以及经常使用它们解决什么问题。

    1.3K30

    Redis 是怎么实现 “附近的人”

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象...距离单位和用户给定范围单位保持一致。 - WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何? 首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    1.4K10

    用 Redis 查询 “附近的人” !妙啊!

    Redis Geo 模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...: 返回两个给定位置之间距离; GEOHASH: 返回一个或多个位置对象Geohash表示; GEORADIUS: 以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象;...距离单位和用户给定范围单位保持一致。 WITHCOORD:将位置对象经度和维度也一返回。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格(蓝点和红点)与中心距离,最终筛选出距离范围内...如何通过geohash网格范围框选出元素对象?效率如何?首先在每个geohash网格geohash值都是连续,有固定范围。所以只要找出有序集合,处在该范围位置对象即可。

    26140

    10个机器学习中常用距离度量方法

    在更深入地研究不同距离测量之前,我们先要有一个关于它们如何工作以及如何选择合适测量大致概念。 距离度量用于计算给定问题空间中两个对象之间差异,即数据集中特征。...因此,没有充分考虑到值差异。 6、半正矢距离 Haversine distance 半正矢距离测量是球面上两之间最短距离。因此常用于导航,其中经度纬度和曲率对计算都有影响。...半正矢距离公式如下: 其中r为球面半径,φ和λ为经度纬度。...通过动态规划找到一条弯曲路径最小化距离,该路径必须满足以下条件: 边界条件:弯曲路径在两个时间序列起始点和结束点开始和结束 单调性条件:保持时间顺序,避免时间倒流 连续条件:路径转换限制在相邻时间上...总结 在这篇文章,简要介绍了十种常用距离测量方法。本文中已经展示了它们是如何工作如何在Python实现它们,以及经常使用它们解决什么问题。

    1.2K10

    揭秘!是什么能让APP快速精准定位?

    geohash通过算法将1个定位经度纬度2个数值,转换成1个hash字符串。如果2个地方距离越近,那么他们hash值前缀越相同。...指定一个位置纬度坐标值。 根据十字坐标图和二分法,将纬度经度划分成1和0二进制数字串。 按照“偶数位放经度,奇数位放纬度”算法,合并经度纬度这2个二进制数字串。...B距离我们更近一,但是,由于A和腾大在一个hash区块内,所以,就得出了A是最佳选择。这就是边界问题。 六、如何解决边界问题 那么如何解决这个边界问题,给出最近最优算法方案呢?...答案就是:把定位附近8个方向geohash都算出来。最后分别计算这些和自己距离(由于范围很小,数量就也很少,计算量就很少)过滤掉不满足条件就ok了。...sin($radLat1)*sin($radLat2))*$R; //精度 $s = round($s* 10000)/10000; return round($s);} /* *求两个已知经纬度之间距离

    1.4K20

    常用距离算法 (原理、使用场景、Python实现代码)

    在更深入地研究不同距离测量之前,我们先要有一个关于它们如何工作以及如何选择合适测量大致概念。 距离度量用于计算给定问题空间中两个对象之间差异,即数据集中特征。...因此,没有充分考虑到值差异。 6、半正矢距离 Haversine distance 半正矢距离测量是球面上两之间最短距离。因此常用于导航,其中经度纬度和曲率对计算都有影响。...半正矢距离公式如下: 其中r为球面半径,φ和λ为经度纬度。...通过动态规划找到一条弯曲路径最小化距离,该路径必须满足以下条件: 边界条件:弯曲路径在两个时间序列起始点和结束点开始和结束 单调性条件:保持时间顺序,避免时间倒流 连续条件:路径转换限制在相邻时间上...总结 在这篇文章,简要介绍了十种常用距离测量方法。本文中已经展示了它们是如何工作如何在Python实现它们,以及经常使用它们解决什么问题。

    1.1K20
    领券