terragona 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/lib/terragona/concave_hull.rb +19 -13
- data/lib/terragona/stats.rb +25 -0
- data/lib/terragona/version.rb +1 -1
- data/terragona.gemspec +2 -2
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8960cea1763219e0706e07cd4f972d62c57a87ff
|
4
|
+
data.tar.gz: 0377f3156e42d39426927b353aaf68bade666536
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a841fbf0d6f63e54492ed030388d85075a5e92199cf44a3443e89c39db13b4d8b076ae478fff06d6e0fcbdfd4681710006e66953794e4127729ca360a69ccbec
|
7
|
+
data.tar.gz: 523101fea46f423189c81b62cabc80ef3fd46ba30a414547542b662c909e283cf733450db0494f3d7845eef549e4aa70b677859b9ced0cd7dc8123231923ad05
|
data/README.md
CHANGED
@@ -153,6 +153,9 @@ allow_holes Can the polygons have holes? Default: false.
|
|
153
153
|
max_distance_ratio Points distant more than this ratio times from the average
|
154
154
|
distance between points are not considered. Default: 1.6.
|
155
155
|
minimal_polygon_points Minimal number of points to build a polygon.
|
156
|
+
force_homogeneity Uses max_distance_ratio also to compare with the avg distance
|
157
|
+
between points of all the other polygons of the same family level.
|
158
|
+
This helps to discard outliers. The result are homogeneous polygons.
|
156
159
|
dont_create_polygons (boolean) Default: false.
|
157
160
|
table Table where polygons are saved. This option is overriden
|
158
161
|
by args of create_polygons_family method.
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'geokit'
|
2
2
|
require 'sequel'
|
3
|
+
require_relative 'stats'
|
3
4
|
|
4
5
|
module Terragona
|
5
6
|
class ConcaveHull
|
@@ -10,6 +11,7 @@ module Terragona
|
|
10
11
|
@allow_holes = options[:allow_holes]
|
11
12
|
@allow_holes = false if @allow_holes.nil?
|
12
13
|
@max_distance_ratio = options[:max_distance_ratio] || 1.6
|
14
|
+
@force_homogeneity = options[:force_homogeneity]
|
13
15
|
|
14
16
|
db_options={
|
15
17
|
:database=> options[:db_name],
|
@@ -21,7 +23,7 @@ module Terragona
|
|
21
23
|
}
|
22
24
|
|
23
25
|
@db = Sequel.postgres(db_options)
|
24
|
-
|
26
|
+
@all_means = []
|
25
27
|
create_table
|
26
28
|
end
|
27
29
|
|
@@ -45,10 +47,11 @@ module Terragona
|
|
45
47
|
end
|
46
48
|
|
47
49
|
private
|
50
|
+
|
48
51
|
def create_table
|
49
52
|
@db << "DROP TABLE IF EXISTS #{@table};"
|
50
53
|
@db << "CREATE TABLE #{@table} (id BIGINT PRIMARY KEY, name TEXT, count INT);"
|
51
|
-
@db << "SELECT AddGeometryColumn('#{@table}', 'geometry'
|
54
|
+
@db << "SELECT AddGeometryColumn('#{@table}', 'geometry', #{@projection}, 'POLYGON', 2);"
|
52
55
|
end
|
53
56
|
|
54
57
|
def create_concave_hull(query, tags, count, id)
|
@@ -60,20 +63,27 @@ module Terragona
|
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
63
|
-
def filter_points_by_distance(points)
|
66
|
+
def filter_points_by_distance(points)
|
64
67
|
random_points = points.count > 200 ? (0..200).map {|e|
|
65
68
|
points[rand(points.count)]
|
66
69
|
}.uniq : points
|
67
|
-
|
70
|
+
|
68
71
|
distances = points.map {|p0|
|
69
72
|
sum = random_points.map {|pf|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
+
if p0[:y] != pf[:y] and p0[:x] != pf[:x]
|
74
|
+
Geokit::LatLng.new(p0[:y],p0[:x]).distance_to(Geokit::LatLng.new(pf[:y],pf[:x]))
|
75
|
+
end
|
76
|
+
}.compact
|
77
|
+
{:y=>p0[:y],:x=>p0[:x],:mean=> sum.mean}
|
73
78
|
}
|
74
|
-
|
79
|
+
|
80
|
+
mean = distances.map{|d| d[:mean]}.compact.mean
|
81
|
+
@all_means.push mean
|
82
|
+
mean_of_means = @force_homogeneity ? @all_means.compact.mean : nil
|
83
|
+
|
75
84
|
distances.map {|d|
|
76
|
-
|
85
|
+
next unless d[:mean]
|
86
|
+
d if (d[:mean]/[mean,mean_of_means].compact.min) < @max_distance_ratio
|
77
87
|
}.compact
|
78
88
|
end
|
79
89
|
|
@@ -83,10 +93,6 @@ module Terragona
|
|
83
93
|
}.join(',')
|
84
94
|
end
|
85
95
|
|
86
|
-
def average(arr)
|
87
|
-
arr.inject{ |sum, el| sum + el }.to_f / arr.size
|
88
|
-
end
|
89
|
-
|
90
96
|
def clean_str(str)
|
91
97
|
str.to_s.gsub("'",' ')
|
92
98
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Taken from:
|
2
|
+
# http://stackoverflow.com/questions/7749568/how-can-i-do-standard-deviation-in-ruby
|
3
|
+
|
4
|
+
module Enumerable
|
5
|
+
|
6
|
+
def sum
|
7
|
+
return self.inject(0){|accum, i| accum + i }
|
8
|
+
end
|
9
|
+
|
10
|
+
def mean
|
11
|
+
return if self.empty?
|
12
|
+
return self.sum / self.length.to_f
|
13
|
+
end
|
14
|
+
|
15
|
+
def sample_variance
|
16
|
+
m = self.mean
|
17
|
+
sum = self.inject(0){|accum, i| accum + (i - m) ** 2 }
|
18
|
+
return sum / (self.length - 1).to_f
|
19
|
+
end
|
20
|
+
|
21
|
+
def standard_deviation
|
22
|
+
return Math.sqrt(self.sample_variance)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/lib/terragona/version.rb
CHANGED
data/terragona.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Terragona::VERSION
|
9
9
|
spec.authors = ["Bruno Salerno"]
|
10
10
|
spec.email = ["br.salerno@gmail.com"]
|
11
|
-
spec.description = %q{Create polygons
|
12
|
-
spec.summary = %q{Use API or
|
11
|
+
spec.description = %q{Create polygons from geonames places and other sources}
|
12
|
+
spec.summary = %q{Use API, Dumps or a CSV file as input, draw polygons, and store them in a Postgres/Postgis db}
|
13
13
|
spec.homepage = "https://github.com/BrunoSalerno/terragona"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terragona
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno Salerno
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -136,7 +136,7 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
-
description: Create polygons
|
139
|
+
description: Create polygons from geonames places and other sources
|
140
140
|
email:
|
141
141
|
- br.salerno@gmail.com
|
142
142
|
executables: []
|
@@ -153,6 +153,7 @@ files:
|
|
153
153
|
- lib/terragona/concave_hull.rb
|
154
154
|
- lib/terragona/generic.rb
|
155
155
|
- lib/terragona/geonames.rb
|
156
|
+
- lib/terragona/stats.rb
|
156
157
|
- lib/terragona/version.rb
|
157
158
|
- terragona.gemspec
|
158
159
|
homepage: https://github.com/BrunoSalerno/terragona
|
@@ -178,6 +179,6 @@ rubyforge_project:
|
|
178
179
|
rubygems_version: 2.2.2
|
179
180
|
signing_key:
|
180
181
|
specification_version: 4
|
181
|
-
summary: Use API or
|
182
|
-
db
|
182
|
+
summary: Use API, Dumps or a CSV file as input, draw polygons, and store them in a
|
183
|
+
Postgres/Postgis db
|
183
184
|
test_files: []
|