我正在查看 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 但我仍然不确定如何编写这个查询。
谢谢!
假设这些点只是经纬度的数字,为什么不能做一个标准的数字比较呢?
注意:如果没有谷歌帐户,第一个链接将无法使用,因此我看不到数据。 但如果你想变得空间化,我建议你需要获取已有的边界坐标,并使用以下之一将它们转换为多边形:
ST_MAKEPOLYGON
、ST_GEOGFROMGEOJSON
或ST_GEOGFROMTEXT
。然后使用您想要测试的坐标创建一个点ST_MAKEPOINT
。
现在您有两个地理位置,您可以使用
ST_INTERSECTION
或 ST_DISJOINT
来比较它们,具体取决于您想要的结果。
如果你想了解一下你距离边界有多远(我猜这意味着更有效率?),你可以使用 ST_DISTANCE
。
同意乔纳森的观点,只需检查每个纬度/经度值是否在范围内是实现它的最简单方法(除非有任何关于反子午线的问题,但很可能你可以忽略它们)。
如果您确实想为此使用 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
,它已经是地理类型了。现在使用它更有意义了,ST_INTERSECTSBOX
,这两个更新使现在可以合理使用地理功能:
...
WHERE ST_INTERSECTSBOX(center_point, lng1, lat1, lng2, lat2)
这可能比按四个条件过滤更快。