如何从 BigQuery 中存储的大型线串数据集中查找所有道路交叉口
Posted
技术标签:
【中文标题】如何从 BigQuery 中存储的大型线串数据集中查找所有道路交叉口【英文标题】:How to find all roadway intersections from a large dataset of linestrings stored in BigQuery 【发布时间】:2021-05-16 18:49:34 【问题描述】:我在 BigQuery 表中存储了 40,000 个道路线串,我想为它们找到所有唯一的交叉点。我在这里 (https://gis.stackexchange.com/questions/20835/identifying-road-intersections-using-postgis/151277#151277) 找到了如何在 postGIS 中执行此操作,但我无法在 BigQuery 中使用此代码,因为我无法按地理位置分组。
SELECT
ST_Intersection(a.geom, b.geom),
Count(Distinct a.gid)
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom)
AND a.gid != b.gid
GROUP BY
ST_Intersection(a.geom, b.geom)
[1]: https://gis.stackexchange.com/questions/20835/identifying-road-intersections-using-postgis/151277#151277
【问题讨论】:
【参考方案1】:我不知道为什么需要汇总结果:
SELECT ST_Intersection(r1.geom, r2.geom)
FROM roads r1 JOIN
roads r2
ON ST_Touches(r1.geom, r2.geom) AND
r1.gid < r2.gid
【讨论】:
哦,太好了,我不知道该怎么做。我正在尝试调整 postgis 代码。看来你的方法更好。谢谢。 我发现一个奇怪的地方是你的代码有重复点。我知道你很难在没有数据或更多上下文的情况下进行诊断。但是我的原始代码找到了 42139 个交叉点,而我找到了 63595。然后我用你的代码运行了一个选择区域,发现了 40035 个唯一性。这很可能是由我的数据中的异常引起的,但我想把它扔掉 @KylePennell 。 . .有趣的。这意味着不同的道路对可以与同一组点相交,这在我看来不太可能。道路是否可能在您的数据集中重复。例如,在美国,联邦高速公路也可能是州道,并且有两个不同的编号。 这是一个关于检查内容的好建议。无论如何,非常感谢你在一堆线串中找到交叉点的简洁方法 如果您确实需要删除重复项,请使用此模式:WITH geog_table AS (<your query here>) SELECT any_value(geom), count(*) FROM geog_table GROUP BY ST_AsText(geom)
【参考方案2】:
您可以使用大部分相同的答案,但只需将地理解析为 CTE 中的文本,然后将其转换回地理。
with geomandcount as (
SELECT
st_astext(ST_Intersection(a.geom, b.geom)) as the_geom,
Count(Distinct a.geoid) as count
FROM
`roadways_table` as a,
`roadways_table` as b
WHERE
ST_intersects(a.geom, b.geom)
AND a.geoid != b.geoid
group by st_astext(ST_Intersection(a.geom, b.geom))
)
select st_geogfromtext(the_geom) as the_geom, count
from geomandcount
【讨论】:
留下这个答案是希望它可以帮助别人,但如果我打破了一些***,请告诉我。 我认为您可以在此处使用 ANY_VALUE 函数避免 ST_GeogFromText:select any_value(g), count(*) from geog_table group by st_astext(g)
以上是关于如何从 BigQuery 中存储的大型线串数据集中查找所有道路交叉口的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 dplyr 和 bigquery 从 Bigquery 数据集中的多个表中进行选择?