空间函数
空间函数用于在坐标参考系统(CRS)中指定 2D 或 3D POINT(点)值,并计算两个 POINT 值之间的测地距离。
示例图
下方的图表用于下文中的部分示例。
要重新创建该图,请在空的 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()
语法 |
|
||
描述 |
返回一个 2D 或 3D 点对象,该对象由笛卡尔坐标系或 WGS 84 地理坐标系中的两个或三个坐标值给定。 |
||
参数 |
名称 |
类型 |
描述 |
|
|
笛卡尔 2D: 笛卡尔 3D: WGS 84 2D: WGS 84 3D: |
|
返回 |
|
||
如果提供给 |
如果使用 |
如果使用 |
如果未提供 |
|
RETURN point({longitude: 56.7, latitude: 12.78}) AS point
返回一个 WGS 84 CRS 下的 2D POINT,其 longitude 为 56.7,latitude 为 12.78。
| point |
|---|
|
行:1 |
RETURN point({x: 2.3, y: 4.5, crs: 'WGS-84'}) AS point
如果 crs 设置为 'WGS-84',或者 srid 设置为 4326,则可以在 WGS 84 CRS 中使用 x 和 y 坐标代替 longitude 和 latitude。
| point |
|---|
|
行:1 |
MATCH (p:Office)
RETURN point({longitude: p.longitude, latitude: p.latitude}) AS officePoint
返回一个表示马尔默市坐标的 WGS 84 CRS 下的 2D POINT。
| officePoint |
|---|
|
行:1 |
RETURN point({longitude: 56.7, latitude: 12.78, height: 8}) AS point
返回一个 WGS 84 CRS 下的 3D POINT,其 longitude 为 56.7,latitude 为 12.78,高度为 8 米。
| point |
|---|
|
行:1 |
RETURN point({x: 2.3, y: 4.5}) AS point
返回一个 笛卡尔 CRS 下的 2D POINT,其 x 坐标为 2.3,y 坐标为 4.5。
| point |
|---|
|
行:1 |
RETURN point({x: 2.3, y: 4.5, z: 2}) AS point
返回一个 笛卡尔 CRS 下的 3D POINT,其 x 坐标为 2.3,y 坐标为 4.5,z 坐标为 2。
| point |
|---|
|
行:1 |
RETURN point(null) AS p
如果将 null 作为参数提供,则返回 null。
| p |
|---|
|
行:1 |
point.distance()
语法 |
|
||
描述 |
返回一个表示同一坐标参考系中任意两点之间距离的 |
||
参数 |
名称 |
类型 |
描述 |
|
|
起始点。 |
|
|
|
与起始点在同一 CRS 下的结束点。 |
|
返回 |
|
||
-
如果
POINT值处于 笛卡尔 CRS(2D 或 3D)中,则返回距离的单位将与点坐标的单位相同,并通过勾股定理计算得出。 -
如果
POINT值处于 WGS-84 CRS(2D)中,则返回距离的单位将为米,基于球面地球近似的半正矢公式(haversine formula)计算得出。 -
如果
POINT值处于 WGS-84 CRS(3D)中,则返回距离的单位将为米。-
距离的计算分为两步。
-
首先,在两点平均高度处使用球面地球的半正矢公式。
-
为计算高度差,使用勾股定理,将之前计算的球面距离与高度差相结合。
-
-
该公式对于靠近地表的点非常有效;例如,它非常适合计算飞机航线的距离。但对于更高的高度(例如计算两颗卫星之间的距离)则不太适用。
-
|
|
|
尝试使用不同坐标参考系统的点(例如 WGS 84 2D 和 WGS 84 3D)将返回 |
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 中两个 2D 点之间的距离。
| dist |
|---|
|
行:1 |
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
返回 WGS 84 CRS 中两个 3D 点之间的距离。
| dist |
|---|
|
行:1 |
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
返回哥本哈根火车站与马尔默 Neo4j 办公室之间的距离。
| travelDistance |
|---|
|
行:1 |
RETURN point.distance(null, point({longitude: 56.7, latitude: 12.78})) AS d
如果将 null 作为其中一个或两个参数提供,则返回 null。
| d |
|---|
|
行:1 |
point.withinBBox()
语法 |
|
||
描述 |
如果给定的点在由两个给定点定义的边界框内,则返回 true。 |
||
参数 |
名称 |
类型 |
描述 |
|
|
要在边界框内确认的点。 |
|
|
|
边界框的左下角点。 |
|
|
|
边界框的右上角点。 |
|
返回 |
|
||
如果任何参数的计算结果为 |
尝试使用不同坐标参考系统的 |
|
切换地理坐标中 |
如果切换地理坐标中 |
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
检查 笛卡尔 CRS 中的点是否包含在边界框内。
| 结果 |
|---|
|
行:1 |
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)
查找哥本哈根周围边界框内的所有火车站。
| count(t) |
|---|
|
行:1 |
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
跨越 180 度经线的边界框。
| 结果 |
|---|
|
行:1 |
RETURN
point.withinBBox(
null,
point({longitude: 56.7, latitude: 12.78}),
point({longitude: 57.0, latitude: 13.0})
) AS in
如果将 null 作为任何参数提供,则返回 null。
| in |
|---|
|
行:1 |