ruby-opengeodb 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/Manifest.txt +1 -0
- data/examples/example2.rb +13 -6
- data/examples/where_is_the_geocache.rb +84 -0
- data/lib/ruby-opengeodb/location.rb +41 -1
- data/lib/ruby-opengeodb/version.rb +1 -1
- data/test/test_ruby-opengeodb.rb +40 -0
- data/website/index.html +16 -12
- data/website/index.txt +15 -10
- metadata +3 -2
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/examples/example2.rb
CHANGED
@@ -6,15 +6,22 @@ Location.db_connect
|
|
6
6
|
|
7
7
|
# Achtung: die Laengen- und Breitengrade geben die ungefaehre Mitte des PLZ-Bereichs an und koennen leicht von den eigenen Koordinaten abweichen, wenn man in diesem PLZ-Gebiet wohnt.
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
berlin = Location.new("13359")
|
10
|
+
|
11
|
+
found = 0
|
12
|
+
1.upto(99999) do |nr|
|
13
|
+
plz = sprintf("%05d",nr)
|
14
|
+
# puts plz
|
13
15
|
begin
|
14
16
|
location = Location.new(plz)
|
15
|
-
puts "PLZ: #{plz} Ort: #{location.ort} Lat: #{location.lat} Lon: #{location.lon}"
|
17
|
+
# puts "PLZ: #{plz} Ort: #{location.ort} Lat: #{location.lat} Lon: #{location.lon}"
|
18
|
+
if berlin.distance(location) <= 800
|
19
|
+
puts "PLZ: #{plz}\tEntfernung zu mir: #{berlin.distance(location).to_i} km\tOrt: #{location.ort} Lat: #{location.lat} Lon: #{location.lon}"
|
20
|
+
found += 1
|
21
|
+
end
|
16
22
|
rescue
|
17
23
|
# keine PLZ in Datenbank vorhanden => ignorieren und weitermachen
|
18
24
|
end
|
19
|
-
nr += 1
|
20
25
|
end
|
26
|
+
|
27
|
+
puts "#{found} Staedte gefunden"
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Skript: where_is_the_geocache.rb
|
4
|
+
# wo ist ein Geocache?
|
5
|
+
# sucht anhand der Koordinaten die PLZ bzw. Stadt heraus
|
6
|
+
# aus dem ruby-opengeodb Projekt: http://ruby-opengeodb.rubyforge.org/
|
7
|
+
# Autor: Thomas Preymesser (thopre@gmail.com)
|
8
|
+
|
9
|
+
require 'rubygems'
|
10
|
+
require 'ruby-opengeodb'
|
11
|
+
|
12
|
+
PLZ_START = 60000
|
13
|
+
PLZ_END = 59999
|
14
|
+
|
15
|
+
Location.db_connect
|
16
|
+
|
17
|
+
def list(a,lat,lon)
|
18
|
+
puts "Entfernung in km (zu lat: #{lat} lon: #{lon}) PLZ Ort"
|
19
|
+
puts "-"*60
|
20
|
+
0.upto(9) do |i|
|
21
|
+
print a[i][0].to_s + " "
|
22
|
+
if a[i][1].class == String
|
23
|
+
print "--"
|
24
|
+
else
|
25
|
+
print a[i][1].plz + " "
|
26
|
+
begin
|
27
|
+
print a[i][1].ort
|
28
|
+
rescue
|
29
|
+
print "--"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
puts
|
33
|
+
end
|
34
|
+
puts
|
35
|
+
end
|
36
|
+
|
37
|
+
if ARGV.size < 2
|
38
|
+
puts "usage: #{$0} <lat> <lon>"
|
39
|
+
raise ArgumentError
|
40
|
+
end
|
41
|
+
|
42
|
+
lat=ARGV[0].to_f
|
43
|
+
lon=ARGV[1].to_f
|
44
|
+
result = [
|
45
|
+
[999999,"VOID"],
|
46
|
+
[999999,"VOID"],
|
47
|
+
[999999,"VOID"],
|
48
|
+
[999999,"VOID"],
|
49
|
+
[999999,"VOID"],
|
50
|
+
[999999,"VOID"],
|
51
|
+
[999999,"VOID"],
|
52
|
+
[999999,"VOID"],
|
53
|
+
[999999,"VOID"],
|
54
|
+
[999999,"VOID"],
|
55
|
+
]
|
56
|
+
|
57
|
+
nr = PLZ_START
|
58
|
+
while true do
|
59
|
+
plz = sprintf("%05d",nr)
|
60
|
+
begin
|
61
|
+
location = Location.new(plz)
|
62
|
+
valid_plz = true
|
63
|
+
rescue
|
64
|
+
valid_plz = false
|
65
|
+
end
|
66
|
+
if valid_plz
|
67
|
+
distance = location.distance_lat_lon(lat,lon)
|
68
|
+
result[10] = [distance,location]
|
69
|
+
if result.sort != result
|
70
|
+
result.sort!
|
71
|
+
list(result,lat,lon)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
nr += 1
|
75
|
+
if nr > 99999
|
76
|
+
nr = 0
|
77
|
+
end
|
78
|
+
if nr == PLZ_END
|
79
|
+
break;
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
print "RETURN druecken zum Beenden"
|
84
|
+
ans=gets
|
@@ -20,7 +20,33 @@ class Changelog < ActiveRecord::Base
|
|
20
20
|
end
|
21
21
|
end # class
|
22
22
|
|
23
|
-
class
|
23
|
+
class Typename < ActiveRecord::Base
|
24
|
+
set_table_name "geodb_type_names"
|
25
|
+
|
26
|
+
def type_id(type)
|
27
|
+
case type
|
28
|
+
when :postleitzahl,:plz
|
29
|
+
typename = Typename.find(:first, :conditions => "name = 'Postleitzahl' AND type_locale = 'de'")
|
30
|
+
when :postleitzahlgebiet
|
31
|
+
typename = Typename.find(:first, :conditions => "name = 'Postleitzahlgebiet' AND type_locale = 'de'")
|
32
|
+
when :kfz_kennzeichen
|
33
|
+
typename = Typename.find(:first, :conditions => "name = 'KFZ-Kennzeichen' AND type_locale = 'de'")
|
34
|
+
when :kanton
|
35
|
+
typename = Typename.find(:first, :conditions => "name = 'Kanton' AND type_locale = 'de_CH'")
|
36
|
+
else
|
37
|
+
raise 'invalid type: '+type.to_s
|
38
|
+
end
|
39
|
+
return typename.attributes['type_id']
|
40
|
+
end
|
41
|
+
|
42
|
+
def name_for(type_no)
|
43
|
+
rec = Typename.find(:first, :conditions => "type_id = #{type_no}")
|
44
|
+
rec.attributes['name']
|
45
|
+
end
|
46
|
+
end # class
|
47
|
+
|
48
|
+
class Location < ActiveRecord::Base
|
49
|
+
set_table_name "geodb_locations"
|
24
50
|
|
25
51
|
attr_reader :plz
|
26
52
|
|
@@ -51,6 +77,10 @@ class Location
|
|
51
77
|
@lon
|
52
78
|
end
|
53
79
|
|
80
|
+
def Location.all
|
81
|
+
Location.find(:all)
|
82
|
+
end
|
83
|
+
|
54
84
|
private
|
55
85
|
def Location.to_deg(rad)
|
56
86
|
rad/0.0174532
|
@@ -61,6 +91,16 @@ private
|
|
61
91
|
end
|
62
92
|
|
63
93
|
public
|
94
|
+
def distance_lat_lon(lat,lon)
|
95
|
+
result = Math.acos(
|
96
|
+
(Math.sin(Location.to_rad(self.lat)) * Math.sin(Location.to_rad(lat))) + (Math.cos(Location.to_rad(self.lat)) *
|
97
|
+
Math.cos(Location.to_rad(lat)) *
|
98
|
+
Math.cos(Location.to_rad(self.lon) - Location.to_rad(lon)))) * 6371.0
|
99
|
+
|
100
|
+
result
|
101
|
+
end
|
102
|
+
|
103
|
+
#TODO: hier distance_lat_lon rufen?
|
64
104
|
def distance(other)
|
65
105
|
unless other.kind_of?(Location)
|
66
106
|
raise ArgumentError, "Argument ist keine 'Location'"
|
data/test/test_ruby-opengeodb.rb
CHANGED
@@ -56,7 +56,11 @@ class TestRubyOpengeodb < Test::Unit::TestCase
|
|
56
56
|
assert_in_delta 0.0, lu.distance(lu), 0.001
|
57
57
|
assert_in_delta 487.2, b.distance(lu), 0.1
|
58
58
|
assert_in_delta 487.2, lu.distance(b), 0.1
|
59
|
+
end
|
59
60
|
|
61
|
+
def test_distance_lat_lon
|
62
|
+
b = Location.new("13359") # ich in Berlin
|
63
|
+
assert_in_delta 369.6, b.distance_lat_lon(50.0, 10.0), 0.1
|
60
64
|
end
|
61
65
|
|
62
66
|
def test_changelog
|
@@ -79,4 +83,40 @@ class TestRubyOpengeodb < Test::Unit::TestCase
|
|
79
83
|
}
|
80
84
|
end
|
81
85
|
|
86
|
+
def test_typenames
|
87
|
+
typenames = Typename.new
|
88
|
+
assert_equal 500300000, typenames.type_id(:postleitzahl)
|
89
|
+
assert_equal 500300000, typenames.type_id(:plz)
|
90
|
+
assert_raise (RuntimeError) {
|
91
|
+
typenames.type_id(:unbekannt)
|
92
|
+
}
|
93
|
+
assert_equal 100800000, typenames.type_id(:postleitzahlgebiet)
|
94
|
+
assert_equal 500500000, typenames.type_id(:kfz_kennzeichen)
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_typenames_name
|
98
|
+
typenames = Typename.new
|
99
|
+
kanton = typenames.type_id(:kanton)
|
100
|
+
assert_equal "Kanton", typenames.name_for(kanton)
|
101
|
+
end
|
102
|
+
|
103
|
+
def DONT_test_all_locations_table
|
104
|
+
# durch alle locations-Tabelle eintraege und anzeigen,
|
105
|
+
# was sie bedeuten
|
106
|
+
locations = Location.all
|
107
|
+
typenames = Typename.new
|
108
|
+
count = 0
|
109
|
+
locations.each {|loc|
|
110
|
+
print "loc_id: " + loc.loc_id.to_s
|
111
|
+
print " #{loc.loc_type} = " + typenames.name_for(loc.loc_type)
|
112
|
+
puts
|
113
|
+
count += 1
|
114
|
+
}
|
115
|
+
assert_equal 29949, count # TODO: Anzahl kann sich natuerlich bei neueren Versionen der Datenbank aendert
|
116
|
+
end
|
117
|
+
|
118
|
+
def DONT_test_namenssuche
|
119
|
+
assert_equal 42, name_like("%Holle%")
|
120
|
+
end
|
121
|
+
|
82
122
|
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.
|
36
|
+
<a href="http://rubyforge.org/projects/ruby-opengeodb" class="numbers">0.0.2</a>
|
37
37
|
</div>
|
38
38
|
<h1>→ ‘ruby-opengeodb’</h1>
|
39
39
|
|
@@ -44,18 +44,18 @@
|
|
44
44
|
<p>Dieses Gem erlaubt den Zugriff auf eine OpenGeoDB Datenbank um Geoinformationen daraus zu ermitteln (z.B. <span class="caps">GPS</span>-Daten zu einer <span class="caps">PLZ</span>) oder Entfernungsberechnung.</p>
|
45
45
|
|
46
46
|
|
47
|
-
<p>
|
47
|
+
<p>Ruby-opengeodb kann verwendet werden, um die Längen- und Breitengrade zu einem
|
48
48
|
Ort zu ermitteln um diesen zum Beispiel auf einer generierten Landkarte anzuzeigen. Es kann zur Entfernungsberechnung verwendet werden: z.B. Suche von Personen oder Objekten, Veranstaltungen, etc. in einem definierten Umkreis.
|
49
|
-
Eine weitere Verwendungsmoeglichkeit
|
49
|
+
Eine weitere Verwendungsmoeglichkeit wären Location-Based-Services, bei dem
|
50
50
|
z.B. allen Besuchern im Umkreis von 30 km ein bestimmtes Werbebanner eingeblendet wird.</p>
|
51
51
|
|
52
52
|
|
53
|
-
<p>OpenGeoDB ist ein Projekt, welches freie Geoinformationen (
|
53
|
+
<p>OpenGeoDB ist ein Projekt, welches freie Geoinformationen (hauptsächlich für Deutschland, Oesterreich und die Schweiz) zusammengetragen und in einer flexiblen Datenbankstruktur mit vielen Moeglichkeiten zur Abfrage zur Verfügung stellt.</p>
|
54
54
|
|
55
55
|
|
56
56
|
<p>Ich habe mit diesem Projekt selbst nichts zu tun – deshalb werde ich auch
|
57
57
|
keinen (kostenlosen) Support zum korrekten Einrichten dieser Datenbank oder
|
58
|
-
anderer Fragen, die damit
|
58
|
+
anderer Fragen, die damit zusammenhängen, leisten. Für diesbezügliche
|
59
59
|
Probleme: <a href="http://www.google.com/search?q=opengeodb&ie=utf-8&oe=utf-8&aq=t">OpenGeoDB</a></p>
|
60
60
|
|
61
61
|
|
@@ -67,8 +67,8 @@ Probleme: <a href="http://www.google.com/search?q=opengeodb&ie=utf-8&oe=
|
|
67
67
|
<h2>The basics</h2>
|
68
68
|
|
69
69
|
|
70
|
-
<p>Da ich mit Test-Driven-Development (TDD) arbeite, sollten
|
71
|
-
dieses Gems in den mitgelieferten
|
70
|
+
<p>Da ich mit Test-Driven-Development (TDD) arbeite, sollten für jede Funktion
|
71
|
+
dieses Gems in den mitgelieferten Testfällen ein Beispiel zur Verwendung
|
72
72
|
enthalten sein.</p>
|
73
73
|
|
74
74
|
|
@@ -113,16 +113,20 @@ puts "Entfernung: " + ludwigshafen.distance(berlin).to_s + " km"
|
|
113
113
|
# zur Kontrolle, der umgekehrte Weg muss (zumindest in diesem Universum) gleich lang sein
|
114
114
|
|
115
115
|
puts "Entfernung: " + berlin.distance(ludwigshafen).to_s + " km"
|
116
|
+
|
117
|
+
# Eine Distanz kann auch zu einer definierten Koordinate berechnet werden
|
118
|
+
|
119
|
+
puts "Entfernung: " + berlin.distance_lat_lon(50.0, 10.0).to_s + " km"
|
116
120
|
</code>
|
117
121
|
</pre>
|
118
122
|
|
119
|
-
<p>Dies ist noch eine ziemlich
|
123
|
+
<p>Dies ist noch eine ziemlich rudimentäre Form dieses Gems – weitere Funktionen
|
120
124
|
werden noch eingebaut.</p>
|
121
125
|
|
122
126
|
|
123
|
-
<p>Die Methode Changelog#changelogs gibt ein Array mit den
|
124
|
-
die beschreiben, was an der Datenbank zuletzt
|
125
|
-
methode im eigenlichen Sinne, kann aber ganz
|
127
|
+
<p>Die Methode Changelog#changelogs gibt ein Array mit den Datensätzen zurück,
|
128
|
+
die beschreiben, was an der Datenbank zuletzt geändert wurde. Keine Anwendungs
|
129
|
+
methode im eigenlichen Sinne, kann aber ganz nützlich sein, wenn man wissen will, welcher Version verwendet wird, ob bestimmte Aenderungen auch in der Version der Datenbank, die man selbst abfragt, schon eingeflossen sind.</p>
|
126
130
|
|
127
131
|
|
128
132
|
<p>Was wollt ihr unbedingt noch haben – schreibt mir an die untenstehende eMail-Adresse!</p>
|
@@ -157,7 +161,7 @@ methode im eigenlichen Sinne, kann aber ganz nuetzlich sein, wenn man wissen wil
|
|
157
161
|
|
158
162
|
<p>Comments are welcome. Send an email to <a href="mailto:thopre@gmail.com">Thomas Preymesser</a>.</p>
|
159
163
|
<p class="coda">
|
160
|
-
<a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>,
|
164
|
+
<a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 28th July 2007<br>
|
161
165
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
162
166
|
</p>
|
163
167
|
</div>
|
data/website/index.txt
CHANGED
@@ -7,16 +7,16 @@ h2. What
|
|
7
7
|
|
8
8
|
Dieses Gem erlaubt den Zugriff auf eine OpenGeoDB Datenbank um Geoinformationen daraus zu ermitteln (z.B. GPS-Daten zu einer PLZ) oder Entfernungsberechnung.
|
9
9
|
|
10
|
-
|
10
|
+
Ruby-opengeodb kann verwendet werden, um die Längen- und Breitengrade zu einem
|
11
11
|
Ort zu ermitteln um diesen zum Beispiel auf einer generierten Landkarte anzuzeigen. Es kann zur Entfernungsberechnung verwendet werden: z.B. Suche von Personen oder Objekten, Veranstaltungen, etc. in einem definierten Umkreis.
|
12
|
-
Eine weitere Verwendungsmoeglichkeit
|
12
|
+
Eine weitere Verwendungsmoeglichkeit wären Location-Based-Services, bei dem
|
13
13
|
z.B. allen Besuchern im Umkreis von 30 km ein bestimmtes Werbebanner eingeblendet wird.
|
14
14
|
|
15
|
-
OpenGeoDB ist ein Projekt, welches freie Geoinformationen (
|
15
|
+
OpenGeoDB ist ein Projekt, welches freie Geoinformationen (hauptsächlich für Deutschland, Oesterreich und die Schweiz) zusammengetragen und in einer flexiblen Datenbankstruktur mit vielen Moeglichkeiten zur Abfrage zur Verfügung stellt.
|
16
16
|
|
17
17
|
Ich habe mit diesem Projekt selbst nichts zu tun - deshalb werde ich auch
|
18
18
|
keinen (kostenlosen) Support zum korrekten Einrichten dieser Datenbank oder
|
19
|
-
anderer Fragen, die damit
|
19
|
+
anderer Fragen, die damit zusammenhängen, leisten. Für diesbezügliche
|
20
20
|
Probleme: "OpenGeoDB":http://www.google.com/search?q=opengeodb&ie=utf-8&oe=utf-8&aq=t
|
21
21
|
|
22
22
|
h2. Installing
|
@@ -25,8 +25,8 @@ h2. Installing
|
|
25
25
|
|
26
26
|
h2. The basics
|
27
27
|
|
28
|
-
Da ich mit Test-Driven-Development (TDD) arbeite, sollten
|
29
|
-
dieses Gems in den mitgelieferten
|
28
|
+
Da ich mit Test-Driven-Development (TDD) arbeite, sollten für jede Funktion
|
29
|
+
dieses Gems in den mitgelieferten Testfällen ein Beispiel zur Verwendung
|
30
30
|
enthalten sein.
|
31
31
|
|
32
32
|
|
@@ -70,15 +70,20 @@ puts "Entfernung: " + ludwigshafen.distance(berlin).to_s + " km"
|
|
70
70
|
# zur Kontrolle, der umgekehrte Weg muss (zumindest in diesem Universum) gleich lang sein
|
71
71
|
|
72
72
|
puts "Entfernung: " + berlin.distance(ludwigshafen).to_s + " km"
|
73
|
+
|
74
|
+
# Eine Distanz kann auch zu einer definierten Koordinate berechnet werden
|
75
|
+
|
76
|
+
|
77
|
+
puts "Entfernung: " + berlin.distance_lat_lon(50.0, 10.0).to_s + " km"
|
73
78
|
</code>
|
74
79
|
</pre>
|
75
80
|
|
76
|
-
Dies ist noch eine ziemlich
|
81
|
+
Dies ist noch eine ziemlich rudimentäre Form dieses Gems - weitere Funktionen
|
77
82
|
werden noch eingebaut.
|
78
83
|
|
79
|
-
Die Methode Changelog#changelogs gibt ein Array mit den
|
80
|
-
die beschreiben, was an der Datenbank zuletzt
|
81
|
-
methode im eigenlichen Sinne, kann aber ganz
|
84
|
+
Die Methode Changelog#changelogs gibt ein Array mit den Datensätzen zurück,
|
85
|
+
die beschreiben, was an der Datenbank zuletzt geändert wurde. Keine Anwendungs
|
86
|
+
methode im eigenlichen Sinne, kann aber ganz nützlich sein, wenn man wissen will, welcher Version verwendet wird, ob bestimmte Aenderungen auch in der Version der Datenbank, die man selbst abfragt, schon eingeflossen sind.
|
82
87
|
|
83
88
|
Was wollt ihr unbedingt noch haben - schreibt mir an die untenstehende eMail-Adresse!
|
84
89
|
|
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.
|
7
|
-
date: 2007-07-
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2007-07-28 00:00:00 +02:00
|
8
8
|
summary: access to opengeodb Database
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- Rakefile
|
37
37
|
- examples/example1.rb
|
38
38
|
- examples/example2.rb
|
39
|
+
- examples/where_is_the_geocache.rb
|
39
40
|
- lib/ruby-opengeodb.rb
|
40
41
|
- lib/ruby-opengeodb/version.rb
|
41
42
|
- lib/ruby-opengeodb/location.rb
|