Module: Proj::Api

Extended by:
FFI::Library
Defined in:
lib/api/api.rb,
lib/api/api_5_0.rb,
lib/api/api_5_1.rb,
lib/api/api_5_2.rb,
lib/api/api_6_0.rb,
lib/api/api_6_1.rb,
lib/api/api_6_2.rb,
lib/api/api_6_3.rb,
lib/api/api_7_0.rb,
lib/api/api_7_1.rb,
lib/api/api_7_2.rb,
lib/api/api_8_0.rb,
lib/api/api_8_1.rb,
lib/api/api_8_2.rb,
lib/api/api_9_1.rb,
lib/api/api_9_2.rb,
lib/api/api_9_4.rb,
lib/api/api_experimental.rb

Defined Under Namespace

Classes: PJ_AXIS_DESCRIPTION, PJ_COORD, PJ_ELLPS, PJ_ENU, PJ_FACTORS, PJ_GEOD, PJ_GRID_INFO, PJ_INFO, PJ_INIT_INFO, PJ_LIST, PJ_LP, PJ_LPZ, PJ_LPZT, PJ_OPK, PJ_PARAM_DESCRIPTION, PJ_PRIME_MERIDIANS, PJ_PROJ_INFO, PJ_UNITS, PJ_UV, PJ_UVW, PJ_UVWT, PJ_XY, PJ_XYZ, PJ_XYZT, PROJ_CRS_INFO, PROJ_CRS_LIST_PARAMETERS, PROJ_FILE_API, PROJ_UNIT_INFO, ProjCelestialBodyInfo

Constant Summary collapse

PJ_LOG_LEVEL =

Returns:

  • (Symbol)
enum(:PJ_LOG_NONE , 0,
:PJ_LOG_ERROR, 1,
:PJ_LOG_DEBUG, 2,
:PJ_LOG_TRACE, 3,
:PJ_LOG_TELL , 4,
:PJ_LOG_DEBUG_MAJOR, 2, # for proj_api.h compatibility
:PJ_LOG_DEBUG_MINOR, 3)
PJ_DIRECTION =

Apply transformation to observation - in forward or inverse direction

Returns:

  • (Symbol)
enum(:PJ_FWD, 1,   # Forward
:PJ_IDENT, 0, # Do nothing
:PJ_INV, -1)
PJ_CATEGORY =

Object category

Returns:

  • (Symbol)
enum(:PJ_CATEGORY_ELLIPSOID,
:PJ_CATEGORY_PRIME_MERIDIAN,
:PJ_CATEGORY_DATUM,
:PJ_CATEGORY_CRS,
:PJ_CATEGORY_COORDINATE_OPERATION,
:PJ_CATEGORY_DATUM_ENSEMBLE)
PJ_TYPE =

Returns:

  • (Symbol)
enum(:PJ_TYPE_UNKNOWN,
:PJ_TYPE_ELLIPSOID,
:PJ_TYPE_PRIME_MERIDIAN,
:PJ_TYPE_GEODETIC_REFERENCE_FRAME,
:PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME,
:PJ_TYPE_VERTICAL_REFERENCE_FRAME,
:PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME,
:PJ_TYPE_DATUM_ENSEMBLE,

# Abstract type, not returned by proj_get_type()
:PJ_TYPE_CRS,

:PJ_TYPE_GEODETIC_CRS,
:PJ_TYPE_GEOCENTRIC_CRS,
:PJ_TYPE_GEOGRAPHIC_CRS,
:PJ_TYPE_GEOGRAPHIC_2D_CRS,
:PJ_TYPE_GEOGRAPHIC_3D_CRS,
:PJ_TYPE_VERTICAL_CRS,
:PJ_TYPE_PROJECTED_CRS,
:PJ_TYPE_COMPOUND_CRS,
:PJ_TYPE_TEMPORAL_CRS,
:PJ_TYPE_ENGINEERING_CRS,
:PJ_TYPE_BOUND_CRS,
:PJ_TYPE_OTHER_CRS,

:PJ_TYPE_CONVERSION,
:PJ_TYPE_TRANSFORMATION,
:PJ_TYPE_CONCATENATED_OPERATION,
:PJ_TYPE_OTHER_COORDINATE_OPERATION,

:PJ_TYPE_TEMPORAL_DATUM,
:PJ_TYPE_ENGINEERING_DATUM,
:PJ_TYPE_PARAMETRIC_DATUM,

:PJ_TYPE_DERIVED_PROJECTED_CRS,

:PJ_TYPE_COORDINATE_METADATA)
PJ_PROJ_STRING_TYPE =

