ruby-opengeodb 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.1.0 2007-07-30
2
+
3
+ * 1 major enhancement:
4
+ * neue Methoden Location.like + Location.by_plz
5
+
1
6
  == 0.0.2 2007-07-28
2
7
 
3
8
  * 1 major enhancement:
@@ -9,8 +9,8 @@
9
9
  require 'rubygems'
10
10
  require 'ruby-opengeodb'
11
11
 
12
- PLZ_START = 60000
13
- PLZ_END = 59999
12
+ PLZ_START = 00000
13
+ PLZ_END = 99999
14
14
 
15
15
  Location.db_connect
16
16
 
@@ -80,5 +80,3 @@ while true do
80
80
  end
81
81
  end
82
82
 
83
- print "RETURN druecken zum Beenden"
84
- ans=gets
@@ -33,6 +33,8 @@ class Typename < ActiveRecord::Base
33
33
  typename = Typename.find(:first, :conditions => "name = 'KFZ-Kennzeichen' AND type_locale = 'de'")
34
34
  when :kanton
35
35
  typename = Typename.find(:first, :conditions => "name = 'Kanton' AND type_locale = 'de_CH'")
36
+ when :ortsname
37
+ typename = Typename.find(:first, :conditions => "name = 'Name' AND type_locale = 'de'")
36
38
  else
37
39
  raise 'invalid type: '+type.to_s
38
40
  end
@@ -57,14 +59,30 @@ class Location < ActiveRecord::Base
57
59
  database="opengeodb",
58
60
  socket="/var/run/mysqld/mysqld.sock")
59
61
  activerecord_connect(adapter,host,username,password,database,socket)
62
+ @connected = true
60
63
  end
61
64
 
62
65
  # eine location ist (vorerst) durch eine bestimmte PLZ bestimmt
66
+ # - ..new("12345") # als PLZ
67
+ # - ..new(:plz => "12345") # auch als PLZ
68
+ # - ..new(:ort => "Hintertupfingen") als Ort
63
69
  def initialize(plz=nil)
64
- @plz = plz
70
+ if plz.class == Hash
71
+ if plz[:plz]
72
+ @plz = plz[:plz]
73
+ end
74
+ elsif plz.class == String
75
+ @plz = plz
76
+ end
65
77
  @lat = @lon = nil
66
- #activerecord_connect
67
- @lat,@lon = get_lat_lon(@plz) if ! @lat
78
+
79
+ if plz
80
+ @lat,@lon = get_lat_lon(@plz) if ! @lat
81
+ end
82
+ end
83
+
84
+ def to_s
85
+ "#{self.plz} #{self.ort} #{self.lat} #{self.lon}"
68
86
  end
69
87
 
70
88
  def lat
@@ -77,20 +95,49 @@ class Location < ActiveRecord::Base
77
95
  @lon
78
96
  end
79
97
 
80
- def Location.all
81
- Location.find(:all)
82
- end
98
+ #def Location.all
99
+ #Location.find(:all)
100
+ #end
83
101
 
84
- private
85
- def Location.to_deg(rad)
86
- rad/0.0174532
102
+ # Liefert ein Array von loc_id,PLZ,Ort
103
+ def Location.like(pattern)
104
+ Location.db_connect if ! @connected
105
+ orte = Textdata.find_by_sql("SELECT * FROM geodb_textdata WHERE text_val LIKE '#{pattern}' AND text_type=500100000")
106
+ result = []
107
+ orte.each {|ort|
108
+ loc_id = ort.attributes['loc_id']
109
+ # puts "loc_id: "+loc_id.to_s
110
+ plzs = Textdata.find_by_sql("SELECT * FROM geodb_textdata WHERE loc_id = '#{loc_id}' AND text_type = 500300000")
111
+ plzs.each {|plz_rec|
112
+ plz = plz_rec.attributes['text_val']
113
+ loc_id = plz_rec.attributes['loc_id']
114
+ begin
115
+ location = Location.new(plz)
116
+ # result << location
117
+ name = ort.attributes['text_val']
118
+ result << [loc_id, plz, name]
119
+ rescue
120
+ end
121
+ }
122
+ }
123
+ result
87
124
  end
88
125
 
