- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 PostGIS 中,您可以使用以下方法使两个几何相交:
geometry ST_Intersection (geometry geomA, geometry geomB);
在我的例子中,geomA 和 geomB 都是 LINESTRING
,所以 ST_Intersection()
返回一个 POINT
几何体。
我想知道交点是发生在开始/结束节点(几何接触)还是中间(几何相交)。
我可以将 (Point.X, Point.Y) 与每个结束节点进行比较:
但是非常复杂。我想要一个简单的解决方案。
Example 1: Two lines in a "L" shape intersect in an end node on both lines on the bottom left.
Example 2: Two lines in a "T" shape where the vertical line intersects in the middle of the horizontal line. In this case the vertical line end node touches a non-end node of the horizontal line.
Example 3: Two lines in a "X" shape. Intersection point isn't an end node for either line.
对于我的问题,我只对找到类似示例 2 的感人场景感兴趣。
这是我现在使用的伪代码。
geomM, geomN 线串
a, b, c, d, z 点。
(a,b) geomM ST_StartPoint(geom) 和 ST_EndPoint(geom)
的开始/结束节点(c,d) geomN 的开始/结束节点
z = ST_Intersect(geomM, geomN)
SELECT geomM, geomN, z
FROM Table
WHERE
(A and not ( B or C or D))
OR (B and not ( A or C or D))
OR (C and not ( A or B or D))
OR (D and not ( A or B or C))
A, B, C, D 替换 ( a=z ) ( b=z ) ( c=z ) ( d=z )
这意味着一个节点 {a,b,c,d} 等于交叉点 z。但只有一个
这将返回所有“T”形交叉点。
最佳答案
您需要 PostGIS 函数 ST_Touches()
here .如果几何图形触及它们的边界,该函数返回 true
,但如果它们相交,则返回 false
。就您的示例而言,示例 1 和 2 返回 true
,示例 3 返回 false
。
要从单个表中选择所有接触 geometry(LINESTRING, xxx)
记录对的 ID,请使用:
SELECT x.id AS idA, y.id AS idB
FROM my_table x
JOIN my_table y ON ST_Touches(y.the_geom, x.the_geom)
WHERE x.id < y.id;
(WHERE
子句避免了重复的结果,例如 (132, 254)
和 (254, 132)
。)
请注意,线串也可以触及它们的任何非节点顶点。如果您想严格遵循示例 2,那么您必须将每个线串上的每个点与所有其他线串上的每个点进行比较,这显然是一个非常密集的操作。示例 2 基本上只有在您知道线串很短(最好是直线)时才可行。
如果所有 LINESTRING
都是直的,即仅由起始节点和结束节点组成,那么这就是您的解决方案:
SELECT h.id AS touched, v.id AS touching, ST_Intersection(h.the_geom, v.the_geom) AS touch_point
FROM my_table h -- "horizontal" T bar, being touched
JOIN my_table v ON -- "vertical" T bar, touching
(
-- The "vertical" start node touches, but not on either of the "horizonal" nodes
ST_Equals(ST_Intersection(h.the_geom, v.the_geom), ST_StartPoint(v.the_geom))
AND NOT ST_Equals(ST_StartPoint(h.the_geom), ST_StartPoint(v.the_geom))
AND NOT ST_Equals(ST_EndPoint(h.the_geom), ST_StartPoint(v.the_geom))
) OR (
-- The "vertical" end node touches, but not on either of the "horizonal" nodes
ST_Equals(ST_Intersection(h.the_geom, v.the_geom), ST_EndPoint(v.the_geom))
AND NOT ST_Equals(ST_StartPoint(h.the_geom), ST_EndPoint(v.the_geom))
AND NOT ST_Equals(ST_EndPoint(h.the_geom), ST_EndPoint(v.the_geom))
);
所有要求都在 JOIN ON
子句中检查。这也将返回 T 的“垂直”条与“水平”条接触的位置。请注意,条件在评估时会短路,并且对具有相同输入数据的函数的重复调用已优化为单次调用。
关于postgresql - 如何找到接触开始/结束节点的 LINESTRING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196500/
来自 here线性/区域应该工作。但是下面的代码导致编译错误? #include #include #include #include #include #include #include
我对 mySQL 空间函数有疑问。我的目标是查明 LINESTRING 对象是否穿过 POLYGON 对象。为了确定我已经尝试用两个 LINESTRING 对象进行试验以确定它们是否交叉。 SET @
所以我在 PostgreSQL 数据库中有一列同时包含 POINT 对象和 LINESTRING 对象。现在我的最终目标是从这些对象中提取纬度和经度。对于 POINT 对象,我可以通过查询简单地做到这
我一直在 iOS 版谷歌地图中以自定义方式规划路线。 如何解析 LINESTRING 中传入的 JSON? 我的线路: "coordInfo": "LINESTRING (28.64675172929
我有 geojson 文件。此文件包含 LineString 列表。我想从此列表创建多边形。但是每个 LineString 都是一个特征,我不知道哪个 LineString 创建了具体的多边形。注意
我的数据集包含一个 LineString我想过滤掉这个 LineString 的各个线段.更准确地说,每一个街道段。 到目前为止,我已经从数据集中提取了各个点并将它们保存在一个单独的列表中。此外,我想
我有一个渲染 LineStrings 的图层,并尝试对线条应用发光效果。我创建的样式使用自定义渲染器来创建具有垂直于每个线段的渐变的笔划: const glow_style = new Style({
我正在使用 SQL Server 2008 和 Geometry 数据类型来存储英国道路列表,该列表是我从 Ordanance Survey STRATEGI 导入的。数据集。 每条道路被分成多行,每
我有一个渲染 LineStrings 的图层,并尝试对线条应用发光效果。我创建的样式使用自定义渲染器来创建具有垂直于每个线段的渐变的笔划: const glow_style = new Style({
我尝试使用最新的稳定 OpenLayers 库绘制宽度以米为单位的 polyLine(道路车道),但它没有正确的实际宽度(在 Google Maps 图层顶部检查)。 这是对我有用的代码片段: pol
很抱歉打扰你们,但我已经被他的问题困扰了半天。 我想使用 LineString 对象在 OpenLayers 中绘制折线,所以我从文档中复制了示例。它运行正常,但我在屏幕上看不到这条线 代码是这样的
我有一个 LineString 序列,例如 lineString1 和 lineString2 其中 lineString1.getEndPoint() == lineString2.getStart
我使用 LINESTRING() 将路线的 GPS 坐标存储在一行中。当我想处理这些数据时,我需要使用另一个函数,即 X()、Y()、ASTEXT()、 GEOMFROMTEXT()等 我在想,如果再
好的,所以我知道如何将数据从 php 格式转换为 geojson 格式,但我不明白如何将其转换为 lineString 类型这是代码,所以问题是如何将坐标数据转换为一个数组: include(
我有一个名为 locations 的表,其中包含这些行: id uuid NOT NULL, "deviceId" text COLLATE pg_catalog."default", "userId
在 PostGIS 中,您可以使用以下方法使两个几何相交: geometry ST_Intersection (geometry geomA, geometry geomB); 在我的例子中,geom
在使用 shapely 时,我遇到了一个奇怪的问题。有 2 个点 p1 和 p2,第一个属于多边形,第二个不属于。当我试图找到包含这 2 个点的 LineString 与多边形边界线的端点之间的交点时
我有一组 GPS 位置,我用 Mapbox 将其放在 map 上,然后在点之间画一条线。 有没有办法画一条沿着道路的平滑/智能线?而不是我在图纸上得到的? Single marker
我正在尝试创建两个数组的单个 LineString 对象。我已经尝试了多种方法,但我不断得到: >>> array = [(0,0),(1,0),(2,0),(3,0)][(1,3),(1.4,2),
我正在尝试在离其他坐标最近的点处拆分 Shapely LineString。我可以使用 project 和 interpolate 获得直线上的最近点,但此时我无法拆分直线,因为它不是顶点。 我需要沿
我是一名优秀的程序员,十分优秀!