Returns:

  • (Symbol)
enum(:PJ_PROJ_5,
:PJ_PROJ_4)
PJ_COORDINATE_SYSTEM_TYPE =

Returns:

  • (Symbol)
enum(:PJ_CS_TYPE_UNKNOWN,
:PJ_CS_TYPE_CARTESIAN,
:PJ_CS_TYPE_ELLIPSOIDAL,
:PJ_CS_TYPE_VERTICAL,
:PJ_CS_TYPE_SPHERICAL,
:PJ_CS_TYPE_ORDINAL,
:PJ_CS_TYPE_PARAMETRIC,
:PJ_CS_TYPE_DATETIMETEMPORAL,
:PJ_CS_TYPE_TEMPORALCOUNT,
:PJ_CS_TYPE_TEMPORALMEASURE)
PJ_WKT_TYPE =

Returns:

  • (Symbol)
enum(:PJ_WKT2_2015,
:PJ_WKT2_2015_SIMPLIFIED,
:PJ_WKT2_2019,
:PJ_WKT2_2018, # Deprecated alias for PJ_WKT2_2019
:PJ_WKT2_2018_SIMPLIFIED, # Deprecated alias for PJ_WKT2_2019
:PJ_WKT1_GDAL,
:PJ_WKT1_ESRI)
PJ_COMPARISON_CRITERION =

Comparison criteria

Returns:

  • (Symbol)
enum(:PJ_COMP_STRICT, # All properties are identical
:PJ_COMP_EQUIVALENT, # The objects are equivalent for the purpose of coordinate operations. They can differ by the name of their objects, identifiers, other metadata. Parameters may be expressed in different units, provided that the value is (with some tolerance) the same once expressed in a common unit.
:PJ_COMP_EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS)
PJ_GUESSED_WKT_DIALECT =

Guessed WKT “dialect”

Returns:

  • (Symbol)
enum(:PJ_GUESSED_WKT2_2019,
:PJ_GUESSED_WKT2_2018,
:PJ_GUESSED_WKT2_2015,
:PJ_GUESSED_WKT1_GDAL,
:PJ_GUESSED_WKT1_ESRI,
:PJ_GUESSED_NOT_WKT)
PROJ_OPEN_ACCESS =

Returns:

  • (Symbol)
enum(:PROJ_OPEN_ACCESS_READ_ONLY, # Read-only access. Equivalent to "rb"
:PROJ_OPEN_ACCESS_READ_UPDATE, # Read-update access. File should be created if not existing. Equivalent to "r+b
:PROJ_OPEN_ACCESS_CREATE)
PJ_UNIT_TYPE =

Returns:

  • (Symbol)
enum(:PJ_UT_ANGULAR,
:PJ_UT_LINEAR,
:PJ_UT_SCALE,
:PJ_UT_TIME)
PJ_CARTESIAN_CS_2D_TYPE =

Returns:

  • (Symbol)
enum(:PJ_CART2D_EASTING_NORTHING,
:PJ_CART2D_NORTHING_EASTING,
:PJ_CART2D_NORTH_POLE_EASTING_SOUTH_NORTHING_SOUTH,
:PJ_CART2D_SOUTH_POLE_EASTING_NORTH_NORTHING_NORTH,
:PJ_CART2D_WESTING_SOUTHING)
PJ_ELLIPSOIDAL_CS_2D_TYPE =

