根据 Java 和 Python 中的经纬度生成唯一编号
Unique Number generation based on latitude and longitude in Java and Python
我正在尝试实现基于纬度和经度的唯一数字生成,这样对于相同的纬度和经度对,生成的数字应该相同。
除此之外生成的数字不应超过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 实现,但它不适用于某些 latitude/longitude 对
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;
}
latitude/longitude 两个实现未返回相同结果的某些对是
- 44.6212179,-75.6963195
- 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
使用接近 max/min 纬度和经度限制的附加数据进行测试 -- 结果与 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 with the latest fix -> 2107826139
我正在尝试实现基于纬度和经度的唯一数字生成,这样对于相同的纬度和经度对,生成的数字应该相同。
除此之外生成的数字不应超过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 实现,但它不适用于某些 latitude/longitude 对
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;
}
latitude/longitude 两个实现未返回相同结果的某些对是
- 44.6212179,-75.6963195
- 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
使用接近 max/min 纬度和经度限制的附加数据进行测试 -- 结果与 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 with the latest fix -> 2107826139