首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在BigQuery中将几何学转换成几何?

如何在BigQuery中将几何学转换成几何?
EN

Stack Overflow用户
提问于 2022-05-09 20:57:05
回答 2查看 262关注 0票数 0

PostGIS有这个函数ST_GeomFromGeoHash来获得Geo散列区域(GeomFromGeoHash.html)的边框几何,但是它还没有移植到BigQuery。有什么解决办法吗?

EN

回答 2

Stack Overflow用户

发布于 2022-05-09 20:57:05

我实现了以下BigQuery UDF,它将任意精度的地理哈希转换为包围框几何:

代码语言:javascript
运行
复制
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);
""";

示例用法:

代码语言:javascript
运行
复制
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)) 
票数 1
EN

Stack Overflow用户

发布于 2022-05-17 19:59:09

BigQuery有返回中心点的ST_GEOGPOINTFROMGEOHASH。但是,当前没有返回该框的函数。另一个答案中的UDF通常是一个合理的解决方法,但是您应该知道它的使用限制。

GeoHash通常表示平面2D地图上的矩形。BigQuery工作在地理上,有测地线的边缘,所以同一纬度的两个点之间的边并不是平行的,但作为测地线是一条更近极点的较短的路线。所以BigQuery多边形是与2D盒有点不同。您可以经常忽略这些差异,但是根据您如何使用这个多边形,它可能会给您带来错误的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72178141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档