代码之家  ›  专栏  ›  技术社区  ›  orcaman

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

  •  0
  • orcaman  · 技术社区  · 6 年前

    我正在查看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-该区域的最小经度

    现在我有一个坐标(lat/lng对),我想查询一下该坐标是否在上述范围内。如何使用BQ标准SQL实现这一点?

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

    谢谢!

    2 回复  |  直到 6 年前
        1
  •  2
  •   GIS-Jonathan    6 年前

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

    注意:第一个链接在没有谷歌帐户的情况下不起作用,所以我看不到数据。 但是如果你想成为空间的,我建议你需要取你拥有的边界坐标,然后用下列方法之一把它们变成一个多边形: ST_MAKEPOLYGON , ST_GEOGFROMGEOJSON ST_GEOGFROMTEXT . 然后使用要测试的坐标创建点 ST_MAKEPOINT .

    现在您有了两个地理位置,您可以使用 ST_INTERSECTION ST_DISJOINT 取决于你想要什么结果。 如果你想幻想一下,看看你离边境有多远(我猜这意味着效率更高?)你可以使用 ST_DISTANCE .

        2
  •  1
  •   Michael Entin    6 年前

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

    如果确实要使用地理对象,可以使用

    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>)
    

    但它可能会变慢,并不会为这个特定的案例提供任何好处。