空间函数
空间函数用于在坐标参考系 (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()
语法 |
|
||
描述 |
在笛卡尔坐标系或 WGS 84 地理坐标系中,给定两个或分别三个坐标值,返回一个 2D 或 3D 点对象。 |
||
参数 |
名称 |
类型 |
描述 |
|
|
笛卡尔 2D: 笛卡尔 3D: WGS 84 2D: WGS 84 3D: |
|
返回 |
|
如果提供给 |
如果使用 |
如果使用 |
如果没有提供 |
|
RETURN point({longitude: 56.7, latitude: 12.78}) AS point
返回一个 2D POINT
,其 longitude
为 56.7
,latitude
为 12.78
,位于 _WGS 84_ CRS 中。
point |
---|
|
行数:1 |
RETURN point({x: 2.3, y: 4.5, crs: 'WGS-84'}) AS point
x
和 y
坐标可以在 _WGS 84_ CRS 中使用,而不是分别使用 longitude
和 latitude
,前提是 crs
设置为 'WGS-84'
,或者 srid
设置为 4326
。
point |
---|
|
行数:1 |
MATCH (p:Office)
RETURN point({longitude: p.longitude, latitude: p.latitude}) AS officePoint
返回一个 2D POINT
,表示 _WGS 84_ CRS 中马尔默市坐标。
officePoint |
---|
|
行数:1 |
RETURN point({longitude: 56.7, latitude: 12.78, height: 8}) AS point
返回一个 3D POINT
,其 longitude
为 56.7
,latitude
为 12.78
,高度为 8
米,位于 _WGS 84_ CRS 中。
point |
---|
|
行数:1 |
RETURN point({x: 2.3, y: 4.5}) AS point
返回一个 2D POINT
,其 x
坐标为 2.3
,y
坐标为 4.5
,位于 _笛卡尔_ CRS 中。
point |
---|
|
行数:1 |
RETURN point({x: 2.3, y: 4.5, z: 2}) AS point
返回一个 3D POINT
,其 x
坐标为 2.3
,y
坐标为 4.5
,z
坐标为 2
,位于 _笛卡尔_ CRS 中。
point |
---|
|
行数:1 |
RETURN point(null) AS p
如果提供 null
作为参数,则返回 null
。
p |
---|
|
行数:1 |
point.distance()
语法 |
|
||
描述 |
返回一个 |
||
参数 |
名称 |
类型 |
描述 |
|
|
起点。 |
|
|
|
与起点位于同一 CRS 中的终点。 |
|
返回 |
|
-
如果
POINT
值位于 _笛卡尔_ CRS(2D 或 3D)中,则返回的距离单位将与点的单位相同,使用勾股定理计算。 -
如果
POINT
值位于 _WGS-84_ CRS(2D)中,则返回的距离单位将为米,基于球形地球近似上的半正矢公式。 -
如果
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 中两个二维点之间的距离。
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 中两个三维点之间的距离。
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。 |
||
参数 |
名称 |
类型 |
描述 |
|
|
要确认在边界框中的点。 |
|
|
|
边界框的左下角点。 |
|
|
|
边界框的右上角点。 |
|
返回 |
|
如果任何参数计算为 |
尝试使用不同坐标参考系统(例如 WGS 84 2D 和 WGS 84 3D)的 |
|
在地理坐标中切换 |
在地理坐标中切换 |
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 中的点是否包含在边界框中。
result |
---|
|
行数: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 度经线的边界框。
result |
---|
|
行数: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 |