Returns:

  • (Symbol)
enum(:PJ_ELLPS2D_LONGITUDE_LATITUDE,
:PJ_ELLPS2D_LATITUDE_LONGITUDE)
PJ_ELLIPSOIDAL_CS_3D_TYPE =

Returns:

  • (Symbol)
enum(:PJ_ELLPS3D_LONGITUDE_LATITUDE_HEIGHT,
:PJ_ELLPS3D_LATITUDE_LONGITUDE_HEIGHT)

Class Method Summary collapse

Class Method Details

.library_versionsArray<String>

List of knows PROJ library versions

Returns:

  • (Array<String>)


11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/api/api.rb', line 11

def self.library_versions
  ["25", # 9.2
   "9_1", # 9.1
   "22", # 8.0 and 8.1
   "19", # 7.x
   "17", # 6.1 *and* 6.2
   "15", # 6.0
   "14", # 5.2
   "13", # 5.0
   "12", # 4.9
   "11"] # 4.9
end

.linux_search_pathsArray<String>

Linux search paths for PROJ library

Returns:

  • (Array<String>)


54
55
56
57
58
# File 'lib/api/api.rb', line 54

def self.linux_search_paths
  self.library_versions.map do |version|
    "libproj.so.#{version}"
  end
end

.load_apinil

Load API files based on PROJ version

Returns:

  • (nil)


86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/api/api.rb', line 86

def self.load_api
  # First load the base 5.0 api so we can determine the Proj Version
  require_relative './api_5_0'
  Api.const_set('PROJ_VERSION', Gem::Version.new(self.proj_info[:version]))

  # Now load the rest of the apis based on the proj version
  versions = ['5.1.0', '5.2.0',
              '6.0.0', '6.1.0', '6.2.0', '6.3.0',
              '7.0.0', '7.1.0', '7.2.0',
              '8.0.0', '8.1.0', '8.2.0',
              '9.1.0', '9.2.0', '9.4.0']

  versions.each do |version|
    api_version = Gem::Version.new(version)

    if PROJ_VERSION >= api_version
      require_relative "./api_#{api_version.segments[0]}_#{api_version.segments[1]}"
    end
  end

  # Add in the experimental api
  require_relative "./api_experimental"
end

.load_libraryFFI::DynamicLibrary

Load PROJ library

Returns:

  • (FFI::DynamicLibrary)


73
74
75
76
77
78
79
80
81
# File 'lib/api/api.rb', line 73

def self.load_library
  if ENV["PROJ_LIB_PATH"]
    ffi_lib ENV["PROJ_LIB_PATH"]
  else
    ffi_lib self.search_paths
  end

  ffi_libraries.first
end

.macos_search_pathsArray<String>

MacOS search paths for PROJ library

Returns:

  • (Array<String>)


63
64
65
66
67
68
# File 'lib/api/api.rb', line 63

def self.macos_search_paths
  # On MacOS only support HomeBrew since the MacPort is unsupported and ancient (5.2).
  self.library_versions.map do |version|
    "libproj.#{version}.dylib"
  end
end

.search_pathsArray<String>

Search paths to use when looking for PROJ library

Returns:

  • (Array<String>)


27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/api/api.rb', line 27

def self.search_paths
  result = case RbConfig::CONFIG['host_os']
             when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
               self.windows_search_paths
             when /darwin|mac os/
               self.macos_search_paths
             else
               self.linux_search_paths
           end

   # Try libproj as catch all
  result << 'libproj'
  result
end

.windows_search_pathsArray<String>

Windows search paths for PROJ library

Returns:

  • (Array<String>)


45
46
47
48
49
# File 'lib/api/api.rb', line 45

def self.windows_search_paths
  self.library_versions.map do |version|
    ["libproj-#{version}", "libproj_#{version}"]
  end.flatten
end