我正在查看Google BigQuery上免费提供的太阳能潜力数据集,该数据集可在以下位置找到:https://bigquery.cloud.google.com/table/bigquery-public-data:sunroof_solar.solar_potential_by_censustract?pli=1&tab=schema
该表上的每个记录都有以下边框定义: lat_max-该区域的最大纬度 lat_min-该区域的最小纬度 lng_max-该区域的最大经度 lng_min-该区域的最小经度
现在我有了一个坐标(纬度/经度对),我想查询一下该坐标是否在上述范围内。如何使用BQ标准SQL?
我在这里看到过地理功能:https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions 但是我仍然不确定如何编写此查询。
谢谢!
答案 0 :(得分:2)
假设点仅是数字的经度和纬度,为什么不能仅进行标准的数字比较?
注意:如果没有Google帐户,第一个链接将无法工作,因此我看不到数据。
但是,如果您想成为空间对象,建议您使用现有的边界坐标,然后使用ST_MAKEPOLYGON
,ST_GEOGFROMGEOJSON
或{ {1}}。然后使用您要测试的ST_GEOGFROMTEXT
坐标来创建一个点。
现在您有两个地理区域,可以根据需要的结果使用ST_MAKEPOINT
或ST_INTERSECTION
对其进行比较。
如果您想花哨并查看距边界有多远(我想这意味着更有效?),可以使用ST_DISJOINT
。
答案 1 :(得分:1)
同意乔纳森(Jonathan)的意见,只是检查每个纬度/经度值是否在界限内是实现这一点的最简单方法(除非围绕子午线问题,但很可能您可以忽略它们)。
如果您确实想使用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>)
但是它可能会变慢,并且不会为这种特殊情况提供任何好处。