PostGIS有这个函数ST_GeomFromGeoHash
来获得Geo散列区域(GeomFromGeoHash.html)的边框几何,但是它还没有移植到BigQuery。有什么解决办法吗?
发布于 2022-05-09 20:57:05
我实现了以下BigQuery UDF,它将任意精度的地理哈希转换为包围框几何:
CREATE OR REPLACE FUNCTION dataset.geohash_to_bbox(geohash STRING)
RETURNS STRING
LANGUAGE js AS """
var BASE32_CODES = "0123456789bcdefghjkmnpqrstuvwxyz";
var BASE32_CODES_DICT = {};
for (var i = 0; i < BASE32_CODES.length; i++) {
BASE32_CODES_DICT[BASE32_CODES.charAt(i)] = i;
}
var ENCODE_AUTO = 'auto';
var MIN_LAT = -90;
var MAX_LAT = 90;
var MIN_LON = -180;
var MAX_LON = 180;
var decode_bbox = function (hash_string) {
var isLon = true,
maxLat = MAX_LAT,
minLat = MIN_LAT,
maxLon = MAX_LON,
minLon = MIN_LON,
mid;
var hashValue = 0;
for (var i = 0, l = hash_string.length; i < l; i++) {
var code = hash_string[i].toLowerCase();
hashValue = BASE32_CODES_DICT[code];
for (var bits = 4; bits >= 0; bits--) {
var bit = (hashValue >> bits) & 1;
if (isLon) {
mid = (maxLon + minLon) / 2;
if (bit === 1) {
minLon = mid;
} else {
maxLon = mid;
}
} else {
mid = (maxLat + minLat) / 2;
if (bit === 1) {
minLat = mid;
} else {
maxLat = mid;
}
}
isLon = !isLon;
}
}
return "POLYGON (( " + minLon + " " + minLat + ", " + maxLon + " " + minLat + ", " + maxLon + " " + maxLat + ", " + minLon + " " + maxLat + ", " + minLon + " " + minLat + "))";
};
return decode_bbox(geohash);
""";
示例用法:
select <dataset>.geohash_to_geom("ttnfv2u");
>> POLYGON((77.2119140625 28.6083984375, 77.2119140625 28.65234375, 77.255859375 28.65234375, 77.255859375 28.6083984375, 77.2119140625 28.6083984375))
发布于 2022-05-17 19:59:09
BigQuery有返回中心点的ST_GEOGPOINTFROMGEOHASH
。但是,当前没有返回该框的函数。另一个答案中的UDF通常是一个合理的解决方法,但是您应该知道它的使用限制。
GeoHash通常表示平面2D地图上的矩形。BigQuery工作在地理上,有测地线的边缘,所以同一纬度的两个点之间的边并不是平行的,但作为测地线是一条更近极点的较短的路线。所以BigQuery多边形是与2D盒有点不同。您可以经常忽略这些差异,但是根据您如何使用这个多边形,它可能会给您带来错误的结果。
https://stackoverflow.com/questions/72178141
复制相似问题