89
- def Location.to_rad(deg)
90
- deg*0.0174532
126
+ # Liefert ein Array von loc_id,PLZ,Ort
127
+ def Location.by_plz(plz)
128
+ result = []
129
+ recs=Textdata.find(:all, :conditions => "text_val = '#{plz}' AND text_type=500300000")
130
+ recs.each { |rec|
131
+ loc_id = rec['loc_id']
132
+ rec2 = Textdata.find(:all, :conditions => "loc_id = '#{loc_id}' AND text_type=500100000")
133
+ rec2.each { |ortsname_rec|
134
+ ortsname = ortsname_rec.attributes['text_val']
135
+ result << [loc_id, plz, ortsname]
136
+ }
137
+ }
138
+ result
91
139
  end
92
140
 
93
- public
94
141
  def distance_lat_lon(lat,lon)
95
142
  result = Math.acos(
96
143
  (Math.sin(Location.to_rad(self.lat)) * Math.sin(Location.to_rad(lat))) + (Math.cos(Location.to_rad(self.lat)) *
@@ -112,18 +159,6 @@ public
112
159
 
113
160
  result
114
161
  end
115
- private
116
-
117
- def get_lat_lon(plz)
118
- rec=Textdata.find(:all, :conditions => "text_val = '#{plz}' AND text_type=500100000")
119
- loc_id = rec.first['loc_id']
120
- rec=Coordinates.find(:all, :conditions => "loc_id = '#{loc_id}'")
121
- lat = rec.first.attributes['lat']
122
- lon = rec.first.attributes['lon']
123
- return lat,lon
124
- end
125
-
126
- public
127
162
 
128
163
  def ort
129
164
  plz = @plz
@@ -134,15 +169,13 @@ public
134
169
  return ortsname
135
170
  end
136
171
 
137
- def in_radius(radius=10.0)
172
+ def XXXin_radius(radius=10.0)
138
173
  oo = Location.new
139
174
  plzs=Textdata.find(:all, :conditions => "text_type=500300000")
140
175
  result = []
141
176
  plzs.each {|plz|
142
- p plz
143
177
  oo = Location.new(plz.text_val)
144
178
  puts "neues Objekt mit PLZ "+oo.plz
145
- p oo
146
179
  puts "distance: "+oo.distance(self).to_s
147
180
  ans = gets
148
181
 
@@ -151,5 +184,23 @@ puts "distance: "+oo.distance(self).to_s
151
184
  result
152
185
  end
153
186
 
187
+ private
188
+
189
+ def Location.to_deg(rad)
190
+ rad/0.0174532
191
+ end
192
+
193
+ def Location.to_rad(deg)
194
+ deg*0.0174532
195
+ end
196
+
197
+ def get_lat_lon(plz)
198
+ rec=Textdata.find(:all, :conditions => "text_val = '#{plz}' AND text_type=500100000")
199
+ loc_id = rec.first['loc_id']
200
+ rec=Coordinates.find(:all, :conditions => "loc_id = '#{loc_id}'")
201
+ lat = rec.first.attributes['lat']
202
+ lon = rec.first.attributes['lon']
203
+ return lat,lon
204
+ end
154
205
  end
155
206
 
@@ -1,8 +1,8 @@
1
1
  module RubyOpengeodb #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 0
5
- TINY = 2
4
+ MINOR = 1
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -21,7 +21,7 @@ class TestRubyOpengeodb < Test::Unit::TestCase
21
21
  #end
22
22
 
23
23
  def test_ludwigshafen
24
- assert_equal "Ludwigshafen am Rhein", Location.new("67059").ort, "Ludwigshafen am Rhein nicht erhalten"
24
+ assert_equal "Ludwigshafen am Rhein", Location.new(:plz=>"67059").ort, "Ludwigshafen am Rhein nicht erhalten"
25
25
  end
26
26
 
27
27
  def test_berlin_plz
@@ -86,6 +86,7 @@ class TestRubyOpengeodb < Test::Unit::TestCase
86
86
  def test_typenames
87
87
  typenames = Typename.new
88
88
  assert_equal 500300000, typenames.type_id(:postleitzahl)
89
+ assert_equal 500100000, typenames.type_id(:ortsname)
89
90
  assert_equal 500300000, typenames.type_id(:plz)
90
91
  assert_raise (RuntimeError) {
91
92
  typenames.type_id(:unbekannt)
@@ -115,8 +116,58 @@ class TestRubyOpengeodb < Test::Unit::TestCase
115
116
  assert_equal 29949, count # TODO: Anzahl kann sich natuerlich bei neueren Versionen der Datenbank aendert
116
117
  end
117
118
 
118
- def DONT_test_namenssuche
119
- assert_equal 42, name_like("%Holle%")
119
+ def test_namenssuche
120
+ locs = Location.like("Holle%")
121
+ assert_equal [[18580, "31188", "Holle"],
122
+ [18581, "06179", "Holleben"],
123
+ [18582, "27616", "Hollen"],
124
+ [18583, "86568", "Hollenbach"],
125
+ [18584, "23883", "Hollenbek"],
126
+ [18585, "21279", "Hollenstedt"],
127
+ [18586, "56412", "Holler"],
128
+ [18587, "21723", "Hollern-Twielenfleth"]], locs
129
+ assert_equal [[19268, "93348", "Kirchdorf"],
130
+ [19269, "83527", "Kirchdorf"],
131
+ [19270, "18519", "Kirchdorf"],
132
+ [19271, "27245", "Kirchdorf"]], Location.like("Kirchdorf")
133
+ assert_equal [], Location.like("Gibbsnet")
134
+ assert_equal [[13836,"25927","Aventoft"]] , Location.like("Aventoft")
135
+ end
136
+
137
+ def test_plzsuche
138
+ locs = Location.by_plz("27616")
139
+ assert_equal [[14443, "27616", "Beverstedt"],
140
+ [16659, "27616", "Frelsdorf"],
141
+ [18041, "27616", "Heerstedt"],
142
+ [19318, "27616", "Kirchwistedt"],
143
+ [14726, "27616", "Bokel"],
144
+ [20499, "27616", "Lunestedt"],
145
+ [13709, "27616", "Appeln"],
146
+ [18582, "27616", "Hollen"],
147
+ [24701, "27616", "Stubben"]], locs
148
+ assert_equal 9, locs.size
149
+ end
150
+
151
+ def test_berlin_set
152
+ locs = Location.by_plz("13359")
153
+ assert_equal [[14356,"13359","Berlin"]], locs
154
+ end
155
+
156
+ def test_empty_plz_set
157
+ locs = Location.by_plz("AAAAA")
158
+ assert_equal [], locs
159
+ end
160
+
161
+ def test_plzsuche_lat_lon
162
+ # das geht nicht, weil ich beim Anlegen eines Objekt keine mehrdeutigen
163
+ # PLZ verwende:
164
+ #locs = Location.by_plz("27616")
165
+ #locs.each {|loc|
166
+ # l = Location.new(loc[1])
167
+ # puts l.to_s
168
+ # assert_in_delta 53.4430232824391, l.lat, 0.0001
169
+ # assert_in_delta 8.82614916550224, l.lon, 0.0001
170
+ #}
120
171
  end
121
172
 
122
173
  end
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>ruby opengeodb</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/ruby-opengeodb"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/ruby-opengeodb" class="numbers">0.0.2</a>
36
+ <a href="http://rubyforge.org/projects/ruby-opengeodb" class="numbers">0.1.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;ruby-opengeodb&#8217;</h1>
39
39
 
@@ -64,6 +64,16 @@ Probleme: <a href="http://www.google.com/search?q=opengeodb&#38;ie=utf-8&#38;oe=
64
64
 
65
65
  <pre syntax="ruby">sudo gem install ruby-opengeodb</pre>
66
66
 
67
+ <p>Um das Gem verwenden zu k&ouml;nnen, mu&szlig; die OpenGeoDB Datenbank installiert sein &#8211; entweder lokal oder auf einem anderen System auf dem Zugriff auf die
68
+ Datenbank moeglich ist.</p>
69
+
70
+
71
+ <p>Ich habe mit einer MySQL-Datenbank getestet. Andere Datenbanken sollten auch
72
+ problemlos m&ouml;glich sein, solange das Gem Active-Record damit umgehen kann.
73
+ Ein &Auml;ndern der Connect-Parameter sollte eigentlich ausreichen, um eine andere
74
+ Datenbank zu verwenden. Falls nicht, schreibt mir eine eMail mit der Problembeschreibung oder sogar einer L&ouml;sung daf&uuml;r!</p>
75
+
76
+
67
77
  <h2>The basics</h2>
68
78
 
69
79
 
@@ -117,6 +127,17 @@ puts "Entfernung: " + berlin.distance(ludwigshafen).to_s + " km"
117
127
  # Eine Distanz kann auch zu einer definierten Koordinate berechnet werden
118
128
 
119
129
  puts "Entfernung: " + berlin.distance_lat_lon(50.0, 10.0).to_s + " km"
130
+
131
+ # liefert ein Array aller passenden Orte einer PLZ
132
+
133
+ liste = Location.by_plz("27616") # mehrere Orte haben diese PLZ
134
+ # liefert ein Array mit [loc_id, plz, ort]
135
+ # 'loc_id' ist ein interner Key bei OpenGeoDB
136
+
137
+ liste = Location.like("Holle%") # alle Orte, die mit Holle beginnen
138
+ # liefert ein Array mit [loc_id, plz, ort]
139
+ # s. o.
140
+
120
141
  </code>
121
142
  </pre>
122
143
 
@@ -132,15 +153,12 @@ methode im eigenlichen Sinne, kann aber ganz n&uuml;tzlich sein, wenn man wissen
132
153
  <p>Was wollt ihr unbedingt noch haben &#8211; schreibt mir an die untenstehende eMail-Adresse!</p>
133
154
 
134
155
 
135
- <h2>Forum</h2>
156
+ <h2>Mailinglist</h2>
136
157
 
137
158
 
138
159
  <p><a href="http://groups.google.com/group/ruby-opengeodb">http://groups.google.com/group/ruby-opengeodb</a></p>
139
160
 
140
161
 
141
- <p><span class="caps">TODO</span> &#8211; create Google Group &#8211; ruby-opengeodb</p>
142
-
143
-
144
162
  <h2>How to submit patches</h2>
145
163
 
146
164
 
@@ -161,7 +179,7 @@ methode im eigenlichen Sinne, kann aber ganz n&uuml;tzlich sein, wenn man wissen
161
179
 
162
180
  <p>Comments are welcome. Send an email to <a href="mailto:thopre@gmail.com">Thomas Preymesser</a>.</p>
163
181
  <p class="coda">
164
- <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 28th July 2007<br>
182
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 30th July 2007<br>
165
183
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
166
184
  </p>
167
185
  </div>
data/website/index.txt CHANGED
@@ -23,6 +23,14 @@ h2. Installing
23
23
 
24
24
  <pre syntax="ruby">sudo gem install ruby-opengeodb</pre>
25
25
 
26
+ Um das Gem verwenden zu k&ouml;nnen, mu&szlig; die OpenGeoDB Datenbank installiert sein - entweder lokal oder auf einem anderen System auf dem Zugriff auf die
27
+ Datenbank moeglich ist.
28
+
29
+ Ich habe mit einer MySQL-Datenbank getestet. Andere Datenbanken sollten auch
30
+ problemlos m&ouml;glich sein, solange das Gem Active-Record damit umgehen kann.
31
+ Ein &Auml;ndern der Connect-Parameter sollte eigentlich ausreichen, um eine andere
32
+ Datenbank zu verwenden. Falls nicht, schreibt mir eine eMail mit der Problembeschreibung oder sogar einer L&ouml;sung daf&uuml;r!
33
+
26
34
  h2. The basics
27
35
 
28
36
  Da ich mit Test-Driven-Development (TDD) arbeite, sollten f&uuml;r jede Funktion
@@ -75,6 +83,18 @@ puts "Entfernung: " + berlin.distance(ludwigshafen).to_s + " km"
75
83
 
76
84
 
77
85
  puts "Entfernung: " + berlin.distance_lat_lon(50.0, 10.0).to_s + " km"
86
+
87
+ # liefert ein Array aller passenden Orte einer PLZ
88
+
89
+ liste = Location.by_plz("27616") # mehrere Orte haben diese PLZ
90
+ # liefert ein Array mit [loc_id, plz, ort]
91
+ # 'loc_id' ist ein interner Key bei OpenGeoDB
92
+
93
+
94
+ liste = Location.like("Holle%") # alle Orte, die mit Holle beginnen
95
+ # liefert ein Array mit [loc_id, plz, ort]
96
+ # s. o.
97
+
78
98
  </code>
79
99
  </pre>
80
100
 
@@ -87,12 +107,10 @@ methode im eigenlichen Sinne, kann aber ganz n&uuml;tzlich sein, wenn man wissen
87
107
 
88
108
  Was wollt ihr unbedingt noch haben - schreibt mir an die untenstehende eMail-Adresse!
89
109
 
90
- h2. Forum
110
+ h2. Mailinglist
91
111
 
92
112
  "http://groups.google.com/group/ruby-opengeodb":http://groups.google.com/group/ruby-opengeodb
93
113
 
94
- TODO - create Google Group - ruby-opengeodb
95
-
96
114
  h2. How to submit patches
97
115
 
98
116
  Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ruby-opengeodb
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.2
7
- date: 2007-07-28 00:00:00 +02:00
6
+ version: 0.1.0
7
+ date: 2007-07-30 00:00:00 +02:00
8
8
  summary: access to opengeodb Database
9
9
  require_paths:
10
10
  - lib