kml_polygon 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OWQ1ZTIzMTI4MzNiNTE3OTI3NWMzOThlNDRiN2RlMTk2MmY3Y2JjMQ==
5
+ data.tar.gz: !binary |-
6
+ OTc4NWRkN2JjZGZkNmViMzk5NDMxMDZiODM2MTkzNzViMjQ5YzRjYg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YTJlMjBmNGRjYjdkMTM2NjBmMjc3YzMzNmQ5NDlhYzkyYjg3MmIxZTEyMGUx
10
+ OWJiNGJjOTNiZjcwNzZmZmNiZDBmZjQ1M2ZhMDRmOGY3NTAwZGIzMzlmOTk1
11
+ NmYzNDFkZGU5NGI5MjZmZTM5NGM3YTdkOGQ5NzEwNWRhN2MyMzE=
12
+ data.tar.gz: !binary |-
13
+ ODkxZTM0YjI1MzAyZWFiMjM1ZTE3NThhOTVhMDRhZDVkYmViNDE2NmE3YzEz
14
+ YmJjY2Y2ZTk4NjBkZjU3MWUyZGI4YTM2MjFkYWQxZWZhZDA5YmNlOGUzYzk0
15
+ MjAxM2VhMTY5ODYzN2Q2YjJiNmMzNDgzMTFjMjdmMTY4NDIwYTI=
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .idea
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ coverage
13
+ InstalledFiles
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in kml_polygon.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (c) 2007 Nick Galbreath, (c) 2013 Matthew Brookes
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+
2
+ =======
3
+ kml_polygon
4
+ ===========
5
+
6
+ Google earth doesn't provide polygon primitives, leaving you to generate them as a series of points.
7
+
8
+ Given only a center-point (longitude/latitude) and radius, this Gem makes it easy to create
9
+ (n) sided polygons (sufficient sides giving a circle) or stars, for inclusion in a KML file.
10
+
11
+ All credit to Nick Galbreath for the original code, and for providing it an a portable format. Thanks!
12
+ (http://blog.client9.com/2007/09/drawing-circles-and-stars-on-google.html)
13
+
14
+
15
+ ## Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ gem 'kml_polygon', :git => 'git://github.com/mbrookes/kml_polygon.git'
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install kml_polygon
28
+
29
+ ## Usage
30
+
31
+ kml_regular_polygon(longitude, latitude, radius, [sides=20, rotate=0])
32
+ kml_star(longitude, latitude, radius, inner_radius, [sides=10, rotate=0])
33
+
34
+ Returns a string suitable for adding into a KML file.
35
+
36
+ ### kml_regular_polygon
37
+
38
+ kml_regular_polygon(longitude, latitude, radius, [sides=0, rotate=0])
39
+
40
+ Regular polygon
41
+
42
+ longitude, latitude - center point in decimal degrees
43
+ radius - radius in meters
44
+ segments - number of sides, > 20 looks like a circle (optional, default: 20)
45
+ rotate - rotate polygon <rotate> degrees (optional, default: 0)
46
+
47
+ ### kml_star
48
+
49
+ kml_star(longitude, latitude, radius, inner_radius, [sides=10, rotate=0])
50
+
51
+ Make a "star" or "burst" pattern
52
+
53
+ longitude, latitude - center point in decimal degrees
54
+ radius - radius in meters
55
+ inner_radius - radius in meters, typically < outer_radius
56
+ segments - number of "points" on the star (optional, default: 10)
57
+ rotate - rotate polygon by <rotate> degrees (optional, default: 0)
58
+
59
+ ### For Example:
60
+ # kml_polygon_example.rb
61
+ include kml_polygon
62
+ circle = kml_regular_polygon(-95, 50, 70000)
63
+ star = kml_star(-95,45, 70000, 50000)
64
+ puts "<kml><Document>
65
+ <Style id='polygon1'><PolyStyle><color>7fff0000</color></PolyStyle></Style>
66
+ <Style id='polygon2'><PolyStyle><color>7f0000ff</color></PolyStyle></Style>
67
+ <Placemark><styleUrl>polygon1</styleUrl><Polygon>" << circle << "</Polygon></Placemark>
68
+ <Placemark><styleUrl>polygon2</styleUrl><Polygon>" << star << "</Polygon></Placemark>
69
+ </Document></kml>"
70
+
71
+ Outputs a minimal but funtional KML file with one circle and one star in semi-transparent colors.
72
+
73
+ ## Contributing
74
+
75
+ 1. Fork it (`git clone git://github.com/mbrookes/kml_polygon.git`)
76
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
77
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
78
+ 4. Push to the branch (`git push origin my-new-feature`)
79
+ 5. Create new Pull Request
80
+
81
+
82
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require './lib/kml_polygon/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "kml_polygon"
8
+ gem.version = KmlPolygon::VERSION
9
+ gem.authors = ["Nick Galbreath", "Matthew Brookes"]
10
+ gem.email = ["kml_polygon@nospam.33m.co"]
11
+ gem.description = %q{Generate KML polygons (circle, star etc.) from lat/long and radius
12
+ A port of http://blog.client9.com/2007/09/drawing-circles-and-stars-on-google.html}
13
+ gem.summary = %q{Output a KML fragment defining a polygon (eg. a circle or star) about a point}
14
+ gem.homepage = "https://github.com/mbrookes/kml_polygon"
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+ gem.license = "MIT"
21
+ end
@@ -0,0 +1,193 @@
1
+ #
2
+ #The MIT License
3
+ #
4
+ # Copyright (c) 2007 Nick Galbreath, (c) 2013 Matthew Brookes
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+ #
24
+
25
+ #
26
+ # Version 2.0.2 - 29-Mar-2013 More idomatic Ruby,
27
+ # Renamed to kml_polygon to better reflection function
28
+ # Version 2.0.1 - 29-Mar-2013 Translation to Ruby Gem
29
+ # No CLI
30
+ # Version 2 - 12-Sept-2007 Simplified XML output
31
+ # Added commandline interface
32
+ #
33
+ # Version 1 - 10-Sept-2007 Initial release
34
+ #
35
+
36
+ #require 'kml_polygon/version'
37
+
38
+ module KmlPolygon
39
+ extend self
40
+
41
+ include Math
42
+
43
+ # constant to convert to degrees
44
+ DEGREES = 180.0 / PI
45
+ # constant to convert to radians
46
+ RADIANS = PI / 180.0
47
+ # Mean Radius of Earth, radius
48
+ EARTH_MEAN_RADIUS = 6378.1 * 1000.0
49
+
50
+ #
51
+ # Convert (x,y,z) on unit sphere
52
+ # back to (longitude, latitude)
53
+ #
54
+ # p is vector of three elements
55
+ #
56
+ def to_earth(p)
57
+ p[0] == 0.0 ? longitude = PI / 2.0 :longitude = Math.atan(p[1]/p[0])
58
+ latitude = PI / 2.0 - Math.acos(p[2])
59
+
60
+ # select correct branch of arctan
61
+ (p[1] <= 0.0 ? longitude = -(PI - longitude) : longitude = PI + longitude) if p[0] < 0.0
62
+ [longitude * DEGREES, latitude * DEGREES]
63
+ end
64
+
65
+ #
66
+ # convert longitude, latitude IN RADIANS to (x,y,z)
67
+ #
68
+ def to_cart(longitude, latitude)
69
+ theta = longitude
70
+ # spherical coordinate use "co-latitude", not "latitude"
71
+ # lattiude = [-90, 90] with 0 at equator
72
+ # co-latitude = [0, 180] with 0 at north pole
73
+ phi = PI / 2.0 - latitude
74
+ [Math.cos(theta) * Math.sin(phi), Math.sin(theta) * Math.sin(phi), Math.cos(phi)]
75
+ end
76
+
77
+ # spoints -- get raw list of points in longitude,latitude format
78
+ #
79
+ # radius: radius of polygon in meters
80
+ # sides: number of sides
81
+ # rotate: rotate polygon by number of degrees
82
+ #
83
+ # Returns a list of points comprising the object
84
+ #
85
+ def spoints(longitude, latitude, radius, sides, rotate=0)
86
+
87
+ rotate_radians = rotate * RADIANS
88
+
89
+ # compute longitude degrees (in radians) at given latitude
90
+ r = radius / (EARTH_MEAN_RADIUS * Math.cos(latitude * RADIANS))
91
+
92
+ vector = to_cart(longitude * RADIANS, latitude * RADIANS)
93
+ point = to_cart(longitude * RADIANS + r, latitude * RADIANS)
94
+ points = []
95
+
96
+ for side in 0...sides
97
+ points << to_earth(rotate_point(vector, point, rotate_radians + (2.0 * PI/sides)*side))
98
+ end
99
+
100
+ # Connect to starting point exactly
101
+ # Not sure if required, but seems to help when the polygon is not filled
102
+ points << points[0]
103
+ end
104
+
105
+ #
106
+ # rotate point around unit vector by phi radians
107
+ # http://blog.modp.com/2007/09/rotating-point-around-vector.html
108
+ #
109
+ def rotate_point(vector, point, phi)
110
+ # remap vector for sanity
111
+ u, v, w, x, y, z = vector[0], vector[1], vector[2], point[0], point[1], point[2]
112
+
113
+ a = u*x + v*y + w*z
114
+ d = Math.cos(phi)
115
+ e = Math.sin(phi)
116
+
117
+ [(a*u + (x - a*u)*d + (v*z - w*y) * e),
118
+ (a*v + (y - a*v)*d + (w*x - u*z) * e),
119
+ (a*w + (z - a*w)*d + (u*y - v*x) * e)]
120
+ end
121
+
122
+ #
123
+ # Output points formatted as a KML string
124
+ #
125
+ # You may want to edit this function to change "extrude" and other XML nodes.
126
+ #
127
+ def points_to_kml(points)
128
+
129
+ kml_string = "<Polygon>\n"
130
+ kml_string << " <outerBoundaryIs><LinearRing><coordinates>\n"
131
+
132
+ points.each do |point|
133
+ kml_string << " " << point[0].to_s << "," << point[1].to_s << "\n"
134
+ end
135
+
136
+ kml_string << " </coordinates></LinearRing></outerBoundaryIs>\n"
137
+ kml_string << "</Polygon>\n"
138
+
139
+ # kml_string << " <extrude>1</extrude>\sides"
140
+ # kml_string << " <altitudeMode>clampToGround</altitudeMode>\sides"
141
+ end
142
+
143
+ #
144
+ # kml_regular_polygon - Regular polygon
145
+ #
146
+ # (longitude, latitude) - center point in decimal degrees
147
+ # radius - radius in meters
148
+ # segments - number of sides, > 20 looks like a circle (optional, default: 20)
149
+ # rotate - rotate polygon by number of degrees (optional, default: 0)
150
+ #
151
+ # Returns a string suitable for adding into a KML file.
152
+ #
153
+ def kml_regular_polygon(longitude, latitude, radius, segments=20, rotate=0)
154
+ points_to_kml(spoints(longitude, latitude, radius, segments, rotate))
155
+ end
156
+
157
+ #
158
+ # kml_star - Make a "star" or "burst" pattern
159
+ #
160
+ # (longitude, latitude) - center point in decimal degrees
161
+ # radius - radius in meters
162
+ # innner_radius - radius in meters, typically < outer_radius
163
+ # segments - number of "points" on the star (optional, default: 10)
164
+ # rotate - rotate polygon by number of degrees (optional, default: 0)
165
+ #
166
+ # Returns a string suitable for adding into a KML file.
167
+ #
168
+ def kml_star(longitude, latitude, radius, inner_radius, segments=10, rotate=0)
169
+ outer_points = spoints(longitude, latitude, radius, segments, rotate)
170
+ inner_points = spoints(longitude, latitude, inner_radius, segments, rotate + 180.0 / segments)
171
+
172
+ # interweave the radius and inner_radius points
173
+ # I'm sure there is a better way
174
+ points = []
175
+ for point in 0...outer_points.length
176
+ points << outer_points[point]
177
+ points << inner_points[point]
178
+ end
179
+
180
+ # MTB - Drop the last overlapping point leaving start and end points connecting
181
+ # (resulting output differs from orig, but is more correct)
182
+ points.pop
183
+
184
+ points_to_kml(points)
185
+ end
186
+
187
+ end
188
+
189
+ #
190
+ # Examples
191
+ #
192
+ # puts KmlPolygon::kml_star(45,45, 70000, 50000)
193
+ # puts KmlPolygon::kml_regular_polygon(50, 50, 70000)
@@ -0,0 +1,3 @@
1
+ module KmlPolygon
2
+ VERSION = "2.0.2"
3
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kml_polygon
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Nick Galbreath
8
+ - Matthew Brookes
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-30 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! "Generate KML polygons (circle, star etc.) from lat/long and radius\n
15
+ \ A port of http://blog.client9.com/2007/09/drawing-circles-and-stars-on-google.html"
16
+ email:
17
+ - kml_polygon@nospam.33m.co
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - kml_polygon.gemspec
28
+ - lib/kml_polygon.rb
29
+ - lib/kml_polygon/version.rb
30
+ homepage: https://github.com/mbrookes/kml_polygon
31
+ licenses:
32
+ - MIT
33
+ metadata: {}
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ requirements: []
49
+ rubyforge_project:
50
+ rubygems_version: 2.0.3
51
+ signing_key:
52
+ specification_version: 4
53
+ summary: Output a KML fragment defining a polygon (eg. a circle or star) about a point
54
+ test_files: []