【问题标题】:Checking if a Coordinate is Within a Range - BigQuery GIS检查坐标是否在范围内 - BigQuery GIS
【发布时间】:2018-12-16 12:56:35
【问题描述】:

我正在查看可在此处找到的 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 但我仍然不确定如何编写此查询。

谢谢!

【问题讨论】:

    标签: sql google-bigquery gis


    【解决方案1】:

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

    注意:第一个链接在没有 google 帐户的情况下无法使用,所以我看不到数据。 但是,如果您想成为空间,我建议您需要获取您拥有的边界坐标并使用以下之一将它们变成一个多边形:ST_MAKEPOLYGONST_GEOGFROMGEOJSONST_GEOGFROMTEXT。然后使用您要测试的坐标创建一个点ST_MAKEPOINT

    现在您有两个地理位置,您可以使用ST_INTERSECTIONST_DISJOINT 来比较它们,具体取决于您想要的结果。 如果你想看看你离边界有多远(我猜这意味着更高效?)你可以使用ST_DISTANCE

    【讨论】:

      【解决方案2】:

      同意 Jonathan 的观点,仅检查每个 lat/lon 值是否在界限内是实现它的最简单方法(除非围绕反子午线有任何问题,但很可能您可以忽略它们)。

      如果您确实想为此使用 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>)
      

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

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 1970-01-01
        • 2013-10-02
        • 2012-02-16
        • 2012-07-15
        • 2023-04-03
        • 2017-07-13
        • 2011-04-10
        • 2021-03-30
        相关资源
        最近更新 更多