java - Java和Python中基于经纬度的唯一编号生成

标签 java python latitude-longitude

我正在尝试实现基于纬度和经度的唯一数字生成,这样对于相同的纬度和经度对,生成的数字应该相同。

除此之外,生成的数字不应超过 Java 中 Integer 的最大值,即 2147483647

以下python函数运行良好

def get_unique_number(lat, lon):
  try:
    lat_double = None
    lon_double = None
    if isinstance(lat, str):
        lat_double = float(lat)
    else:
        lat_double = lat
    if isinstance(lon, str):
        lon_double = float(lon)
    else:
        lon_double = lon

    lat_int = int((lat_double * 1e7))
    lon_int = int((lon_double * 1e7))
    val = abs(lat_int << 16 & 0xffff0000 | lon_int & 0x0000ffff)
    val = val % 2147483647
    return val
except Exception as e:
    print("marking OD_LOC_ID as -1 getting exception inside get_unique_number function")
    print("Exception while generating od loc id")
    print(traceback.format_exc())
    return None

我需要一个等效的 Java 实现。

我已经提出了上述功能的 Java 实现,但它不适用于某些纬度/经度对

public static int getUniqueId(double lat,double lon) {
    int lat_int = (int) (lat * 10000000);
    int lon_int = (int) (lon *  10000000);
    int val=Math.abs(lat_int << 16 & 0xffff0000 | lon_int & 0x0000ffff);
    val = val % Integer.MAX_VALUE;
    System.out.println(val);
    return val;
}

两个实现未返回相同结果的一些纬度/经度对是

  1. 44.6212179,-75.6963195
  2. 40.2318791,-78.9155315

如何从 Python 和 Java 实现中获得相同的结果。 如果 Java 的实现得到纠正,那将非常有帮助,因为 python 实现在生产环境中工作。

最佳答案

可能,您应该为 Java 实现使用 long 类型(因为 Python int 不像其 Java 对应类型那样受长度限制):

public static long getUniqueId(double lat,double lon) {
    long lat_int = (long) (lat * 10000000);
    long lon_int = (long) (lon * 10000000);
    long latMask = lat_int > 0x7FFF0000L ? 0x1ffff0000L : 0xffff0000L;
    long val=Math.abs(lat_int << 16 &  latMask | lon_int & 0x0000ffff);
    val = val % Integer.MAX_VALUE;
    System.out.println(val);
    return val;
}

那么对于给定的输入,输出将是:

44.6212179,-75.6963195 -> OLD: 676584886  -> 676571270
40.2318791,-78.9155315 -> OLD: 1707581954 -> 1707569678

更新 修复了常量以在掩码 0x1ffff0000L

中允许一个额外的位

使用接近纬度和经度的最大/最小限制的附加数据进行测试——结果与 Python 代码相同。

getUniqueId( 179.8213878,  179.6963195);  // 284588923
getUniqueId( 179.8213878, -179.6963195);  // 284591239
getUniqueId(-179.6963195,  179.8213878);  //  75927799
getUniqueId(-179.6963195, -179.8213878);  //  75919115

更新 2

对于注释中的示例 (44.6212179,-75.696319):

新示例:(44.3252130,-79.6794917)

关于java - Java和Python中基于经纬度的唯一编号生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328847/

相关文章:

python - 如何排列 30 个字符的二进制字符串并省略 "bad strings"

mysql - 查找包含纬度和经度的表格的 25 个最近地址

python - 根据纬度和经度过滤数据 - Numpy

android - 如何获取我的设备的当前位置

java - 检查字符串严格为字母数字

python - 找出数据集中哪些特征共线

java 包前缀为 swig

python - 使用 parsimonious 解析势函数的参数

Java HttpClient 似乎在缓存内容

java - Spring boot jpa/hibernate 遇到列类型错误(json字段)