activerecord-postgis-adapter 2.2.2 → 3.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/active_record/connection_adapters/postgis_adapter.rb +2 -1
- data/lib/active_record/connection_adapters/postgis_adapter/arel_tosql.rb +9 -5
- data/lib/active_record/connection_adapters/postgis_adapter/create_connection.rb +7 -1
- data/lib/active_record/connection_adapters/postgis_adapter/main_adapter.rb +44 -185
- data/lib/active_record/connection_adapters/postgis_adapter/oid/spatial.rb +119 -0
- data/lib/active_record/connection_adapters/postgis_adapter/schema_statements.rb +110 -0
- data/lib/active_record/connection_adapters/postgis_adapter/spatial_column.rb +32 -122
- data/lib/active_record/connection_adapters/postgis_adapter/spatial_column_info.rb +2 -2
- data/lib/active_record/connection_adapters/postgis_adapter/spatial_table_definition.rb +115 -65
- data/lib/active_record/connection_adapters/postgis_adapter/version.rb +1 -1
- data/test/basic_test.rb +129 -159
- data/test/ddl_test.rb +240 -256
- data/test/nested_class_test.rb +7 -18
- data/test/spatial_queries_test.rb +67 -85
- data/test/tasks_test.rb +116 -117
- data/test/test_helper.rb +20 -0
- data/test/type_test.rb +26 -0
- metadata +33 -22
- data/lib/active_record/connection_adapters/postgis_adapter/common_adapter_methods.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5da85e153ac728aed4dd05c63c31db2b8408db33
|
4
|
+
data.tar.gz: e1fb8123e8ac236ff5299d19f691147a510f9d22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6af550d08c16c0eff95249fc80e08eb9aabf59e1cfac0c163edd43506ee6c6887b6acba7e7eac4f6ca3f63a6052f4479ba3337c48c4cbdfce88d21cf0874de8
|
7
|
+
data.tar.gz: 9bbe835d52ed5d41f91c1d22e58564775f7c200d52ea772a7818c9987456949fbffa7393e81ad20acec16edd6ccae52b1b95363f3403a920e046f810e3451ee6
|
@@ -17,13 +17,14 @@ require 'active_record/connection_adapters/postgresql_adapter'
|
|
17
17
|
require 'rgeo/active_record'
|
18
18
|
|
19
19
|
require 'active_record/connection_adapters/postgis_adapter/version'
|
20
|
-
require 'active_record/connection_adapters/postgis_adapter/
|
20
|
+
require 'active_record/connection_adapters/postgis_adapter/schema_statements'
|
21
21
|
require 'active_record/connection_adapters/postgis_adapter/main_adapter'
|
22
22
|
require 'active_record/connection_adapters/postgis_adapter/spatial_column_info'
|
23
23
|
require 'active_record/connection_adapters/postgis_adapter/spatial_table_definition'
|
24
24
|
require 'active_record/connection_adapters/postgis_adapter/spatial_column'
|
25
25
|
require 'active_record/connection_adapters/postgis_adapter/arel_tosql'
|
26
26
|
require 'active_record/connection_adapters/postgis_adapter/setup'
|
27
|
+
require 'active_record/connection_adapters/postgis_adapter/oid/spatial'
|
27
28
|
require 'active_record/connection_adapters/postgis_adapter/create_connection'
|
28
29
|
require 'active_record/connection_adapters/postgis_adapter/postgis_database_tasks'
|
29
30
|
|
@@ -4,7 +4,7 @@ module Arel # :nodoc:
|
|
4
4
|
PostGISSuperclass = if defined?(::ArJdbc::PostgreSQL::BindSubstitution)
|
5
5
|
::ArJdbc::PostgreSQL::BindSubstitution
|
6
6
|
else
|
7
|
-
|
7
|
+
PostgreSQL
|
8
8
|
end
|
9
9
|
|
10
10
|
class PostGIS < PostGISSuperclass # :nodoc:
|
@@ -13,17 +13,21 @@ module Arel # :nodoc:
|
|
13
13
|
'st_wkttosql' => 'ST_GeomFromEWKT',
|
14
14
|
}
|
15
15
|
|
16
|
-
include
|
16
|
+
include RGeo::ActiveRecord::SpatialToSql
|
17
17
|
|
18
18
|
def st_func(standard_name)
|
19
19
|
FUNC_MAP[standard_name.downcase] || standard_name
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
def visit_String(node, collector)
|
23
|
+
collector << "#{st_func('ST_WKTToSQL')}(#{quote(node)})"
|
24
|
+
end
|
23
25
|
|
24
|
-
|
26
|
+
def visit_RGeo_ActiveRecord_SpatialNamedFunction(node, collector)
|
27
|
+
aggregate(st_func(node.name), node, collector)
|
28
|
+
end
|
25
29
|
|
26
|
-
|
30
|
+
end
|
27
31
|
|
28
32
|
end
|
29
33
|
end
|
@@ -6,13 +6,18 @@ end
|
|
6
6
|
|
7
7
|
module ActiveRecord # :nodoc:
|
8
8
|
module ConnectionHandling # :nodoc:
|
9
|
+
|
9
10
|
if(defined?(::RUBY_ENGINE) && ::RUBY_ENGINE == 'jruby')
|
11
|
+
|
10
12
|
def postgis_connection(config)
|
11
13
|
config[:adapter_class] = ::ActiveRecord::ConnectionAdapters::PostGISAdapter::MainAdapter
|
12
14
|
postgresql_connection(config)
|
13
15
|
end
|
16
|
+
|
14
17
|
alias_method :jdbcpostgis_connection, :postgis_connection
|
18
|
+
|
15
19
|
else
|
20
|
+
|
16
21
|
# Based on the default <tt>postgresql_connection</tt> definition from ActiveRecord.
|
17
22
|
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
|
18
23
|
def postgis_connection(config)
|
@@ -30,8 +35,9 @@ module ActiveRecord # :nodoc:
|
|
30
35
|
|
31
36
|
# The postgres drivers don't allow the creation of an unconnected PGconn object,
|
32
37
|
# so just pass a nil connection object for the time being.
|
33
|
-
|
38
|
+
ConnectionAdapters::PostGISAdapter::MainAdapter.new(nil, logger, conn_params, config)
|
34
39
|
end
|
40
|
+
|
35
41
|
end
|
36
42
|
|
37
43
|
end
|
@@ -2,213 +2,72 @@ module ActiveRecord # :nodoc:
|
|
2
2
|
module ConnectionAdapters # :nodoc:
|
3
3
|
module PostGISAdapter # :nodoc:
|
4
4
|
class MainAdapter < PostgreSQLAdapter # :nodoc:
|
5
|
+
SPATIAL_COLUMN_OPTIONS =
|
6
|
+
{
|
7
|
+
geography: { geographic: true },
|
8
|
+
geometry: {},
|
9
|
+
geometry_collection: {},
|
10
|
+
line_string: {},
|
11
|
+
multi_line_string: {},
|
12
|
+
multi_point: {},
|
13
|
+
multi_polygon: {},
|
14
|
+
spatial: {},
|
15
|
+
st_point: {},
|
16
|
+
st_polygon: {},
|
17
|
+
}
|
18
|
+
|
19
|
+
# http://postgis.17.x6.nabble.com/Default-SRID-td5001115.html
|
20
|
+
DEFAULT_SRID = 0
|
21
|
+
|
5
22
|
def initialize(*args)
|
6
|
-
# Overridden to change the visitor
|
7
23
|
super
|
8
|
-
@visitor =
|
24
|
+
@visitor = Arel::Visitors::PostGIS.new(self)
|
9
25
|
end
|
10
26
|
|
11
|
-
include PostGISAdapter::
|
27
|
+
include PostGISAdapter::SchemaStatements
|
12
28
|
|
13
|
-
|
29
|
+
# def schema_creation
|
30
|
+
# PostGISAdapter::SchemaCreation.new self
|
31
|
+
# end
|
14
32
|
|
15
|
-
def
|
16
|
-
|
17
|
-
@@native_database_types ||= super.merge(
|
18
|
-
geography: { name: 'geography' },
|
19
|
-
spatial: { name: 'geometry' },
|
20
|
-
)
|
33
|
+
def set_rgeo_factory_settings(factory_settings)
|
34
|
+
@rgeo_factory_settings = factory_settings
|
21
35
|
end
|
22
36
|
|
23
|
-
def
|
24
|
-
|
25
|
-
::RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true).generate(value)
|
26
|
-
else
|
27
|
-
super
|
28
|
-
end
|
37
|
+
def adapter_name
|
38
|
+
ADAPTER_NAME
|
29
39
|
end
|
30
40
|
|
31
|
-
|
32
|
-
|
33
|
-
def columns(table_name, name = nil)
|
34
|
-
column_info = SpatialColumnInfo.new(self, quote_string(table_name.to_s))
|
35
|
-
# Limit, precision, and scale are all handled by the superclass.
|
36
|
-
column_definitions(table_name).map do |column_name, type, default, notnull, oid, fmod|
|
37
|
-
# JDBC gets true/false in Rails 4, where other platforms get
|
38
|
-
# 't'/'f' strings.
|
39
|
-
if(notnull.is_a?(String))
|
40
|
-
notnull = (notnull == 't')
|
41
|
-
end
|
42
|
-
|
43
|
-
oid = column_type_map.fetch(oid.to_i, fmod.to_i) { OID::Identity.new }
|
44
|
-
SpatialColumn.new(@rgeo_factory_settings,
|
45
|
-
table_name,
|
46
|
-
column_name,
|
47
|
-
default,
|
48
|
-
oid,
|
49
|
-
type,
|
50
|
-
!notnull,
|
51
|
-
column_info.get(column_name, type))
|
52
|
-
end
|
41
|
+
def self.spatial_column_options(key)
|
42
|
+
SPATIAL_COLUMN_OPTIONS[key]
|
53
43
|
end
|
54
44
|
|
55
|
-
|
56
|
-
|
57
|
-
def indexes(table_name, name = nil)
|
58
|
-
result = query(<<-SQL, 'SCHEMA')
|
59
|
-
SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid
|
60
|
-
FROM pg_class t
|
61
|
-
INNER JOIN pg_index d ON t.oid = d.indrelid
|
62
|
-
INNER JOIN pg_class i ON d.indexrelid = i.oid
|
63
|
-
WHERE i.relkind = 'i'
|
64
|
-
AND d.indisprimary = 'f'
|
65
|
-
AND t.relname = '#{table_name}'
|
66
|
-
AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY (current_schemas(false)) )
|
67
|
-
ORDER BY i.relname
|
68
|
-
SQL
|
69
|
-
|
70
|
-
result.map do |row|
|
71
|
-
index_name = row[0]
|
72
|
-
unique = row[1] == 't'
|
73
|
-
indkey = row[2].split(" ")
|
74
|
-
inddef = row[3]
|
75
|
-
oid = row[4]
|
76
|
-
|
77
|
-
columns = query(<<-SQL, "SCHEMA")
|
78
|
-
SELECT a.attnum, a.attname, t.typname
|
79
|
-
FROM pg_attribute a, pg_type t
|
80
|
-
WHERE a.attrelid = #{oid}
|
81
|
-
AND a.attnum IN (#{indkey.join(",")})
|
82
|
-
AND a.atttypid = t.oid
|
83
|
-
SQL
|
84
|
-
columns = columns.inject({}){ |h, r| h[r[0].to_s] = [r[1], r[2]]; h }
|
85
|
-
column_names = columns.values_at(*indkey).compact.map{ |a| a[0] }
|
86
|
-
|
87
|
-
unless column_names.empty?
|
88
|
-
# add info on sort order for columns (only desc order is explicitly specified, asc is the default)
|
89
|
-
desc_order_columns = inddef.scan(/(\w+) DESC/).flatten
|
90
|
-
orders = desc_order_columns.any? ? Hash[desc_order_columns.map {|order_column| [order_column, :desc]}] : {}
|
91
|
-
where = inddef.scan(/WHERE (.+)$/).flatten[0]
|
92
|
-
# using = inddef.scan(/USING (.+?) /).flatten[0].to_sym
|
93
|
-
|
94
|
-
spatial = inddef =~ /using\s+gist/i &&
|
95
|
-
columns.size == 1 &&
|
96
|
-
%w[geometry geography].include?(columns.values.first[1])
|
97
|
-
|
98
|
-
# IndexDefinition.new(table_name, index_name, unique, column_names, [], orders, where, nil, using)
|
99
|
-
::RGeo::ActiveRecord::SpatialIndexDefinition.new(table_name, index_name, unique, column_names, [], orders, where, !!spatial)
|
100
|
-
end
|
101
|
-
end.compact
|
45
|
+
def postgis_lib_version
|
46
|
+
@postgis_lib_version ||= select_value("SELECT PostGIS_Lib_Version()")
|
102
47
|
end
|
103
48
|
|
104
|
-
def
|
105
|
-
|
106
|
-
if ActiveRecord::VERSION::STRING > '4.1'
|
107
|
-
PostGISAdapter::TableDefinition.new(native_database_types, name, temporary, options, as, self)
|
108
|
-
else
|
109
|
-
PostGISAdapter::TableDefinition.new(native_database_types, name, temporary, options, self)
|
110
|
-
end
|
49
|
+
def default_srid
|
50
|
+
DEFAULT_SRID
|
111
51
|
end
|
112
52
|
|
113
|
-
def
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
end
|
121
|
-
table_definition.non_geographic_spatial_columns.each do |col|
|
122
|
-
options = {
|
123
|
-
default: col.default,
|
124
|
-
has_m: col.has_m?,
|
125
|
-
has_z: col.has_z?,
|
126
|
-
null: col.null,
|
127
|
-
srid: col.srid,
|
128
|
-
type: col.spatial_type,
|
129
|
-
}
|
130
|
-
column_name = col.name.to_s
|
131
|
-
type = col.spatial_type
|
132
|
-
|
133
|
-
add_spatial_column(table_name, column_name, type, options)
|
134
|
-
end
|
53
|
+
def srs_database_columns
|
54
|
+
{
|
55
|
+
auth_name_column: 'auth_name',
|
56
|
+
auth_srid_column: 'auth_srid',
|
57
|
+
proj4text_column: 'proj4text',
|
58
|
+
srtext_column: 'srtext',
|
59
|
+
}
|
135
60
|
end
|
136
61
|
|
137
|
-
def
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
add_spatial_column(table_name, column_name, type, options)
|
62
|
+
def quote(value, column = nil)
|
63
|
+
if RGeo::Feature::Geometry.check_type(value)
|
64
|
+
"'#{ RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true).generate(value) }'"
|
65
|
+
elsif value.is_a?(RGeo::Cartesian::BoundingBox)
|
66
|
+
"'#{ value.min_x },#{ value.min_y },#{ value.max_x },#{ value.max_y }'::box"
|
143
67
|
else
|
144
68
|
super
|
145
69
|
end
|
146
70
|
end
|
147
|
-
|
148
|
-
def remove_column(table_name, column_name, type = nil, options = {})
|
149
|
-
table_name = table_name.to_s
|
150
|
-
column_name = column_name.to_s
|
151
|
-
spatial_info = spatial_column_info(table_name)
|
152
|
-
if spatial_info.include?(column_name)
|
153
|
-
execute("SELECT DropGeometryColumn('#{quote_string(table_name)}','#{quote_string(column_name)}')")
|
154
|
-
else
|
155
|
-
super
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
# FULL REPLACEMENT. RE-CHECK ON NEW VERSIONS
|
160
|
-
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
|
161
|
-
def add_index(table_name, column_name, options = {})
|
162
|
-
# We have to fully replace to add the gist clause.
|
163
|
-
options ||= {} # in case nil explicitly passed
|
164
|
-
gist = options.delete(:spatial)
|
165
|
-
index_name, index_type, index_columns, index_options, index_algorithm, index_using = add_index_options(table_name, column_name, options)
|
166
|
-
index_using = 'USING GIST' if gist
|
167
|
-
execute "CREATE #{index_type} INDEX #{index_algorithm} #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} #{index_using} (#{index_columns})#{index_options}"
|
168
|
-
end
|
169
|
-
|
170
|
-
def spatial_column_info(table_name)
|
171
|
-
SpatialColumnInfo.new(self, quote_string(table_name.to_s)).all
|
172
|
-
end
|
173
|
-
|
174
|
-
private
|
175
|
-
|
176
|
-
def add_spatial_column(table_name, column_name, type, options)
|
177
|
-
limit = options[:limit]
|
178
|
-
info = options[:info] || {}
|
179
|
-
options.merge!(limit) if limit.is_a?(::Hash)
|
180
|
-
type = (options[:type] || info[:type] || type).to_s.gsub('_', '').upcase
|
181
|
-
has_z = options[:has_z]
|
182
|
-
has_m = options[:has_m]
|
183
|
-
srid = (options[:srid] || PostGISAdapter::DEFAULT_SRID).to_i
|
184
|
-
if options[:geographic]
|
185
|
-
type << 'Z' if has_z
|
186
|
-
type << 'M' if has_m
|
187
|
-
execute("ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{quote_column_name(column_name)} GEOGRAPHY(#{type},#{srid})")
|
188
|
-
change_column_default(table_name, column_name, options[:default]) if options_include_default?(options)
|
189
|
-
change_column_null(table_name, column_name, false, options[:default]) if options[:null] == false
|
190
|
-
else
|
191
|
-
type = "#{type}M" if has_m && !has_z
|
192
|
-
dimensions = set_dimensions(has_m, has_z)
|
193
|
-
execute("SELECT AddGeometryColumn('#{quote_string(table_name)}', '#{quote_string(column_name)}', #{srid}, '#{quote_string(type)}', #{dimensions})")
|
194
|
-
change_column_null(table_name, column_name, false, options[:default]) if options[:null] == false
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def column_type_map
|
199
|
-
if defined?(type_map) # ActiveRecord 4.1+
|
200
|
-
type_map
|
201
|
-
else # ActiveRecord 4.0.x
|
202
|
-
OID::TYPE_MAP
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
def set_dimensions(has_m, has_z)
|
207
|
-
dimensions = 2
|
208
|
-
dimensions += 1 if has_z
|
209
|
-
dimensions += 1 if has_m
|
210
|
-
dimensions
|
211
|
-
end
|
212
71
|
end
|
213
72
|
end
|
214
73
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module PostGISAdapter
|
4
|
+
module OID
|
5
|
+
class Spatial < Type::Value
|
6
|
+
# sql_type is a string that comes from the database definition
|
7
|
+
# examples:
|
8
|
+
# "geometry(Point,4326)"
|
9
|
+
# "geography(Point,4326)"
|
10
|
+
# "geometry(Polygon,4326) NOT NULL"
|
11
|
+
# "geometry(Geography,4326)"
|
12
|
+
def initialize(oid, sql_type)
|
13
|
+
@geo_type, @srid, @has_z, @has_m = self.class.parse_sql_type(sql_type)
|
14
|
+
@factory_generator = RGeo::Geographic.spherical_factory(srid: 4326) if oid =~ /geography/
|
15
|
+
end
|
16
|
+
|
17
|
+
# sql_type: geometry, geometry(Point), geometry(Point,4326), ...
|
18
|
+
#
|
19
|
+
# returns [geo_type, srid, has_z, has_m]
|
20
|
+
# geo_type: geography, geometry, point, line_string, polygon, ...
|
21
|
+
# srid: 1234
|
22
|
+
# has_z: false
|
23
|
+
# has_m: false
|
24
|
+
def self.parse_sql_type(sql_type)
|
25
|
+
geo_type, srid, has_z, has_m = nil, 0, false, false
|
26
|
+
|
27
|
+
if (sql_type =~ /[geography,geography]\((.*)\)$/i)
|
28
|
+
# geometry(Point,4326)
|
29
|
+
params = $1.split(',')
|
30
|
+
if params.size > 1
|
31
|
+
if params.first =~ /([a-z]+[^zm])(z?)(m?)/i
|
32
|
+
has_z = $2.length > 0
|
33
|
+
has_m = $3.length > 0
|
34
|
+
geo_type = $1
|
35
|
+
end
|
36
|
+
if params.last =~ /(\d+)/
|
37
|
+
srid = $1.to_i
|
38
|
+
end
|
39
|
+
else
|
40
|
+
# geometry(Point)
|
41
|
+
geo_type = params[0]
|
42
|
+
end
|
43
|
+
else
|
44
|
+
# geometry
|
45
|
+
geo_type = sql_type
|
46
|
+
end
|
47
|
+
[geo_type, srid, has_z, has_m]
|
48
|
+
end
|
49
|
+
|
50
|
+
def factory_generator
|
51
|
+
@factory_generator
|
52
|
+
end
|
53
|
+
|
54
|
+
def geographic?
|
55
|
+
!!factory_generator
|
56
|
+
end
|
57
|
+
|
58
|
+
def spatial?
|
59
|
+
true
|
60
|
+
end
|
61
|
+
|
62
|
+
def type
|
63
|
+
geographic? ? :geography : :geometry
|
64
|
+
end
|
65
|
+
|
66
|
+
# support setting an RGeo object or a WKT string
|
67
|
+
def type_cast_for_database(value)
|
68
|
+
return if value.nil?
|
69
|
+
geo_value = type_cast(value)
|
70
|
+
|
71
|
+
# TODO - only valid types should be allowed
|
72
|
+
# e.g. linestring is not valid for point column
|
73
|
+
# raise "maybe should raise" unless RGeo::Feature::Geometry.check_type(geo_value)
|
74
|
+
|
75
|
+
RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true)
|
76
|
+
.generate(geo_value)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def type_cast(value)
|
82
|
+
return if value.nil?
|
83
|
+
String === value ? parse_wkt(value) : value
|
84
|
+
end
|
85
|
+
|
86
|
+
def cast_value(value)
|
87
|
+
return if value.nil?
|
88
|
+
RGeo::WKRep::WKBParser.new(@factory_generator, support_ewkb: true).parse(value)
|
89
|
+
rescue RGeo::Error::ParseError
|
90
|
+
puts "\ncast failed!!\n\n"
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
|
94
|
+
# convert WKT string into RGeo object
|
95
|
+
def parse_wkt(string)
|
96
|
+
# factory = factory_settings.get_column_factory(table_name, column, constraints)
|
97
|
+
factory = @factory_generator || RGeo::ActiveRecord::RGeoFactorySettings.new
|
98
|
+
wkt_parser(factory, string).parse(string)
|
99
|
+
rescue RGeo::Error::ParseError
|
100
|
+
nil
|
101
|
+
end
|
102
|
+
|
103
|
+
def binary?(string)
|
104
|
+
string[0] == "\x00" || string[0] == "\x01" || string[0, 4] =~ /[0-9a-fA-F]{4}/
|
105
|
+
end
|
106
|
+
|
107
|
+
def wkt_parser(factory, string)
|
108
|
+
if binary?(string)
|
109
|
+
RGeo::WKRep::WKBParser.new(factory, support_ewkb: true, default_srid: @srid)
|
110
|
+
else
|
111
|
+
RGeo::WKRep::WKTParser.new(factory, support_ewkt: true, default_srid: @srid)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|