proj4rb 2.0.0 → 3.0.0

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.
@@ -0,0 +1,7 @@
1
+ module Proj
2
+ module Api
3
+ attach_function :proj_as_projjson, [:PJ_CONTEXT, :PJ, :pointer], :string
4
+ attach_function :proj_create_crs_to_crs_from_pj, [:PJ_CONTEXT, :PJ, :PJ, :PJ_AREA, :string], :PJ
5
+ attach_function :proj_context_set_autoclose_database, [:PJ_CONTEXT, :int], :void
6
+ end
7
+ end
@@ -1,32 +1,32 @@
1
- module Proj
2
- class Area
3
- attr_reader :name, :west_lon_degree, :south_lat_degree, :east_lon_degree, :north_lat_degree
4
-
5
- def self.for_object(pj_object)
6
- p_name = FFI::MemoryPointer.new(:pointer)
7
- p_west_lon_degree = FFI::MemoryPointer.new(:double)
8
- p_south_lat_degree = FFI::MemoryPointer.new(:double)
9
- p_east_lon_degree = FFI::MemoryPointer.new(:double)
10
- p_north_lat_degree = FFI::MemoryPointer.new(:double)
11
-
12
- result = Api.proj_get_area_of_use(Context.current, pj_object,
13
- p_west_lon_degree, p_south_lat_degree, p_east_lon_degree, p_north_lat_degree,
14
- p_name)
15
- unless result
16
- Error.check
17
- end
18
-
19
- name = p_name.read_pointer.read_string_to_null.force_encoding('utf-8')
20
- self.new(name,
21
- p_west_lon_degree.read_double, p_south_lat_degree.read_double, p_east_lon_degree.read_double, p_north_lat_degree.read_double)
22
- end
23
-
24
- def initialize(name, west_lon_degree, south_lat_degree, east_lon_degree, north_lat_degree)
25
- @name = name
26
- @west_lon_degree = west_lon_degree
27
- @south_lat_degree = south_lat_degree
28
- @east_lon_degree = east_lon_degree
29
- @north_lat_degree = north_lat_degree
30
- end
31
- end
32
- end
1
+ module Proj
2
+ class Area
3
+ attr_reader :name, :west_lon_degree, :south_lat_degree, :east_lon_degree, :north_lat_degree
4
+
5
+ def self.for_object(pj_object)
6
+ p_name = FFI::MemoryPointer.new(:pointer)
7
+ p_west_lon_degree = FFI::MemoryPointer.new(:double)
8
+ p_south_lat_degree = FFI::MemoryPointer.new(:double)
9
+ p_east_lon_degree = FFI::MemoryPointer.new(:double)
10
+ p_north_lat_degree = FFI::MemoryPointer.new(:double)
11
+
12
+ result = Api.proj_get_area_of_use(Context.current, pj_object,
13
+ p_west_lon_degree, p_south_lat_degree, p_east_lon_degree, p_north_lat_degree,
14
+ p_name)
15
+ unless result
16
+ Error.check
17
+ end
18
+
19
+ name = p_name.read_pointer.read_string_to_null.force_encoding('utf-8')
20
+ self.new(name,
21
+ p_west_lon_degree.read_double, p_south_lat_degree.read_double, p_east_lon_degree.read_double, p_north_lat_degree.read_double)
22
+ end
23
+
24
+ def initialize(name, west_lon_degree, south_lat_degree, east_lon_degree, north_lat_degree)
25
+ @name = name
26
+ @west_lon_degree = west_lon_degree
27
+ @south_lat_degree = south_lat_degree
28
+ @east_lon_degree = east_lon_degree
29
+ @north_lat_degree = north_lat_degree
30
+ end
31
+ end
32
+ end
@@ -1,70 +1,70 @@
1
- require 'singleton'
2
-
3
- module Proj
4
- class Config
5
- include Singleton
6
-
7
- def set_search_paths
8
- p_paths = self.search_paths_pointer
9
- items = p_paths.type_size/p_paths.size
10
-
11
- # Set search paths on default context - any new contexts will inherit from this
12
- if Api.method_defined?(:proj_context_set_search_paths)
13
- Api.proj_context_set_search_paths(nil, items, p_paths)
14
- end
15
-
16
- if Api.method_defined?(:pj_set_searchpath)
17
- Api.pj_set_searchpath(items, p_paths)
18
- end
19
- end
20
-
21
- def search_paths
22
- ['/usr/share/proj',
23
- '/usr/local/share/proj',
24
- '/opt/share/proj',
25
- '/opt/local/share/proj',
26
- 'c:/msys64/mingw64/share/proj',
27
- 'c:/mingw64/share/proj',
28
- '/opt/local/lib/proj6/share/proj',
29
- '/opt/local/lib/proj5/share/proj',
30
- '/opt/local/lib/proj49/share/proj']
31
- end
32
-
33
- def data_path
34
- if ENV['PROJ_LIB'] && File.directory?(ENV['PROJ_LIB'])
35
- ENV['PROJ_LIB']
36
- else
37
- result = self.search_paths.detect do |path|
38
- File.directory?(path)
39
- end
40
-
41
- unless result
42
- raise(Error, "Could not find Proj data directory. Please set the PROJ_LIB environmental variable to correct directory")
43
- end
44
-
45
- result
46
- end
47
- end
48
-
49
- def search_paths_pointer
50
- p_path = FFI::MemoryPointer.from_string(self.data_path)
51
- p_paths = FFI::MemoryPointer.new(:pointer, 1)
52
- p_paths[0].write_pointer(p_path)
53
- p_paths
54
- end
55
-
56
- def db_path
57
- result = self.search_paths.map do |path|
58
- File.join(path, 'proj.db')
59
- end.detect do |path|
60
- File.exists?(path)
61
- end
62
-
63
- unless result
64
- raise(Error, "Could not find Proj database (proj.db). Please set the PROJ_LIB environmental variable to directory that contains it")
65
- end
66
-
67
- result
68
- end
69
- end
1
+ require 'singleton'
2
+
3
+ module Proj
4
+ class Config
5
+ include Singleton
6
+
7
+ def set_search_paths
8
+ p_paths = self.search_paths_pointer
9
+ items = p_paths.type_size/p_paths.size
10
+
11
+ # Set search paths on default context - any new contexts will inherit from this
12
+ if Api.method_defined?(:proj_context_set_search_paths)
13
+ Api.proj_context_set_search_paths(nil, items, p_paths)
14
+ end
15
+
16
+ if Api.method_defined?(:pj_set_searchpath)
17
+ Api.pj_set_searchpath(items, p_paths)
18
+ end
19
+ end
20
+
21
+ def search_paths
22
+ ['/usr/share/proj',
23
+ '/usr/local/share/proj',
24
+ '/opt/share/proj',
25
+ '/opt/local/share/proj',
26
+ 'c:/msys64/mingw64/share/proj',
27
+ 'c:/mingw64/share/proj',
28
+ '/opt/local/lib/proj6/share/proj',
29
+ '/opt/local/lib/proj5/share/proj',
30
+ '/opt/local/lib/proj49/share/proj']
31
+ end
32
+
33
+ def data_path
34
+ if ENV['PROJ_LIB'] && File.directory?(ENV['PROJ_LIB'])
35
+ ENV['PROJ_LIB']
36
+ else
37
+ result = self.search_paths.detect do |path|
38
+ File.directory?(path)
39
+ end
40
+
41
+ unless result
42
+ raise(Error, "Could not find Proj data directory. Please set the PROJ_LIB environmental variable to correct directory")
43
+ end
44
+
45
+ result
46
+ end
47
+ end
48
+
49
+ def search_paths_pointer
50
+ p_path = FFI::MemoryPointer.from_string(self.data_path)
51
+ p_paths = FFI::MemoryPointer.new(:pointer, 1)
52
+ p_paths[0].write_pointer(p_path)
53
+ p_paths
54
+ end
55
+
56
+ def db_path
57
+ result = self.search_paths.map do |path|
58
+ File.join(path, 'proj.db')
59
+ end.detect do |path|
60
+ File.exists?(path)
61
+ end
62
+
63
+ unless result
64
+ raise(Error, "Could not find Proj database (proj.db). Please set the PROJ_LIB environmental variable to directory that contains it")
65
+ end
66
+
67
+ result
68
+ end
69
+ end
70
70
  end
