空间函数

空间函数用于在坐标参考系统(CRS)中指定二维或三维 POINT 值,并计算两个 POINT 值之间的测地距离。

示例图

以下图用于下面的部分示例。

graph spatial functions

要重新创建图,请针对空的 Neo4j 数据库运行以下查询

CREATE
  (copenhagen:TrainStation {latitude: 55.672874, longitude: 12.564590, city: 'Copenhagen'}),
  (malmo:Office {latitude: 55.611784, longitude: 12.994341, city: 'Malmö'}),
  (copenhagen)-[:TRAVEL_ROUTE]->(malmo)

point()

详情

语法

point(input)

描述

给定笛卡尔坐标系或 WGS 84 地理坐标系中的两到三个坐标值,返回一个二维或三维点对象。

参数

名称

类型

描述

input

MAP

笛卡尔二维: {
x :: FLOAT,
y :: FLOAT,
crs = "cartesian" :: STRING,
srid = 7203 :: INTEGER
}

笛卡尔三维: {
x :: FLOAT,
y :: FLOAT,
z :: FLOAT,
crs = "cartesian-3D" :: STRING,
srid = 9157 :: INTEGER
}

WGS 84 二维: {
longitude | x :: FLOAT
latitude | y :: FLOAT
crs = "WGS-84-2D" :: STRING
srid = 4326 :: INTEGER
}

WGS 84 三维: {
longitude | x :: FLOAT,
latitude | y :: FLOAT,
height | z :: FLOAT,
crs = "WGS-84-3D" :: STRING,
srid = 4979 :: INTEGER
}

返回

POINT

注意事项

如果提供给 point() 的任何参数为 null,则返回 null

如果使用 latitudelongitude 指定坐标,则 crssrid 字段是可选的,二维点将推断为 'WGS-84' (srid:4326),三维点将推断为 'WGS-84-3D' (srid:4979)。

如果使用 xy 指定坐标,并且需要地理 CRS,则 crssrid 字段是必需的。

如果未提供 height/z 键和值,则会根据所使用的坐标系返回 WGS 84笛卡尔 CRS 中的二维 POINT

crssrid 字段是可选的,二维点的默认值为 笛卡尔 CRS(即 srid:7203),三维点的默认值为 三维笛卡尔 CRS(即 srid:9157)。

示例 1. point() - WGS 84 二维
查询
RETURN point({longitude: 56.7, latitude: 12.78}) AS point

返回一个在 WGS 84 CRS 中,longitude56.7latitude12.78 的二维 POINT

结果
point

point({srid:4326, x:56.7, y:12.78})

行数: 1

示例 2. point() - WGS 84 二维
查询
RETURN point({x: 2.3, y: 4.5, crs: 'WGS-84'}) AS point

WGS 84 CRS 中,可以使用 xy 坐标分别代替 longitudelatitude,前提是 crs 设置为 'WGS-84',或 srid 设置为 4326

结果
point

point({srid:4326, x:2.3, y:4.5})

行数: 1

示例 3. point() - WGS 84 二维
查询
MATCH (p:Office)
RETURN point({longitude: p.longitude, latitude: p.latitude}) AS officePoint

返回一个表示马尔默市坐标的二维 POINT,位于 WGS 84 CRS 中。

结果
officePoint

point({srid:4326, x:12.994341, y:55.611784})

行数: 1

示例 4. point() - WGS 84 三维
查询
RETURN point({longitude: 56.7, latitude: 12.78, height: 8}) AS point

返回一个在 WGS 84 CRS 中,longitude56.7latitude12.78,高度为 8 米的三维 POINT

结果
point

point({srid:4979, x:56.7, y:12.78, z:8.0})

行数: 1

示例 5. point() - 笛卡尔二维
查询
RETURN point({x: 2.3, y: 4.5}) AS point

返回一个在 笛卡尔 CRS 中,x 坐标为 2.3y 坐标为 4.5 的二维 POINT

结果
point

point({srid:7203, x:2.3, y:4.5})

行数: 1

示例 6. point() - 笛卡尔三维
查询
RETURN point({x: 2.3, y: 4.5, z: 2}) AS point

返回一个在 笛卡尔 CRS 中,x 坐标为 2.3y 坐标为 4.5z 坐标为 2 的三维 POINT

结果
point

point({srid:9157, x:2.3, y:4.5, z:2.0})

行数: 1

示例 7. point() - null
查询
RETURN point(null) AS p

如果将 null 作为参数提供,则返回 null

结果
p

<null>

行数: 1

point.distance()

详情

语法

point.distance(from, to)

描述

返回一个 FLOAT,表示同一 CRS 中任意两点之间的距离。如果这些点位于 WGS 84 CRS 中,则该函数返回测地距离(即,沿地球曲面最短的路径)。如果这些点位于笛卡尔 CRS 中,则该函数返回欧几里得距离(即,在平面空间中最短的直线距离)。

参数

名称

类型

描述

from

POINT

起始点。

to

POINT

与起始点位于同一 CRS 中的终点。

返回

