- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 PostgreSQL 的快速解决方案。我还有一个使用自定义数据库和自定义索引的解决方案,速度提高了 8.75 倍。
自定义解决方案正在发挥作用:下一步是在整个北美实现它。但是,我想确定我没有忽略同样快(或更快)的 PostgreSQL 解决方案。
解决方案必须返回每个点周围 30 平方米范围内的所有街段。但是,如果为了速度的缘故,它还返回一些在更大的正方形内的街道段,比如 37.5 平方米,那是可以接受的。 (我的自定义解决方案之所以这样做,是因为它采用了镶嵌瓷砖)。
我提出的最佳 Postgres 解决方案创建了一个返回所有 1000 个解决方案的查询。它看起来像下图,但包含了所有 1000 个点。 (每个 ST_MakeEnvelope 创建围绕每个点的 30 米正方形)。
SELECT 0 AS position, segment_id
FROM roads
WHERE ST_Intersects(ST_MakeEnvelope(-87.584051340952,50.9904613494613,-87.583193442952,50.9910013500013, 4326), geom_way)
UNION ALL SELECT 1 AS position, segment_id
FROM roads
WHERE ST_Intersects(ST_MakeEnvelope(-87.632028114596,50.9314626994627,-87.631171305396,50.9320027000027, 4326), geom_way)
UNION ALL SELECT 2 AS position, segment_id
FROM roads
WHERE ST_Intersects(ST_MakeEnvelope(-87.684002999977,50.8724640494641,-87.683147275777,50.873004050004, 4326), geom_way)
UNION ALL
SELECT 3 AS position, segment_id
FROM roads
WHERE ST_Intersects(ST_MakeEnvelope(-87.91989093966,50.8134653994654,-87.91903629686,50.8140054000054, 4326), geom_way)
UNION ALL
SELECT 4 AS position, segment_id
FROM roads
WHERE ST_Intersects(ST_MakeEnvelope(-87.616034053248,50.7544667494668,-87.615180488048,50.7550067500068, 4326), geom_way)
我以编程方式创建查询,然后使用 ODBC 将其传递给 Postgres。
在我的计算机上,此查询在一秒钟内返回 1,022 个职位的结果。在同一台计算机上,自定义数据库和自定义索引在一秒钟内返回 8,940 个位置的结果。
请告诉我如何编写(一个可能很复杂的)Postgres 查询,而且速度一样快或更快!
最佳答案
长话短说,您可以在 CTE 中分解所有包络,然后让引擎根据道路查询它们
WITH cte (pos, geom) AS (select * from (values (0, ST_MakeEnvelope(64666.5,64666.5,64667.5,64667.5, 4326))
,(1, ST_MakeEnvelope(87392.5,87392.5,87393.5,87393.5, 4326))
,(2, ST_MakeEnvelope(69426.5,69426.5,69427.5,69427.5, 4326))
,(3, ST_MakeEnvelope(71599.5,71599.5,71600.5,71600.5, 4326))
,(4, ST_MakeEnvelope(45573.5,45573.5,45574.5,45574.5, 4326))
) as foo) SELECT pos,roads.* FROM roads,cte WHERE ST_Intersects(loc, cte.geom);
在我的机器上 6000 个结果在 250 毫秒内
更多详情
在你的查询中,规划器会做类似的事情
SELECT 0 AS position, loc FROM roads WHERE ST_Intersects(ST_MakeEnvelope(-0.5,-0.5,0.5,0.5, 4326), loc)
UNION ALL
SELECT 1 AS position, loc FROM roads WHERE ST_Intersects(ST_MakeEnvelope(0.5,0.5,1.5,1.5, 4326), loc);
Append (cost=6.07..167.19 rows=170 width=36)
-> Bitmap Heap Scan on roads (cost=6.07..82.75 rows=85 width=36)
Recheck Cond: ('...'::geometry && loc)
Filter: _st_intersects('...'::geometry, loc)
-> Bitmap Index Scan on roads_loc_index (cost=0.00..6.05 rows=254 width=0)
Index Cond: ('...'::geometry && loc)
-> Bitmap Heap Scan on roads roads_1 (cost=6.07..82.75 rows=85 width=36)
Recheck Cond: ('...'::geometry && loc)
Filter: _st_intersects('...'::geometry, loc)
-> Bitmap Index Scan on roads_loc_index (cost=0.00..6.05 rows=254 width=0)
Index Cond: ('...'::geometry && loc)
(11 rows)
注意 -> 道路上的位图堆扫描
。我强调的不是 Bitmap heap Scan,而是 ->
有多少位置就有多少。所以想法是让规划者按照他的意愿“迭代”道路,而不是告诉他 UNION ALL
。
现在请注意,通过使用(对于 4000 个位置)
WITH cte (pos, geom) AS ( SELECT 0, ST_MakeEnvelope(5687.5,5687.5,5688.5,5688.5, 4326)
UNION ALL
SELECT 1, ST_MakeEnvelope(13717.5,13717.5,13718.5,13718.5, 4326)
UNION ALL
SELECT 2, ST_MakeEnvelope(53009.5,53009.5,53010.5,53010.5, 4326)
UNION ALL
SELECT 3, ST_MakeEnvelope(60566.5,60566.5,60567.5,60567.5, 4326)
UNION ALL
SELECT 4, ST_MakeEnvelope(17843.5,17843.5,17844.5,17844.5, 4326) ) SELECT pos FROM cte;
它也“分解”查询,响应时间为 538 毫秒。我们甚至不交叉道路,只是创建 cte 很慢。
结论 在使用自定义值填充 CTE
时,避免使用 UNION ALL
并仅使用 VALUES
声明所有行。
关于postgresql - 找到 1000 个点中每个点周围 30 平方米范围内的所有街道段。尽可能快地做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59399668/
我正在尝试使用 html5 创建一个世界,或者更确切地说以第一人称视角创建一条街道,而不使用 WebGL。 不幸的是,我找不到任何可以使用的引擎。有谁知道可以做到这一点的引擎,还是我必须自己编写引擎?
在我的 Android 应用程序中,我包含了谷歌地图。现在我想获取有关您周围地区的信息。例如,你是在公园/森林/海滩……所以我基本上想要一个用“水”回答输入坐标 53°33'40.9"N 10°00'
在 9535 上发出的 HERE 自动完成 API 请求返回 5 个结果,这些结果都与结果类型 street 匹配,而不是像 Google 那样匹配 postalCode默认情况下的 map 。例如
我正在考虑一个项目,我需要标题中描述的信息。 Google Maps API 是否提供此类信息,或者有人知道如何获取这些信息吗? 项目将使用 PHP、HTML 和 Javascript 完成。 最佳答
如果地址可以由子元素组成:Street、City、State、PostalCode...您如何允许此 XML: Somestreet zip
有没有办法使用 Google Maps API V3 突出显示指定的道路或街道? 这是我想要获取的示例(来自在谷歌中搜索某个地方的图像):example 样式化 map 不能满足我的要求,因为它适用于
我想创建一个应用程序来跟踪安装我的应用程序的用户,因此我有以下用于跟踪的代码,该代码运行良好,但它只会返回城市名称。但我需要完整的详细信息,例如街道名称、城市,等等。 public class
我正在创建一项服务,用户可以在其中访问世界任何地方的地址。首先,我认为 Google Places API 会很高兴,但看看这张图片(下图),问题是如何以正确的顺序过滤掉国家、城镇、街道地址。首先,我
如何将 ESRI 街道 map ( https://leaflet-extras.github.io/leaflet-providers/preview/#filter=Esri.WorldStree
一个简短的问题,希望有人能解答: 如何使用 Here Android SDK Premium 导航通过 DIR_NO_CARS、NO_THROUGH_TRAFFIC、DIR_NO_TRUCKS 属性的
我正在开发 Google 地点自动完成服务,我需要过滤特定于国家/地区的地点! 引用网站:-- https://www.grubhub.com (特定国家/地区、城邦-邮政编码) 我找到了一个例子:-
我有两个 PCollections:一个从 Pub/Sub 中提取信息,另一个从 CSV 文件中提取数据。在每个管道中进行一些不同的转换之后,我想将两者合并到它们共享的公共(public) key “
DSMOD 似乎没有能力更新用户的这部分 AD 属性(街道、邮政信箱、城市、州、邮政编码)。有没有我可以从 powershell 或 cmd 运行的命令行替代方案? 动机:我正在尝试用特定的用户信息填
DSMOD 似乎没有能力更新用户的这部分 AD 属性(街道、邮政信箱、城市、州、邮政编码)。有没有我可以从 powershell 或 cmd 运行的命令行替代方案? 动机:我正在尝试用特定的用户信息填
我想在 OSM 中的两点之间画一条线,但我找不到任何可以帮助我的东西。像 googlemap 中的 Polyline 之类的东西。 public class MainActivity extends
我正在使用 PKPaymentAuthorizationViewController 及其委托(delegate)方法集成 Apple Pay。当用户更改地址时,将触发以下委托(delegate)方法
我需要使用 Xamarin Forms/Android 的 Intent 以编程方式打开 Android 联系人应用程序。当“添加新联系人” Activity/屏幕出现时,我想用以下字段预先填充它:
我是一名优秀的程序员,十分优秀!