检查坐标是否在范围内 - BigQuery GIS

问题描述 投票:0回答:2

我正在查看 Google BigQuery 上免费提供的太阳能潜力数据集,可以在此处找到:https://bigquery.cloud.google.com/table/bigquery-public-data:sunroof_solar.solar_pottial_by_censustract?pli=1&tab=架构

表中每条记录都有以下边框定义: lat_max - 该地区的最大纬度 lat_min - 该地区的最小纬度 lng_max - 该区域的最大经度 lng_min - 该地区的最小经度

现在我有一个坐标(纬度/经度对),我想查询该坐标是否在上述范围内。如何使用 BQ 标准 SQL 做到这一点?

我在这里看到了地理函数:https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions 但我仍然不确定如何编写这个查询。

谢谢!

sql google-bigquery gis
2个回答
4
投票

假设这些点只是经纬度的数字,为什么不能做一个标准的数字比较呢?

注意:如果没有谷歌帐户,第一个链接将无法使用,因此我看不到数据。 但如果你想变得空间化,我建议你需要获取已有的边界坐标,并使用以下之一将它们转换为多边形:

ST_MAKEPOLYGON
ST_GEOGFROMGEOJSON
ST_GEOGFROMTEXT
。然后使用您想要测试的坐标创建一个点
ST_MAKEPOINT

现在您有两个地理位置,您可以使用

ST_INTERSECTION
ST_DISJOINT
来比较它们,具体取决于您想要的结果。 如果你想了解一下你距离边界有多远(我猜这意味着更有效率?),你可以使用
ST_DISTANCE


3
投票

同意乔纳森的观点,只需检查每个纬度/经度值是否在范围内是实现它的最简单方法(除非有任何关于反子午线的问题,但很可能你可以忽略它们)。

如果您确实想为此使用 Geography 对象,则可以使用

为这些矩形构造 Geography 对象
ST_MakePolygon(ST_MakeLine(
  [ST_GeogPoint(lon_min, lat_min), ST_GeogPoint(lon_max, lat_min), 
   ST_GeogPoint(lon_max, lat_max), ST_GeogPoint(lon_min, lat_max), 
   ST_GeogPoint(lon_min, lat_min)]))

然后使用

检查该点是否在特定矩形内
ST_Intersects(ST_GeogPoint(lon, lat), <polygon-above>)

但它可能会更慢,并且不会为这种特殊情况提供任何好处。


两个更新:

  • 表格似乎多了一个新列,
    center_point
    ,它已经是地理类型了。现在使用它更有意义了,
  • BigQuery 有了新功能
    ST_INTERSECTSBOX
    ,

这两个更新使现在可以合理使用地理功能:

...
WHERE ST_INTERSECTSBOX(center_point, lng1, lat1, lng2, lat2)

这可能比按四个条件过滤更快。

© www.soinside.com 2019 - 2024. All rights reserved.