| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
2
|
|
|
2
|
|
79648
|
use strict; |
|
|
2
|
|
|
|
|
9
|
|
|
|
2
|
|
|
|
|
65
|
|
|
2
|
2
|
|
|
2
|
|
9
|
use warnings; |
|
|
2
|
|
|
|
|
4
|
|
|
|
2
|
|
|
|
|
106
|
|
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
package Neo4j::Types::Point; |
|
5
|
|
|
|
|
|
|
# ABSTRACT: Represents a Neo4j spatial point value |
|
6
|
|
|
|
|
|
|
$Neo4j::Types::Point::VERSION = '1.00'; |
|
7
|
|
|
|
|
|
|
|
|
8
|
2
|
|
|
2
|
|
11
|
use Carp qw(croak); |
|
|
2
|
|
|
|
|
2
|
|
|
|
2
|
|
|
|
|
750
|
|
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
my %DIM = ( 4326 => 2, 4979 => 3, 7203 => 2, 9157 => 3 ); |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
sub new { |
|
14
|
25
|
|
|
25
|
1
|
12015
|
my ($class, $srid, @coordinates) = @_; |
|
15
|
|
|
|
|
|
|
|
|
16
|
25
|
100
|
|
|
|
90
|
croak "Points must have SRID" unless defined $srid; |
|
17
|
21
|
|
|
|
|
40
|
my $dim = $DIM{$srid}; |
|
18
|
21
|
100
|
|
|
|
66
|
croak "Unsupported SRID $srid" unless defined $dim; |
|
19
|
17
|
100
|
|
|
|
101
|
croak "Points with SRID $srid must have $dim dimensions" if @coordinates < $dim; |
|
20
|
11
|
|
|
|
|
60
|
return bless [ $srid, @coordinates[0 .. $dim - 1] ], $class; |
|
21
|
|
|
|
|
|
|
} |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
|
|
24
|
2
|
|
|
2
|
1
|
8
|
sub X { shift->[1] } |
|
25
|
2
|
|
|
2
|
1
|
11
|
sub Y { shift->[2] } |
|
26
|
2
|
|
|
2
|
1
|
11
|
sub Z { shift->[3] } |
|
27
|
|
|
|
|
|
|
|
|
28
|
2
|
|
|
2
|
1
|
10
|
sub longitude { shift->[1] } |
|
29
|
2
|
|
|
2
|
1
|
22
|
sub latitude { shift->[2] } |
|
30
|
2
|
|
|
2
|
1
|
9
|
sub height { shift->[3] } |
|
31
|
|
|
|
|
|
|
|
|
32
|
7
|
|
|
7
|
1
|
1003
|
sub srid { shift->[0] } |
|
33
|
|
|
|
|
|
|
|
|
34
|
7
|
|
|
7
|
1
|
17
|
sub coordinates { @{$_[0]}[ 1 .. $#{$_[0]} ] } |
|
|
7
|
|
|
|
|
48
|
|
|
|
7
|
|
|
|
|
17
|
|
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
1; |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
=pod |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
=encoding UTF-8 |
|
42
|
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=head1 NAME |
|
44
|
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
Neo4j::Types::Point - Represents a Neo4j spatial point value |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
=head1 VERSION |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
version 1.00 |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
$longitude = $point->X; |
|
54
|
|
|
|
|
|
|
$latitude = $point->Y; |
|
55
|
|
|
|
|
|
|
$height = $point->Z; |
|
56
|
|
|
|
|
|
|
$neo4j_srid = $point->srid; |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
@coords = ($x, $y, $z); |
|
59
|
|
|
|
|
|
|
$point = Neo4j::Types::Point->new( $neo4j_srid, @coords ); |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
Represents a spatial point value in Neo4j. Includes coordinates in |
|
64
|
|
|
|
|
|
|
two or three dimensions and a SRID that may define their semantics. |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
The SRID and thereby the coordinate semantics are defined by Neo4j. |
|
67
|
|
|
|
|
|
|
See L"srid"> for details. |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
This module makes no assumptions about its internal data structure. |
|
70
|
|
|
|
|
|
|
While default implementations for all methods are provided, |
|
71
|
|
|
|
|
|
|
inheritors are free to override these according to their needs. |
|
72
|
|
|
|
|
|
|
The default implementations assume the data is stored in an array |
|
73
|
|
|
|
|
|
|
reference whose order of elements matches that of |
|
74
|
|
|
|
|
|
|
L |
|
75
|
|
|
|
|
|
|
for Point2D/Point3D. |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
Supported in Neo4j S and above. |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
=head1 METHODS |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
L implements the following methods. |
|
82
|
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=head2 coordinates |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
@coordinates = $point->coordinates; |
|
86
|
|
|
|
|
|
|
($x, $y, $z) = @coordinates; |
|
87
|
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
Retrieve the point's coordinates as a list. |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
=head2 height |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
$value = $point->height; |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
Alias for L|/"Z">. |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
=head2 latitude |
|
97
|
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
$value = $point->latitude; |
|
99
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
Alias for L|/"Y">. |
|
101
|
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=head2 longitude |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
$value = $point->longitude; |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
Alias for L|/"X">. |
|
107
|
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
=head2 new |
|
109
|
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
$point = Neo4j::Types::Point->new($neo4j_srid, @coordinates); |
|
111
|
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
Creates a new Point instance with the specified value. |
|
113
|
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
This method will fail if the SRID provided is not supported by Neo4j |
|
115
|
|
|
|
|
|
|
or if it requires a greater number of coordinates than provided. |
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
=head2 srid |
|
118
|
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
$neo4j_srid = $point->srid; |
|
120
|
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
Retrieve an identifier for this point's spatial reference system. |
|
122
|
|
|
|
|
|
|
This SRID has no meaning outside the context of Neo4j; in particular, |
|
123
|
|
|
|
|
|
|
it is B |
|
124
|
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
To date, Neo4j has defined four SRIDs: 4326, 4979, 7203, and 9157. |
|
126
|
|
|
|
|
|
|
Every point retrieved from Neo4j is referred to a coordinate system |
|
127
|
|
|
|
|
|
|
identified by one of them. |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
=over |
|
130
|
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=item Neo4j SRID 4326 |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
Geographical ellipsoidal coordinates, referred to WGS84 |
|
134
|
|
|
|
|
|
|
(but spherically developed with C in Cypher). |
|
135
|
|
|
|
|
|
|
Axes: longitude (East), latitude (North). Units: decimal degrees. |
|
136
|
|
|
|
|
|
|
Neo4j moniker: C. |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
=item Neo4j SRID 4979 |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
Geographical ellipsoidal coordinates, referred to WGS84 |
|
141
|
|
|
|
|
|
|
(but spherically developed with C in Cypher). |
|
142
|
|
|
|
|
|
|
Axes: longitude (East), latitude (North), height (Up). |
|
143
|
|
|
|
|
|
|
Units: decimal degrees; height in metres. The height is |
|
144
|
|
|
|
|
|
|
referred to the ellipsoid (which is not at sea level). |
|
145
|
|
|
|
|
|
|
Neo4j moniker: C. |
|
146
|
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
=item Neo4j SRID 7203 |
|
148
|
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
Coordinates in a two-dimensional Euclidian space (a plane). |
|
150
|
|
|
|
|
|
|
The geodetic datum, axis orientation and units are all undefined, |
|
151
|
|
|
|
|
|
|
but both axes must use the same unit. |
|
152
|
|
|
|
|
|
|
Neo4j moniker: C. |
|
153
|
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
=item Neo4j SRID 9157 |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
Coordinates in a three-dimensional Euclidian space. The geodetic |
|
157
|
|
|
|
|
|
|
datum, axis orientation and units are all undefined, but all axes |
|
158
|
|
|
|
|
|
|
must use the same unit. |
|
159
|
|
|
|
|
|
|
Neo4j moniker: C. |
|
160
|
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
=back |
|
162
|
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
The primary semantics of a Neo4j SRID can be easily determined by |
|
164
|
|
|
|
|
|
|
simple boolean expressions. |
|
165
|
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
$is_geographic = $neo4j_srid == 4326 or $neo4j_srid == 4979; |
|
167
|
|
|
|
|
|
|
$is_euclidian = $neo4j_srid == 7203 or $neo4j_srid == 9157; |
|
168
|
|
|
|
|
|
|
$is_2d = $neo4j_srid == 4326 or $neo4j_srid == 7203; |
|
169
|
|
|
|
|
|
|
$is_3d = $neo4j_srid == 4979 or $neo4j_srid == 9157; |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
Note that Neo4j does not support geographic coordinates that are |
|
172
|
|
|
|
|
|
|
referred to any other geodetic datum than WGS84 (such as GCJ02, |
|
173
|
|
|
|
|
|
|
ETRS89, NAD27, or local datums), nor does it support geographic |
|
174
|
|
|
|
|
|
|
coordinates that are referred to an unknown datum. While it is |
|
175
|
|
|
|
|
|
|
technically possible to ignore Neo4j SRID semantics and just use |
|
176
|
|
|
|
|
|
|
other geographic coordinate reference systems anyway, you should |
|
177
|
|
|
|
|
|
|
be aware that this may create interoperability issues, particularly |
|
178
|
|
|
|
|
|
|
if more than a single client uses the Neo4j database. |
|
179
|
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
Neo4j does I impose constraints on the datum of Euclidian |
|
181
|
|
|
|
|
|
|
coordinates, so using (for example) cartesian coordinates referred |
|
182
|
|
|
|
|
|
|
to WGS84 is possible. However, Neo4j does not offer a way to tag |
|
183
|
|
|
|
|
|
|
point values with the datum they actually use. Care should be taken |
|
184
|
|
|
|
|
|
|
not to mix different geodetic datums in the same database without |
|
185
|
|
|
|
|
|
|
considering the interoperability issues that this may cause, again |
|
186
|
|
|
|
|
|
|
particularly if more than a single client uses the Neo4j database. |
|
187
|
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
=head2 X |
|
189
|
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
$value = $point->X; |
|
191
|
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
Retrieve the point's first ordinate, also known as the abscissa. |
|
193
|
|
|
|
|
|
|
Commonly used for the horizontal axis in an Euclidean plane or for |
|
194
|
|
|
|
|
|
|
the geographical longitude. |
|
195
|
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
=head2 Y |
|
197
|
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
$value = $point->Y; |
|
199
|
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
Retrieve the point's second ordinate. Commonly used for the vertical |
|
201
|
|
|
|
|
|
|
axis in an Euclidean plane or for the geographical latitude. |
|
202
|
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
=head2 Z |
|
204
|
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
$value = $point->Z; |
|
206
|
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
Retrieve the point's third ordinate. Commonly used for height. |
|
208
|
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
For points in coordinate systems that have no more than two |
|
210
|
|
|
|
|
|
|
dimensions, this method returns an undefined value. |
|
211
|
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
=head1 BUGS |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
The behaviour of the C method when called in scalar |
|
215
|
|
|
|
|
|
|
context has not yet been defined. |
|
216
|
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
There are currently no methods named C, C, or C. |
|
218
|
|
|
|
|
|
|
This is to avoid confusion with Perl's C operator. |
|
219
|
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
221
|
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
=over |
|
223
|
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
=item * L |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
=item * L<"Spatial values" in Neo4j Cypher Manual|https://neo4j.com/docs/cypher-manual/current/syntax/spatial/> |
|
227
|
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
=back |
|
229
|
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
=head1 AUTHOR |
|
231
|
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
Arne Johannessen |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
This software is Copyright (c) 2021 by Arne Johannessen. |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
This is free software, licensed under: |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
The Artistic License 2.0 (GPL Compatible) |
|
241
|
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
=cut |
|
243
|
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
__END__ |