@@ -1,103 +1,103 @@
1
- module Proj
2
- # Proj 4.8 introduced the concept of a thread context object to support multi-threaded programs. The bindings
3
- # automatically create on context per thread (its stored in local thread storage).
4
- class Context
5
- # The context for the current thread
6
- #
7
- # @return [Context]
8
- def self.current
9
- Thread.current[:proj_context] ||= Context.new
10
- end
11
-
12
- def self.finalize(pointer)
13
- proc do
14
- Api.proj_context_destroy(pointer)
15
- end
16
- end
17
-
18
- def initialize
19
- @pointer = Api.proj_context_create
20
- ObjectSpace.define_finalizer(self, self.class.finalize(@pointer))
21
-
22
- set_database_path
23
- end
24
-
25
- # Helper method that tries to locate the Proj coordinate database (proj.db)
26
- def set_database_path
27
- return unless Api.method_defined?(:proj_context_get_database_path)
28
- return if database_path
29
-
30
- self.database_path = Config.instance.db_path
31
- end
32
-
33
- def to_ptr
34
- @pointer
35
- end
36
-
37
- # Get the last error number
38
- #
39
- # return [Integer]
40
- def errno
41
- Api.proj_context_errno(self)
42
- end
43
-
44
- # Gets the path the Proj database
45
- #
46
- # return [String]
47
- def database_path
48
- Api.proj_context_get_database_path(self)
49
- end
50
-
51
- # Sets the path to the Proj database
52
- def database_path=(value)
53
- result = Api.proj_context_set_database_path(self, value, nil, nil)
54
- unless result == 1
55
- Error.check(self.errno)
56
- end
57
- end
58
-
59
- # Sets a custom log function
60
- #
61
- # @example
62
- # context.set_log_function(data) do |pointer, int, message|
63
- # ... do stuff...
64
- # end
65
- #
66
- # @param pointer [FFI::MemoryPointer] Optional pointer to custom data
67
- # @param proc [Proc] Custom logging procedure
68
- # @return [nil]
69
- def set_log_function(pointer = nil, &proc)
70
- Api.proj_log_func(self, pointer, proc)
71
- end
72
-
73
- # Gets the current log level
74
- #
75
- # @return [:PJ_LOG_LEVEL]
76
- def log_level
77
- Api.proj_log_level(self, :PJ_LOG_TELL)
78
- end
79
-
80
- # Sets the current log level
81
- #
82
- # @param value [:PJ_LOG_LEVEL]
83
- # @return [nil]
84
- def log_level=(value)
85
- Api.proj_log_level(self, value)
86
- end
87
-
88
- # Gets if proj4 init rules are being used (i.e., support +init parameters)
89
- #
90
- # @return [Boolean]
91
- def use_proj4_init_rules
92
- Api.proj_context_get_use_proj4_init_rules(self, 0)
93
- end
94
-
95
- # Sets if proj4 init rules should be used
96
- #
97
- # @param value [Boolean]
98
- # @return [nil]
99
- def use_proj4_init_rules=(value)
100
- Api.proj_context_use_proj4_init_rules(self, value ? 1 : 0)
101
- end
102
- end
1
+ module Proj
2
+ # Proj 4.8 introduced the concept of a thread context object to support multi-threaded programs. The bindings
3
+ # automatically create on context per thread (its stored in local thread storage).
4
+ class Context
5
+ # The context for the current thread
6
+ #
7
+ # @return [Context]
8
+ def self.current
9
+ Thread.current[:proj_context] ||= Context.new
10
+ end
11
+
12
+ def self.finalize(pointer)
13
+ proc do
14
+ Api.proj_context_destroy(pointer)
15
+ end
16
+ end
17
+
18
+ def initialize
19
+ @pointer = Api.proj_context_create
20
+ ObjectSpace.define_finalizer(self, self.class.finalize(@pointer))
21
+
22
+ set_database_path
23
+ end
24
+
25
+ # Helper method that tries to locate the Proj coordinate database (proj.db)
26
+ def set_database_path
27
+ return unless Api.method_defined?(:proj_context_get_database_path)
28
+ return if database_path
29
+
30
+ self.database_path = Config.instance.db_path
31
+ end
32
+
33
+ def to_ptr
34
+ @pointer
35
+ end
36
+
37
+ # Get the last error number
38
+ #
39
+ # return [Integer]
40
+ def errno
41
+ Api.proj_context_errno(self)
42
+ end
43
+
44
+ # Gets the path the Proj database
45
+ #
46
+ # return [String]
47
+ def database_path
48
+ Api.proj_context_get_database_path(self)
49
+ end
50
+
51
+ # Sets the path to the Proj database
52
+ def database_path=(value)
53
+ result = Api.proj_context_set_database_path(self, value, nil, nil)
54
+ unless result == 1
55
+ Error.check(self.errno)
56
+ end
57
+ end
58
+
59
+ # Sets a custom log function
60
+ #
61
+ # @example
62
+ # context.set_log_function(data) do |pointer, int, message|
63
+ # ... do stuff...
64
+ # end
65
+ #
66
+ # @param pointer [FFI::MemoryPointer] Optional pointer to custom data
67
+ # @param proc [Proc] Custom logging procedure
68
+ # @return [nil]
69
+ def set_log_function(pointer = nil, &proc)
70
+ Api.proj_log_func(self, pointer, proc)
71
+ end
72
+
73
+ # Gets the current log level
74
+ #
75
+ # @return [:PJ_LOG_LEVEL]
76
+ def log_level
77
+ Api.proj_log_level(self, :PJ_LOG_TELL)
78
+ end
79
+
80
+ # Sets the current log level
81
+ #
82
+ # @param value [:PJ_LOG_LEVEL]
83
+ # @return [nil]
84
+ def log_level=(value)
85
+ Api.proj_log_level(self, value)
86
+ end
87
+
88
+ # Gets if proj4 init rules are being used (i.e., support +init parameters)
89
+ #
90
+ # @return [Boolean]
91
+ def use_proj4_init_rules
92
+ Api.proj_context_get_use_proj4_init_rules(self, 0)
93
+ end
94
+
95
+ # Sets if proj4 init rules should be used
96
+ #
97
+ # @param value [Boolean]
98
+ # @return [nil]
99
+ def use_proj4_init_rules=(value)
100
+ Api.proj_context_use_proj4_init_rules(self, value ? 1 : 0)
101
+ end
102
+ end
103
103
  end