GeoRuby 1.2.1 → 1.2.2
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.
- data/lib/geo_ruby/shp4r/shp.rb +2 -0
- data/lib/geo_ruby/simple_features/geometry.rb +50 -2
- data/rakefile.rb +1 -1
- data/test/test_georss_kml.rb +58 -0
- data/test/test_shp.rb +0 -1
- metadata +2 -2
data/lib/geo_ruby/shp4r/shp.rb
CHANGED
@@ -25,6 +25,8 @@ module GeoRuby
|
|
25
25
|
class ShpFile
|
26
26
|
attr_reader :shp_type, :record_count, :xmin, :ymin, :xmax, :ymax, :zmin, :zmax, :mmin, :mmax
|
27
27
|
|
28
|
+
include Enumerable
|
29
|
+
|
28
30
|
#Opens a SHP file. Both "abc.shp" and "abc" are accepted. The files "abc.shp", "abc.shx" and "abc.dbf" must be present
|
29
31
|
def initialize(file, access = "r")
|
30
32
|
#strip the shp out of the file if present
|
@@ -152,8 +152,7 @@ module GeoRuby#:nodoc:
|
|
152
152
|
georss_parser= GeorssParser::new
|
153
153
|
georss_parser.parse(georss)
|
154
154
|
georss_parser.geometry
|
155
|
-
end
|
156
|
-
|
155
|
+
end
|
157
156
|
#sends back an array: The first element is the goemetry based on the GeoRSS string passed as argument. The second one is the GeoRSSTags (found only with the Simple format)
|
158
157
|
def self.from_georss_with_tags(georss)
|
159
158
|
georss_parser= GeorssParser::new
|
@@ -161,6 +160,55 @@ module GeoRuby#:nodoc:
|
|
161
160
|
[georss_parser.geometry, georss_parser.georss_tags]
|
162
161
|
end
|
163
162
|
|
163
|
+
#Sends back a geometry from a KML encoded geometry string.
|
164
|
+
#Limitations : Only supports points, linestrings and polygons (no collection for now).
|
165
|
+
#Addapted from Pramukta's code
|
166
|
+
def self.from_kml(kml)
|
167
|
+
return GeoRuby::SimpleFeatures::Geometry.from_ewkt(kml_to_wkt(kml))
|
168
|
+
end
|
169
|
+
|
170
|
+
require 'rexml/document'
|
171
|
+
def self.kml_to_wkt(kml)
|
172
|
+
doc = REXML::Document.new(kml)
|
173
|
+
wkt = ""
|
174
|
+
if ["Point", "LineString", "Polygon" ].include?(doc.root.name)
|
175
|
+
case doc.root.name
|
176
|
+
when "Point" then
|
177
|
+
coords = doc.elements["/Point/coordinates"].text.gsub(/\n/," ")
|
178
|
+
wkt = doc.root.name.upcase + "(" + split_coords(coords).join(' ') + ")"
|
179
|
+
when "LineString" then
|
180
|
+
coords = doc.elements["/LineString/coordinates"].text.gsub(/\n/," ")
|
181
|
+
coords = split_coords(coords)
|
182
|
+
wkt = doc.root.name.upcase + "(" + coords.join(",") + ")"
|
183
|
+
when "Polygon" then
|
184
|
+
# polygons have one outer ring and zero or more inner rings
|
185
|
+
bounds = []
|
186
|
+
bounds << doc.elements["/Polygon/outerBoundaryIs/LinearRing/coordinates"].text
|
187
|
+
inner_coords_elements = doc.elements.each("/Polygon/innerBoundaryIs/LinearRing/coordinates") do |inner_coords|
|
188
|
+
inner_coords = inner_coords.text
|
189
|
+
bounds << inner_coords
|
190
|
+
end
|
191
|
+
|
192
|
+
wkt = doc.root.name.upcase + "(" + bounds.map do |bound|
|
193
|
+
bound.gsub!(/\n/, " ")
|
194
|
+
bound = split_coords(bound)
|
195
|
+
if bound.first != bound.last
|
196
|
+
bound.push bound.first
|
197
|
+
end
|
198
|
+
"(" + bound.join(",") + ")"
|
199
|
+
end.join(",") + ")"
|
200
|
+
end
|
201
|
+
end
|
202
|
+
return wkt
|
203
|
+
end
|
204
|
+
|
205
|
+
private
|
206
|
+
|
207
|
+
def self.split_coords(coords)
|
208
|
+
coords.split(" ").collect { |coord|
|
209
|
+
coord.gsub(","," ")
|
210
|
+
}
|
211
|
+
end
|
164
212
|
end
|
165
213
|
end
|
166
214
|
end
|
data/rakefile.rb
CHANGED
@@ -24,7 +24,7 @@ spec = Gem::Specification::new do |s|
|
|
24
24
|
s.platform = Gem::Platform::RUBY
|
25
25
|
|
26
26
|
s.name = 'GeoRuby'
|
27
|
-
s.version = "1.2.
|
27
|
+
s.version = "1.2.2"
|
28
28
|
s.summary = "Ruby data holder for OGC Simple Features"
|
29
29
|
s.description = <<EOF
|
30
30
|
GeoRuby is intended as a holder for data returned from PostGIS and MySQL Spatial queries. The data model roughly follows the OGC "Simple Features for SQL" specification (see www.opengis.org/docs/99-049.pdf), although without any kind of advanced functionalities (such as geometric operators or reprojections)
|
data/test/test_georss_kml.rb
CHANGED
@@ -153,5 +153,63 @@ class TestGeorssKml < Test::Unit::TestCase
|
|
153
153
|
|
154
154
|
end
|
155
155
|
|
156
|
+
def test_kml_read
|
157
|
+
g = Geometry.from_kml("<Point><coordinates>45,12,25</coordinates></Point>")
|
158
|
+
assert(g.is_a?(Point))
|
159
|
+
assert_equal(g,Point.from_x_y_z(45,12,25))
|
160
|
+
|
161
|
+
g = Geometry.from_kml("<LineString>
|
162
|
+
<extrude>1</extrude>
|
163
|
+
<tessellate>1</tessellate>
|
164
|
+
<coordinates>
|
165
|
+
-122.364383,37.824664,0 -122.364152,37.824322,0
|
166
|
+
</coordinates>
|
167
|
+
</LineString>")
|
168
|
+
assert(g.is_a?(LineString))
|
169
|
+
assert(2,g.length)
|
170
|
+
assert_equal(LineString.from_points([Point.from_x_y_z(-122.364383,37.824664,0),Point.from_x_y_z(-122.364152,37.824322,0)],DEFAULT_SRID,true),g)
|
171
|
+
|
172
|
+
g = Geometry.from_kml("<Polygon>
|
173
|
+
<extrude>1</extrude>
|
174
|
+
<altitudeMode>relativeToGround</altitudeMode>
|
175
|
+
<outerBoundaryIs>
|
176
|
+
<LinearRing>
|
177
|
+
<coordinates>
|
178
|
+
-122.366278,37.818844,30
|
179
|
+
-122.365248,37.819267,30
|
180
|
+
-122.365640,37.819861,30
|
181
|
+
-122.366669,37.819429,30
|
182
|
+
-122.366278,37.818844,30
|
183
|
+
</coordinates>
|
184
|
+
</LinearRing>
|
185
|
+
</outerBoundaryIs>
|
186
|
+
<innerBoundaryIs>
|
187
|
+
<LinearRing>
|
188
|
+
<coordinates>
|
189
|
+
-122.366212,37.818977,30
|
190
|
+
-122.365424,37.819294,30
|
191
|
+
-122.365704,37.819731,30
|
192
|
+
-122.366488,37.819402,30
|
193
|
+
-122.366212,37.818977,30
|
194
|
+
</coordinates>
|
195
|
+
</LinearRing>
|
196
|
+
</innerBoundaryIs>
|
197
|
+
<innerBoundaryIs>
|
198
|
+
<LinearRing>
|
199
|
+
<coordinates>
|
200
|
+
-122.366212,37.818977,30
|
201
|
+
-122.365424,37.819294,30
|
202
|
+
-122.365704,37.819731,30
|
203
|
+
-122.366488,37.819402,30
|
204
|
+
-122.366212,37.818977,30
|
205
|
+
</coordinates>
|
206
|
+
</LinearRing>
|
207
|
+
</innerBoundaryIs>
|
208
|
+
</Polygon>")
|
209
|
+
assert(g.is_a?(Polygon))
|
210
|
+
assert_equal(3,g.length)
|
211
|
+
|
212
|
+
end
|
213
|
+
|
156
214
|
|
157
215
|
end
|
data/test/test_shp.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: GeoRuby
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.2.
|
7
|
-
date: 2007-
|
6
|
+
version: 1.2.2
|
7
|
+
date: 2007-03-24 00:00:00 +01:00
|
8
8
|
summary: Ruby data holder for OGC Simple Features
|
9
9
|
require_paths:
|
10
10
|
- lib
|