FLOAT

  • 如果 POINT 值位于 笛卡尔 CRS(二维或三维)中,则返回距离的单位将与点的单位相同,使用毕达哥拉斯定理计算。

  • 如果 POINT 值位于 WGS-84 CRS(二维)中,则返回距离的单位将是米,基于球面地球近似的半正矢公式。

  • 如果 POINT 值位于 WGS-84 CRS(三维)中,则返回距离的单位将是米。

    • 距离分两步计算。

      • 首先,使用球面地球上的半正矢公式,以两点的平均高度为基准。

      • 为了考虑高度差异,使用毕达哥拉斯定理,将先前计算的球面距离与高度差结合起来。

    • 此公式适用于靠近地球表面的点;例如,它非常适合计算飞机飞行的距离。然而,对于更高的海拔,例如计算两颗卫星之间的距离时,则不太适用。

注意事项

point.distance(null, null) 返回 null

point.distance(null, to) 返回 null

point.distance(from, null) 返回 null

尝试使用不同坐标参考系统(例如 WGS 84 二维和 WGS 84 三维)的点将返回 null

示例 8. point.distance()
查询
WITH
  point({x: 2.3, y: 4.5, crs: 'cartesian'}) AS p1,
  point({x: 1.1, y: 5.4, crs: 'cartesian'}) AS p2
RETURN point.distance(p1,p2) AS dist

返回 笛卡尔 CRS 中两个二维点之间的距离。

结果
dist

1.5

行数: 1

示例 9. point.distance()
查询
WITH
  point({longitude: 12.78, latitude: 56.7, height: 100}) AS p1,
  point({latitude: 56.71, longitude: 12.79, height: 100}) AS p2
RETURN point.distance(p1, p2) AS dist

示例 9. point.distance()

结果
dist

1269.9148706779097

行数: 1

返回 WGS 84 CRS 中两个三维点之间的距离。
查询
MATCH (t:TrainStation)-[:TRAVEL_ROUTE]->(o:Office)
WITH
  point({longitude: t.longitude, latitude: t.latitude}) AS trainPoint,
  point({longitude: o.longitude, latitude: o.latitude}) AS officePoint
RETURN round(point.distance(trainPoint, officePoint)) AS travelDistance

示例 10. point.distance()

结果
返回哥本哈根火车站和马尔默 Neo4j 办公室之间的距离。

27842.0

行数: 1

travelDistance
查询
RETURN point.distance(null, point({longitude: 56.7, latitude: 12.78})) AS d

示例 11. point.distance()

结果
如果其中一个或两个参数为 null,则返回 null

d

行数: 1

null

详情

语法

point.withinBBox()

描述

point.withinBBox(point, lowerLeft, upperRight)

参数

名称

类型

描述

point

POINT

如果提供的点位于由另外两个点定义的边界框内,则返回 true。

待确认在边界框内的点。

POINT

lowerLeft

边界框的左下点。

POINT

upperRight

返回

边界框的右上点。

注意事项

BOOLEAN

如果任何参数评估为 null,则 point.withinBBox(point, lowerLeft, upperRight) 将返回 null

尝试使用不同坐标参考系统(例如 WGS 84 二维和 WGS 84 三维)的 POINT 值将返回 null

point.withinBBox 将处理地理坐标中跨越 180 度子午线的情况。

在地理坐标中交换 lowerLeftupperRight 的经度将改变生成边界框的方向。

在地理坐标中交换 lowerLeftupperRight 的纬度,使得前者在后者的北方,将导致一个空范围。
查询
WITH
  point({x: 0, y: 0, crs: 'cartesian'}) AS lowerLeft,
  point({x: 10, y: 10, crs: 'cartesian'}) AS upperRight
RETURN point.withinBBox(point({x: 5, y: 5, crs: 'cartesian'}), lowerLeft, upperRight) AS result

示例 12. point.withinBBox()

结果
检查 笛卡尔 CRS 中的点是否包含在边界框中。

result

行数: 1

true
查询
WITH
  point({longitude: 12.53, latitude: 55.66}) AS lowerLeft,
  point({longitude: 12.614, latitude: 55.70}) AS upperRight
MATCH (t:TrainStation)
WHERE point.withinBBox(point({longitude: t.longitude, latitude: t.latitude}), lowerLeft, upperRight)
RETURN count(t)

示例 13. point.withinBBox()

结果
查找哥本哈根周围边界框中包含的所有火车站。

1

行数: 1

count(t)
查询
WITH
  point({longitude: 179, latitude: 55.66}) AS lowerLeft,
  point({longitude: -179, latitude: 55.70}) AS upperRight
RETURN point.withinBBox(point({longitude: 180, latitude: 55.66}), lowerLeft, upperRight) AS result

示例 14. point.withinBBox()

结果
检查 笛卡尔 CRS 中的点是否包含在边界框中。

result

行数: 1

一个跨越 180 度子午线的边界框。
查询
RETURN
  point.withinBBox(
    null,
    point({longitude: 56.7, latitude: 12.78}),
    point({longitude: 57.0, latitude: 13.0})
  ) AS in

示例 15. point.withinBBox()

结果
如果任何参数为 null,则返回 null

d

行数: 1

© . All rights reserved.