Java和Python中基于纬度和经度的唯一数字生成

Java和Python中基于纬度和经度的唯一数字生成,java,python,latitude-longitude,Java,Python,Latitude Longitude,我正在尝试实现基于纬度和经度的唯一数字生成,这样对于相同的纬度和经度对,生成的数字应该是相同的 除此之外,生成的数字不应超过Java中整数的最大值2147483647 下面的python函数工作正常 def get_unique_number(lat, lon): try: lat_double = None lon_double = None if isinstance(lat, str): lat_double = float(lat) e

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

除此之外,生成的数字不应超过Java中整数的最大值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
def获取唯一编号(lat、lon):
尝试:
lat_double=无
lon_double=无
如果存在(横向、横向):
横向双=浮动(横向)
其他:
横向双=横向
如果存在(长、短):
lon_double=浮动(lon)
其他:
lon_double=lon
lat_int=int((lat_double*1e7))
lon_int=int((lon_double*1e7))

val=abs(lat_int可能,您应该在Java实现中使用
long
type(因为Python int不像Java对应的int那样受长度限制):

更新 修复了允许掩码中有一个额外位的常数
0x1fff000l

使用接近纬度和经度的最大/最小限制的附加数据进行测试——结果与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)中的示例:

  • 676571275
  • 676571275
新示例:(44.3252130,-79.6794917)

  • ->2107826139

这不起作用。python中的值不同。请参阅python输出(44.6212179,-75.6963195)=>676571270和(40.2318791,-78.9155315)=>1707569678更新的Java方法适用于上述两个数据集,但不适用于此数据集(44.6212179,-75.696319)=>676571272(Java结果)对于同一个数据集,python中的结果是676571270(python结果)。对于最后一个示例,python和Java都生成
print(get_unique_number(44.6212179,-75.696319))->676571275
getUniqueId(44.6212179,-75.696319);//676571275
谢谢我弄错了。但是最后一件事,你能测试一下最后的数据集Java(44.3252130,-79.6794917)=>2107826141 Python(44.3252130,-79.6794917)=>2107826139。非常感谢您的帮助。是的,出现了一个问题,修复方法是为纬度应用变量掩码:
long latMask=lat\u int>0x7FFF0000L?0x1FFF0000L:0xFFFF000L;
。答案中的代码已更新。
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
getUniqueId( 179.8213878,  179.6963195);  // 284588923
getUniqueId( 179.8213878, -179.6963195);  // 284591239
getUniqueId(-179.6963195,  179.8213878);  //  75927799
getUniqueId(-179.6963195, -179.8213878);  //  75919115