rozi 0.0.7 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +255 -0
- data/lib/rozi.rb +6 -3
- data/lib/rozi/file_wrapper_base.rb +52 -0
- data/lib/rozi/module_functions.rb +19 -69
- data/lib/rozi/name_search.rb +176 -0
- data/lib/rozi/{ozi_functions.rb → shared.rb} +36 -9
- data/lib/rozi/tracks.rb +170 -0
- data/lib/rozi/version.rb +1 -1
- data/lib/rozi/waypoints.rb +315 -0
- data/test/rozi/file_wrapper_base_test.rb +29 -0
- data/test/rozi/module_functions_test.rb +11 -72
- data/test/rozi/name_search_test.rb +248 -0
- data/test/rozi/{ozi_functions_test.rb → shared_test.rb} +25 -5
- data/test/rozi/tracks_test.rb +105 -0
- data/test/rozi/waypoints_test.rb +268 -0
- data/test/test_data/expected_output_1.nst +6 -0
- data/{test_data → test/test_data}/expected_output_1.plt +9 -9
- data/{test_data → test/test_data}/expected_output_1.wpt +7 -7
- data/test/test_data/input_1.wpt +6 -0
- metadata +128 -34
- data/README.rdoc +0 -127
- data/lib/rozi/name.rb +0 -23
- data/lib/rozi/name_search_text.rb +0 -43
- data/lib/rozi/name_search_text_writer.rb +0 -71
- data/lib/rozi/track.rb +0 -67
- data/lib/rozi/track_point.rb +0 -39
- data/lib/rozi/track_writer.rb +0 -50
- data/lib/rozi/waypoint.rb +0 -90
- data/lib/rozi/waypoint_writer.rb +0 -38
- data/test/rozi/name_search_text_test.rb +0 -28
- data/test/rozi/name_search_text_writer_test.rb +0 -114
- data/test/rozi/track_point_test.rb +0 -32
- data/test/rozi/track_test.rb +0 -25
- data/test/rozi/track_writer_test.rb +0 -62
- data/test/rozi/waypoint_test.rb +0 -31
- data/test/rozi/waypoint_writer_test.rb +0 -60
data/README.rdoc
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
{<img src="https://badge.fury.io/rb/rozi.svg" alt="Gem Version" />}[http://badge.fury.io/rb/rozi]
|
2
|
-
|
3
|
-
= Rozi
|
4
|
-
|
5
|
-
Rozi is a Ruby gem for working with all Ozi Explorer file formats. Currently
|
6
|
-
the implemented functionality is:
|
7
|
-
|
8
|
-
- Creating Waypoint files.
|
9
|
-
- Creating Track files.
|
10
|
-
- Creating Name Search Text (.nst) files.
|
11
|
-
|
12
|
-
== Files.
|
13
|
-
|
14
|
-
Text based file formats read by Ozi Explorer should be encoded as ISO-8859-1
|
15
|
-
and use CR LF line endings (\\r\\n). If you pass file paths to Rozi's write
|
16
|
-
functions (rather than file objects) Rozi will handle this for you. If that
|
17
|
-
isn't an alternative you either have to handle this yourself, or you can use
|
18
|
-
{Rozi.open_file_for_writing}.
|
19
|
-
|
20
|
-
file = Rozi.open_file_for_writing("file_path.wpt")
|
21
|
-
file.write("Østre aker\n") # Writes "Østre aker\r\n" in ISO-8859-1.
|
22
|
-
|
23
|
-
# Does the same thing, but closes the file for you when you're done.
|
24
|
-
Rozi.open_file_for_writing("file_path.wpt") { |file|
|
25
|
-
file.write("Østre aker\n")
|
26
|
-
}
|
27
|
-
|
28
|
-
== Colors.
|
29
|
-
|
30
|
-
Any time you set colors in Rozi, you can either use the three-byte integer
|
31
|
-
representation that Ozi Explorer expects, or you can use a hex string like
|
32
|
-
"RRGGBB" and Rozi will convert it for you. Example:
|
33
|
-
|
34
|
-
# Identical.
|
35
|
-
Rozi::Waypoint.new(bg_color: "ABCDEF")
|
36
|
-
Rozi::Waypoint.new(bg_color: 15715755)
|
37
|
-
|
38
|
-
# Identical.
|
39
|
-
Rozi::Waypoint.new(bg_color: "FF0000")
|
40
|
-
Rozi::Waypoint.new(bg_color: 255)
|
41
|
-
|
42
|
-
== Creating Waypoint files.
|
43
|
-
|
44
|
-
Waypoint files are created in Rozi by creating an array of {Rozi::Waypoint}
|
45
|
-
instances and writing them to a file using {Rozi.write_waypoints}:
|
46
|
-
|
47
|
-
Example:
|
48
|
-
|
49
|
-
waypoints = [
|
50
|
-
Rozi::Waypoint.new(latitude: -12.7, longitude: -58.0, name: "South America"),
|
51
|
-
Rozi::Waypoint.new(latitude: 43.7, longitude: -103.7, name: "North America"),
|
52
|
-
Rozi::Waypoint.new(latitude: 49.6, longitude: 20.9, name: "Europe")
|
53
|
-
]
|
54
|
-
|
55
|
-
Rozi.write_waypoints(waypoints, "file_path.wpt")
|
56
|
-
|
57
|
-
Every aspect of the waypoint can be customized on the {Rozi::Waypoint} instance
|
58
|
-
(display format, symbol, background- and foreground colors, description, font
|
59
|
-
size etc.)
|
60
|
-
|
61
|
-
== Creating Track files.
|
62
|
-
|
63
|
-
Track files are created in Rozi by creating a {Rozi::Track} instance with two or
|
64
|
-
more {Rozi::TrackPoint} instances, then writing them to a file using
|
65
|
-
{Rozi.write_track}.
|
66
|
-
|
67
|
-
Example:
|
68
|
-
|
69
|
-
track = Rozi::Track.new()
|
70
|
-
|
71
|
-
track << Rozi::TrackPoint.new(latitude: 39.8, longitude: -3.4)
|
72
|
-
track << Rozi::TrackPoint.new(latitude: 46.6, longitude: 3.1)
|
73
|
-
track << Rozi::TrackPoint.new(latitude: 50.79, longitude: 10.3)
|
74
|
-
track << Rozi::TrackPoint.new(latitude: 49.04, longitude: 31.5)
|
75
|
-
|
76
|
-
Rozi.write_track(track, "file_path.plt")
|
77
|
-
|
78
|
-
Both {Rozi::Track} and {Rozi::TrackPoint} has lots of customizable attributes to
|
79
|
-
change the appearance of the track.
|
80
|
-
|
81
|
-
== Creating NST files.
|
82
|
-
|
83
|
-
See {Ozi Explorer: Name
|
84
|
-
Search}[http://www.oziexplorer3.com/namesearch/wnamesrch.html] for information
|
85
|
-
about Name Search. An NST file has to be converted into a Name Database using
|
86
|
-
the {"Name Search
|
87
|
-
Creator"}[http://www.oziexplorer3.com/namesearch/namesearch_setup.exe] tool
|
88
|
-
before they can be used by Ozi Explorer.
|
89
|
-
|
90
|
-
In Rozi, an NST file is represented by a {Rozi::NameSearchText} object. This
|
91
|
-
object lets you control the coordinate system (lat/lng or UTM) of the name
|
92
|
-
database, as well as the datum, UTM Zone and Hemisphere (if applicable). You can
|
93
|
-
also add a comment to the top of the exported file using
|
94
|
-
{Rozi::NameSearchText#comment}. By default, decimal lat/lng coordinates are used
|
95
|
-
with the WGS 84 datum.
|
96
|
-
|
97
|
-
{Rozi::Name} objects are added to the {Rozi::NameSearchText} instance, which is
|
98
|
-
then written to a file using {Rozi.write_nst}.
|
99
|
-
|
100
|
-
Example:
|
101
|
-
|
102
|
-
nst = Rozi::NameSearchText.new
|
103
|
-
nst.comment = "Generated #{Time.now}"
|
104
|
-
|
105
|
-
nst << Rozi::Name.new("Place name", "Feature code", nil, 12.3456, 23.4567)
|
106
|
-
|
107
|
-
Rozi.write_nst(nst, "file_path.nst")
|
108
|
-
|
109
|
-
Example using UTM with the "Norsk" datum:
|
110
|
-
|
111
|
-
nst = Rozi::NameSearchText.new
|
112
|
-
nst.comment = "Generated #{Time.now}"
|
113
|
-
nst.utm = true
|
114
|
-
nst.utm_zone = "33"
|
115
|
-
nst.datum = "Norsk"
|
116
|
-
nst.hemisphere = "N"
|
117
|
-
|
118
|
-
nst << Rozi::Name.new("Place name", "Feature code", nil, 67890.12, 56789.01)
|
119
|
-
|
120
|
-
# UTM Zone overridden.
|
121
|
-
nst << Rozi::Name.new("Place name", "Feature code", "32", 67890.12, 56789.01)
|
122
|
-
|
123
|
-
Rozi.write_nst(nst, "file_path.nst")
|
124
|
-
|
125
|
-
Note, text in name search files (names and feature codes) cannot contain
|
126
|
-
commas. There is no mechanism for escaping commas or substituting them with
|
127
|
-
different symbols like in waypoint files.
|
data/lib/rozi/name.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
|
2
|
-
module Rozi
|
3
|
-
|
4
|
-
##
|
5
|
-
# This class represents a name in an Ozi Explorer name database.
|
6
|
-
#
|
7
|
-
# @note The +name+, +lat+ and +lng+ fields must be set, or runtime errors will
|
8
|
-
# be raised when attempting to write to file.
|
9
|
-
#
|
10
|
-
class Name
|
11
|
-
|
12
|
-
attr_accessor :name, :feature_code, :zone, :lat, :lng
|
13
|
-
|
14
|
-
def initialize(name=nil, feature_code=nil, zone=nil, lat=nil, lng=nil)
|
15
|
-
@name = name
|
16
|
-
@feature_code = feature_code
|
17
|
-
@zone = zone
|
18
|
-
@lat = lat
|
19
|
-
@lng = lng
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
|
2
|
-
require "rozi/ozi_functions"
|
3
|
-
|
4
|
-
module Rozi
|
5
|
-
|
6
|
-
##
|
7
|
-
# A name search text (.nst) file is a text file that can be converted into a
|
8
|
-
# name database used by Ozi Explorer's "name search" functionality. This class
|
9
|
-
# represents such a file and can be written to disk using
|
10
|
-
# {Rozi::NameSearchTextWriter}.
|
11
|
-
#
|
12
|
-
class NameSearchText
|
13
|
-
|
14
|
-
attr_accessor :comment, :datum, :names, :latlng,
|
15
|
-
:utm, :utm_zone, :hemisphere
|
16
|
-
|
17
|
-
include OziFunctions
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@comment = ""
|
21
|
-
@datum = "WGS 84"
|
22
|
-
@names = []
|
23
|
-
|
24
|
-
@latlng = true
|
25
|
-
@utm = false
|
26
|
-
@utm_zone = nil
|
27
|
-
@hemisphere = nil
|
28
|
-
end
|
29
|
-
|
30
|
-
def <<(name)
|
31
|
-
@names << name
|
32
|
-
end
|
33
|
-
|
34
|
-
def datum=(datum)
|
35
|
-
if not datum_valid?(datum)
|
36
|
-
fail ArgumentError, %(Invalid datum: "#{datum}")
|
37
|
-
end
|
38
|
-
|
39
|
-
@datum = datum
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
|
2
|
-
module Rozi
|
3
|
-
|
4
|
-
##
|
5
|
-
# A class for writing {Rozi::NameSearchText} objects to files.
|
6
|
-
#
|
7
|
-
# @note Text in name search files (names and feature codes) cannot contain
|
8
|
-
# commas. There is no mechanism for escaping commas or substituting them
|
9
|
-
# with different symbols like in waypoint files.
|
10
|
-
#
|
11
|
-
class NameSearchTextWriter
|
12
|
-
|
13
|
-
##
|
14
|
-
# Writes +nst+ to +file+.
|
15
|
-
#
|
16
|
-
# @param [Rozi::NameSearchText] nst
|
17
|
-
# @param [File, StringIO] file an open file object
|
18
|
-
#
|
19
|
-
def write(nst, file)
|
20
|
-
if nst.comment
|
21
|
-
nst.comment.each_line { |line|
|
22
|
-
file.write ";#{line.chomp}\n"
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
file.write construct_first_line(nst) << "\n"
|
27
|
-
file.write construct_second_line(nst) << "\n"
|
28
|
-
|
29
|
-
nst.names.each { |name|
|
30
|
-
file.write name_to_line(name) << "\n"
|
31
|
-
}
|
32
|
-
|
33
|
-
return nil
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def construct_first_line(nst)
|
39
|
-
first_line = "#1,"
|
40
|
-
|
41
|
-
if nst.utm
|
42
|
-
first_line << "UTM,#{nst.utm_zone}"
|
43
|
-
|
44
|
-
if nst.hemisphere
|
45
|
-
first_line << ",#{nst.hemisphere}"
|
46
|
-
end
|
47
|
-
else
|
48
|
-
first_line << ","
|
49
|
-
end
|
50
|
-
|
51
|
-
return first_line
|
52
|
-
end
|
53
|
-
|
54
|
-
def construct_second_line(nst)
|
55
|
-
"#2,#{nst.datum}"
|
56
|
-
end
|
57
|
-
|
58
|
-
def name_to_line(name)
|
59
|
-
if not name.name or not name.lat or not name.lng
|
60
|
-
fail "name, lat and lng must be set!"
|
61
|
-
end
|
62
|
-
|
63
|
-
if name.name.include?(",") or name.feature_code.include?(",")
|
64
|
-
fail ArgumentError, "Text cannot contain commas"
|
65
|
-
end
|
66
|
-
|
67
|
-
"#{name.name},#{name.feature_code},#{name.zone},#{name.lat},#{name.lng}"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
data/lib/rozi/track.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
|
2
|
-
require "rozi/ozi_functions"
|
3
|
-
|
4
|
-
module Rozi
|
5
|
-
|
6
|
-
##
|
7
|
-
# This class represents a Track in Ozi Explorer. It contains attributes
|
8
|
-
# about the track's appearance as well as a list of track points.
|
9
|
-
#
|
10
|
-
class Track
|
11
|
-
attr_accessor :points
|
12
|
-
|
13
|
-
attr_reader :color
|
14
|
-
attr_accessor :line_width, :description, :skip_value, :type,
|
15
|
-
:fill_type, :fill_color
|
16
|
-
|
17
|
-
DEFAULTS = {
|
18
|
-
line_width: 2,
|
19
|
-
color: 255,
|
20
|
-
description: "",
|
21
|
-
skip_value: 1,
|
22
|
-
type: 0,
|
23
|
-
fill_type: 0,
|
24
|
-
fill_color: 0
|
25
|
-
}
|
26
|
-
|
27
|
-
include OziFunctions
|
28
|
-
|
29
|
-
def initialize(args={})
|
30
|
-
@points = args[:points] || []
|
31
|
-
|
32
|
-
DEFAULTS.each_pair { |key, value| set(key, value) }
|
33
|
-
|
34
|
-
args.each_pair { |key, value| set(key, value) }
|
35
|
-
end
|
36
|
-
|
37
|
-
def color=(color)
|
38
|
-
@color = interpret_color(color)
|
39
|
-
end
|
40
|
-
|
41
|
-
##
|
42
|
-
# @return [Array] the attributes of the track as an Array
|
43
|
-
#
|
44
|
-
def attributes
|
45
|
-
[@line_width, @color, @description, @skip_value,
|
46
|
-
@type, @fill_type, @fill_color]
|
47
|
-
end
|
48
|
-
|
49
|
-
##
|
50
|
-
# Allows adding points to the track using the `<<` syntax.
|
51
|
-
#
|
52
|
-
def <<(point)
|
53
|
-
@points << point
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def set(key, value)
|
59
|
-
begin
|
60
|
-
self.send(key.to_s() + "=", value)
|
61
|
-
rescue NoMethodError
|
62
|
-
fail ArgumentError, "Not a valid attribute: #{key}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
data/lib/rozi/track_point.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
|
2
|
-
module Rozi
|
3
|
-
|
4
|
-
class TrackPoint
|
5
|
-
attr_accessor :latitude, :longitude, :break, :altitude, :date,
|
6
|
-
:date_string, :time_string
|
7
|
-
|
8
|
-
DEFAULTS = {
|
9
|
-
break: 0,
|
10
|
-
altitude: -777,
|
11
|
-
date: 0,
|
12
|
-
date_string: "",
|
13
|
-
time_string: ""
|
14
|
-
}
|
15
|
-
|
16
|
-
def initialize(args={})
|
17
|
-
DEFAULTS.each_pair { |key, value| set(key, value) }
|
18
|
-
|
19
|
-
args.each_pair { |key, value| set(key, value) }
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_a
|
23
|
-
[@latitude, @longitude, @break, @altitude,
|
24
|
-
@date, @date_string, @time_string]
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def set(key, value)
|
30
|
-
begin
|
31
|
-
self.send(key.to_s() + "=", value)
|
32
|
-
rescue NoMethodError
|
33
|
-
fail ArgumentError, "Not a valid attribute: #{key}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
data/lib/rozi/track_writer.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
|
2
|
-
require "rozi/ozi_functions"
|
3
|
-
|
4
|
-
module Rozi
|
5
|
-
|
6
|
-
class TrackWriter
|
7
|
-
|
8
|
-
include OziFunctions
|
9
|
-
|
10
|
-
##
|
11
|
-
# Writes the track to +file+ as an Ozi Explorer track file. The file
|
12
|
-
# extension should be ".plt".
|
13
|
-
#
|
14
|
-
# @param [AddressKit::Ozi::Track] track
|
15
|
-
# @param [File, String, #write] file
|
16
|
-
#
|
17
|
-
def write(track, file)
|
18
|
-
file.write <<-TEXT.gsub(/^[ ]{8}/, "")
|
19
|
-
OziExplorer Track Point File Version 2.1
|
20
|
-
WGS 84
|
21
|
-
Altitude is in Feet
|
22
|
-
Reserved 3
|
23
|
-
TEXT
|
24
|
-
|
25
|
-
file.write(track_attributes_to_text(track))
|
26
|
-
file.write("\n")
|
27
|
-
|
28
|
-
file.write(track.points.count.to_s() + "\n")
|
29
|
-
|
30
|
-
track.points.each { |point|
|
31
|
-
file.write(track_point_to_text(point))
|
32
|
-
file.write("\n")
|
33
|
-
}
|
34
|
-
end
|
35
|
-
|
36
|
-
def track_attributes_to_text(track)
|
37
|
-
attrs = track.attributes
|
38
|
-
attrs.map! { |item| item.is_a?(String) ? escape_text(item) : item }
|
39
|
-
|
40
|
-
"0,%d,%d,%s,%d,%d,%d,%d" % attrs
|
41
|
-
end
|
42
|
-
|
43
|
-
def track_point_to_text(point)
|
44
|
-
p = point.to_a()
|
45
|
-
|
46
|
-
" %.6f,%.6f,%d,%.1f,%.7f,%s,%s" % p
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
data/lib/rozi/waypoint.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
|
2
|
-
require "rozi/ozi_functions"
|
3
|
-
|
4
|
-
module Rozi
|
5
|
-
|
6
|
-
##
|
7
|
-
# Represents a waypoint in Ozi Explorer.
|
8
|
-
#
|
9
|
-
class Waypoint
|
10
|
-
|
11
|
-
include OziFunctions
|
12
|
-
|
13
|
-
DISPLAY_FORMATS = {
|
14
|
-
:number_only => 0,
|
15
|
-
:name_only => 1,
|
16
|
-
:number_and_name => 2,
|
17
|
-
:name_with_dot => 3,
|
18
|
-
:name_with_symbol => 4,
|
19
|
-
:symbol_only => 5,
|
20
|
-
:comment_with_symbol => 6,
|
21
|
-
:man_overboard => 7,
|
22
|
-
:marker => 8
|
23
|
-
}
|
24
|
-
|
25
|
-
attr_accessor :number, :name, :latitude, :longitude, :date, :symbol,
|
26
|
-
:display_format, :description, :pointer_direction, :altitude,
|
27
|
-
:font_size, :font_style, :symbol_size
|
28
|
-
|
29
|
-
attr_reader :fg_color, :bg_color
|
30
|
-
|
31
|
-
def initialize(args={})
|
32
|
-
@number = -1
|
33
|
-
@name = ""
|
34
|
-
@latitude = 0.0
|
35
|
-
@longitude = 0.0
|
36
|
-
@date = nil
|
37
|
-
@symbol = 0
|
38
|
-
@display_format = :name_with_dot
|
39
|
-
@fg_color = 0
|
40
|
-
@bg_color = 65535
|
41
|
-
@description = ""
|
42
|
-
@pointer_direction = 0
|
43
|
-
@altitude = -777
|
44
|
-
@font_size = 6
|
45
|
-
@font_style = 0
|
46
|
-
@symbol_size = 17
|
47
|
-
|
48
|
-
args.each_pair { |key, value|
|
49
|
-
begin
|
50
|
-
self.send(key.to_s() + "=", value)
|
51
|
-
rescue NoMethodError
|
52
|
-
fail ArgumentError, "Not a valid attribute: #{key}"
|
53
|
-
end
|
54
|
-
}
|
55
|
-
end
|
56
|
-
|
57
|
-
def to_a
|
58
|
-
[@number,
|
59
|
-
@name,
|
60
|
-
@latitude,
|
61
|
-
@longitude,
|
62
|
-
@date,
|
63
|
-
@symbol,
|
64
|
-
DISPLAY_FORMATS[@display_format],
|
65
|
-
@fg_color,
|
66
|
-
@bg_color,
|
67
|
-
@description,
|
68
|
-
@pointer_direction,
|
69
|
-
@altitude,
|
70
|
-
@font_size,
|
71
|
-
@font_style,
|
72
|
-
@symbol_size]
|
73
|
-
end
|
74
|
-
|
75
|
-
##
|
76
|
-
# Sets the foreground color. Accepts a hex string or a decimal value.
|
77
|
-
#
|
78
|
-
def fg_color=(color)
|
79
|
-
@fg_color = interpret_color(color)
|
80
|
-
end
|
81
|
-
|
82
|
-
##
|
83
|
-
# Sets the background color. Accepts a hex string or a decimal value.
|
84
|
-
#
|
85
|
-
def bg_color=(color)
|
86
|
-
@bg_color = interpret_color(color)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|