我正在谷歌BigQuery上查看免费提供的太阳能潜力数据集,可以在这里找到:https://bigquery.cloud.google.com/table/bigquery-public-data:sunroof_solar.solar_potential_by_censustract?pli=1&tab=模式
表中的每条记录都有以下边界定义:lat_max-该区域的最大纬度lat_min-该区域的最小纬度lng_max-该区域的最大经度lng_min-该区域的最小经度
现在我有一个坐标(lat/lng对(,我想查询该坐标是否在上述范围内。如何使用BQ标准SQL实现这一点?
我在这里看到了Geo函数: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
。
同意Jonathan的观点,只需检查每个lat/lon值是否在界限内是实现这一点的最简单方法(除非反细菌有任何问题,但很可能你可以忽略它们(。
如果你真的想使用Geography对象,你可以使用为这些矩形构建Geographic对象
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得到了新的函数CCD_ 9
这两个更新使现在使用地理功能变得合理:
...
WHERE ST_INTERSECTSBOX(center_point, lng1, lat1, lng2, lat2)
这可能比通过四个条件进行过滤更快。