diff --git a/.gitignore b/.gitignore
index 6bac3107..0b7f58d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,3 +38,4 @@ app/assets/node_modules
public/lib
node_modules
todo.txt
+.sass-cache
diff --git a/APACHE-REVERSE-PROXY-EXAMPLE b/APACHE-REVERSE-PROXY-EXAMPLE
deleted file mode 100644
index bacef936..00000000
--- a/APACHE-REVERSE-PROXY-EXAMPLE
+++ /dev/null
@@ -1,11 +0,0 @@
-
- DocumentRoot "/home/warren/sites/cartagen.org"
- ServerName cartagen.org
- ProxyPass / http://127.0.0.1:3003/
- ProxyPassReverse / http://127.0.0.1:3003/
- ProxyPass /api/0.6/geohash/ http://127.0.0.1:3003/api/0.6/geohash/
- ProxyPassReverse /api/0.6/geohash/ http://127.0.0.1:3003/api/0.6/geohash/
- ProxyPass /api/ http://127.0.0.1:3005/api/0.6/
- ProxyPassReverse /api/ http://127.0.0.1:3005/api/0.6/
-
-
diff --git a/Gemfile b/Gemfile
index 8e86088f..a085f9b4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -3,6 +3,8 @@ source "https://rubygems.org"
ruby "2.1.2"
gem "rails", "~>3.2"
+gem "will_paginate", "3.0.7"
+
# dependencies
group :dependencies do
gem "mysql", "2.9.1"
@@ -10,12 +12,11 @@ group :dependencies do
gem "geokit-rails", "1.1.4"
gem "image_science", "1.2.6"
gem "recaptcha", "0.3.6", :require => "recaptcha/rails"
- gem "will_paginate", "3.0.7"
gem "oa-openid", "0.3.2"
gem "ruby-openid", "~>2.5"
gem 'open_id_authentication'
gem "RubyInline"
- gem "paperclip", "4.2.0"
+ gem "paperclip", "~>4.2.0"
# if you use amazon s3 for warpable image storage
gem 'aws-sdk', '~> 1.5.7'
diff --git a/Gemfile.lock b/Gemfile.lock
index 47c54c40..007ace47 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -32,7 +32,7 @@ GEM
i18n (~> 0.6, >= 0.6.4)
multi_json (~> 1.0)
arel (3.0.3)
- autoprefixer-rails (4.0.2.1)
+ autoprefixer-rails (4.0.2.2)
execjs
aws-sdk (1.5.8)
httparty (~> 0.7)
@@ -55,7 +55,7 @@ GEM
httparty (0.13.3)
json (~> 1.8)
multi_xml (>= 0.5.2)
- i18n (0.6.11)
+ i18n (0.7.0)
image_science (1.2.6)
RubyInline (~> 3.9)
journey (1.0.4)
@@ -69,7 +69,7 @@ GEM
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.25.1)
- mini_portile (0.6.1)
+ mini_portile (0.6.2)
multi_json (1.10.1)
multi_xml (0.5.5)
mysql (2.9.1)
@@ -83,16 +83,12 @@ GEM
ruby-openid-apps-discovery (~> 1.2.0)
open_id_authentication (1.2.0)
rack-openid (~> 1.3)
-<<<<<<< HEAD
- paperclip (4.2.0)
-=======
paperclip (4.2.1)
->>>>>>> checking in Gemfile.lock
activemodel (>= 3.0.0)
activesupport (>= 3.0.0)
cocaine (~> 0.5.3)
mime-types
- passenger (4.0.56)
+ passenger (4.0.57)
daemon_controller (>= 1.2.0)
rack
rake (>= 0.8.1)
@@ -123,208 +119,31 @@ GEM
rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0)
rake (10.4.2)
-<<<<<<< HEAD
rdiscount (2.1.7.1)
rdoc (3.12.2)
json (~> 1.4)
recaptcha (0.3.6)
ref (1.0.5)
-=======
- rdoc (3.12.2)
- json (~> 1.4)
- recaptcha (0.3.6)
->>>>>>> checking in Gemfile.lock
right_aws (3.1.0)
right_http_connection (>= 1.2.5)
right_http_connection (1.5.0)
ruby-openid (2.6.0)
ruby-openid-apps-discovery (1.2.0)
ruby-openid (>= 2.1.7)
-<<<<<<< HEAD
sass (3.4.9)
-=======
->>>>>>> checking in Gemfile.lock
sprockets (2.2.3)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sqlite3 (1.3.10)
-<<<<<<< HEAD
therubyracer (0.12.1)
libv8 (~> 3.16.14.0)
ref
-=======
->>>>>>> checking in Gemfile.lock
thor (0.19.1)
tilt (1.4.1)
treetop (1.4.15)
polyglot
-<<<<<<< HEAD
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
- polyglot (>= 0.3.1)
-=======
->>>>>>> checking in Gemfile.lock
polyglot (>= 0.3.1)
tzinfo (0.3.42)
uuidtools (2.1.5)
@@ -335,7 +154,6 @@ PLATFORMS
DEPENDENCIES
RubyInline
-<<<<<<< HEAD
autoprefixer-rails
aws-sdk (~> 1.5.7)
geokit-rails (= 1.1.4)
@@ -345,7 +163,7 @@ DEPENDENCIES
mysql2
oa-openid (= 0.3.2)
open_id_authentication
- paperclip (= 4.2.0)
+ paperclip (~> 4.2.0)
passenger
rails (~> 3.2)
rdiscount (= 2.1.7.1)
@@ -357,21 +175,3 @@ DEPENDENCIES
sqlite3
therubyracer
will_paginate (= 3.0.7)
-=======
- aws-sdk (~> 1.5.7)
- geokit-rails
- httparty (= 0.11.0)
- image_science (= 1.2.6)
- mysql
- mysql2
- oa-openid (= 0.3.2)
- open_id_authentication
- paperclip
- passenger
- rails (~> 3.2)
- recaptcha
- right_aws
- ruby-openid
- sqlite3
- will_paginate
->>>>>>> checking in Gemfile.lock
diff --git a/public/javascripts/knitter.js b/app/assets/javascripts/knitter.js
similarity index 100%
rename from public/javascripts/knitter.js
rename to app/assets/javascripts/knitter.js
diff --git a/app/assets/javascripts/maps.js b/app/assets/javascripts/maps.js
index 1d9a04a1..e19b2a1d 100644
--- a/app/assets/javascripts/maps.js
+++ b/app/assets/javascripts/maps.js
@@ -9,4 +9,4 @@ jQuery(document).ready(function($) {
navLinks = $(".sidebar .navbar-nav.fullscreen-only").find("li");
sidebarNav.find(".dropdown-menu").append(navLinks);
-});
\ No newline at end of file
+});
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
index e0446896..07cf1c8a 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.css
@@ -11,7 +11,7 @@
*= require_self
*= require_tree .
- *= require bootstrap/dist/css/bootstrap.css
+ *= require bootstrap/dist/css/bootstrap.min.css
*= require leaflet/dist/leaflet.css
*= require leaflet-draw/dist/leaflet.draw.css
*= require leaflet-illustrate/dist/Leaflet.Illustrate.css
diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb
index 6ee9d31a..416f37c8 100644
--- a/app/controllers/maps_controller.rb
+++ b/app/controllers/maps_controller.rb
@@ -1,5 +1,4 @@
require 'open3'
-require 'will_paginate'
class MapsController < ApplicationController
protect_from_forgery :except => [:export]
@@ -9,10 +8,7 @@ class MapsController < ApplicationController
layout 'knitter2'
def index
- @maps = Map.find :all, :order => 'updated_at DESC', :joins => :warpables, :limit => 24, :group => "maps.id"
- @unpaginated = true
- @maps = @maps.paginate :page => params[:page], :per_page => 24
-
+ @maps = Map.page(params[:page]).per_page(24).where(:archived => false,:password => '').order('updated_at DESC')
render :layout => 'application2'
end
@@ -31,13 +27,11 @@ class MapsController < ApplicationController
def show
@map = Map.find params[:id]
-
@map.zoom = 12
end
def edit
@map = Map.find params[:id]
-
@map.zoom = 12
end
diff --git a/app/models/annotation.rb b/app/models/annotation.rb
index 9cd2c096..e6009990 100644
--- a/app/models/annotation.rb
+++ b/app/models/annotation.rb
@@ -10,17 +10,17 @@ class Annotation < ActiveRecord::Base
end
def geometry_type
- case self.annotation_type
- when 'polyline':
- geometry_type = 'LineString'
- when 'polygon':
- geometry_type = 'Polygon'
- when 'rectangle':
- geometry_type = 'Polygon'
- else
- geometry_type = 'Point'
- end
+ case self.annotation_type
+ when 'polyline':
+ geometry_type = 'LineString'
+ when 'polygon':
+ geometry_type = 'Polygon'
+ when 'rectangle':
+ geometry_type = 'Polygon'
+ else
+ geometry_type = 'Point'
+ end
- return geometry_type
+ return geometry_type
end
-end
\ No newline at end of file
+end
diff --git a/app/models/warpable.rb b/app/models/warpable.rb
index 6711d4dc..3cda569d 100755
--- a/app/models/warpable.rb
+++ b/app/models/warpable.rb
@@ -342,6 +342,7 @@ puts self.image.url
private
+ # adjust filename behavior of Paperclip after migrating from attachment_fu
Paperclip.interpolates :custom_filename do |attachment, style|
if style == :original
custom_filename = basename(attachment,style) # generate hash path here
diff --git a/app/views/maps/index.html.erb b/app/views/maps/index.html.erb
index 04401936..2bbbd188 100644
--- a/app/views/maps/index.html.erb
+++ b/app/views/maps/index.html.erb
@@ -25,7 +25,7 @@
<% if !map.private && map.warpables.length > 0 %>
-
+
<% end %>
<%= link_to map.name.capitalize, map %>
diff --git a/bower.json b/bower.json
index 5e899109..7590d55a 100644
--- a/bower.json
+++ b/bower.json
@@ -1,12 +1,15 @@
{
"name": "MapKnitter",
- "version": "0.1.0",
+ "version": "0.1.1",
"dependencies": {
"fontawesome": "~4.2.0",
- "bootstrap-css": "~2.3",
+ "bootstrap": "~3.2.0",
"jquery": "~1.11",
"jquery-ui": "~1.11",
+ "jquery-ujs": "~1.0.3",
"openlayers": "release-2.13.1",
+ "blueimp-file-upload": "blueimp/jQuery-File-Upload#~9.8.1",
+ "blueimp-tmpl": "2.5.4",
"leaflet": "0.7.3",
"leaflet-google": "https://raw.githubusercontent.com/shramov/leaflet-plugins/master/layer/tile/Google.js",
"leaflet-draw": "Leaflet/Leaflet.draw#0.2.3",
@@ -17,6 +20,7 @@
"modalbox": "okonet/modalbox",
"cartagen": "jywarren/cartagen",
"scriptaculous": "http://script.aculo.us/dist/scriptaculous-js-1.9.0.zip",
- "prototype": "sstephenson/prototype#1.7.2"
+ "prototype": "sstephenson/prototype#1.7.2",
+ "junction": "theleagueof/junction"
}
}
diff --git a/config/application.rb b/config/application.rb
index c54e0fbd..08ec3d83 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -59,5 +59,6 @@ module Mapknitter
# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'
+ config.assets.paths << Rails.root.join("public","lib")
end
end
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
new file mode 100644
index 00000000..26931110
--- /dev/null
+++ b/config/initializers/paperclip.rb
@@ -0,0 +1,2 @@
+require "paperclip/railtie"
+Paperclip::Railtie.insert
diff --git a/config/routes.rb b/config/routes.rb
index 531932eb..6e132ca8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -95,7 +95,7 @@ Mapknitter::Application.routes.draw do
# You can have the root of your site routed with 'root'
# just remember to delete public/index.html.
- root :to => 'map#index'
+ root :to => 'maps#index'
# See how all your routes lay out with 'rake routes'
diff --git a/db/migrate/20141103164503_change_warpable_columns.rb b/db/migrate/20141103164503_change_warpable_columns.rb
index c8d372ce..aa22ccff 100644
--- a/db/migrate/20141103164503_change_warpable_columns.rb
+++ b/db/migrate/20141103164503_change_warpable_columns.rb
@@ -1,6 +1,5 @@
class ChangeWarpableColumns < ActiveRecord::Migration
def up
-<<<<<<< HEAD
rename_column(:warpables, :filename, :image_file_name)
rename_column(:warpables, :content_type, :image_content_type)
rename_column(:warpables, :size, :image_file_size)
@@ -10,16 +9,5 @@ class ChangeWarpableColumns < ActiveRecord::Migration
rename_column(:warpables, :image_file_name, :filename)
rename_column(:warpables, :image_content_type, :content_type)
rename_column(:warpables, :image_file_size, :size)
-=======
- rename_column(:warpables, :photo_file_name, :filename)
- rename_column(:warpables, :photo_content_type, :content_type)
- rename_column(:warpables, :photo_file_size, :size)
- end
-
- def down
- rename_column(:warpables, :filename, :photo_file_name)
- rename_column(:warpables, :content_type, :photo_content_type)
- rename_column(:warpables, :size, :photo_file_size)
->>>>>>> much of Rails 3.2 upgrade
end
end
diff --git a/lib/gdal.rb b/lib/gdal.rb
index f81217dc..5ace1607 100755
--- a/lib/gdal.rb
+++ b/lib/gdal.rb
@@ -16,8 +16,4 @@ class Gdal
end
end
-# def self.gdal_merge(args)
-# self.raw()
-# end
-
end
diff --git a/lib/ogr2osm/SimpleXMLWriter.py b/lib/ogr2osm/SimpleXMLWriter.py
deleted file mode 100644
index af3023f4..00000000
--- a/lib/ogr2osm/SimpleXMLWriter.py
+++ /dev/null
@@ -1,279 +0,0 @@
-#
-# SimpleXMLWriter
-# $Id: SimpleXMLWriter.py 2312 2005-03-02 18:13:39Z fredrik $
-#
-# a simple XML writer
-#
-# history:
-# 2001-12-28 fl created
-# 2002-11-25 fl fixed attribute encoding
-# 2002-12-02 fl minor fixes for 1.5.2
-# 2004-06-17 fl added pythondoc markup
-# 2004-07-23 fl added flush method (from Jay Graves)
-# 2004-10-03 fl added declaration method
-#
-# Copyright (c) 2001-2004 by Fredrik Lundh
-#
-# fredrik@pythonware.com
-# http://www.pythonware.com
-#
-# --------------------------------------------------------------------
-# The SimpleXMLWriter module is
-#
-# Copyright (c) 2001-2004 by Fredrik Lundh
-#
-# By obtaining, using, and/or copying this software and/or its
-# associated documentation, you agree that you have read, understood,
-# and will comply with the following terms and conditions:
-#
-# Permission to use, copy, modify, and distribute this software and
-# its associated documentation for any purpose and without fee is
-# hereby granted, provided that the above copyright notice appears in
-# all copies, and that both that copyright notice and this permission
-# notice appear in supporting documentation, and that the name of
-# Secret Labs AB or the author not be used in advertising or publicity
-# pertaining to distribution of the software without specific, written
-# prior permission.
-#
-# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
-# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
-# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
-# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
-# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-# OF THIS SOFTWARE.
-# --------------------------------------------------------------------
-
-##
-# Tools to write XML files, without having to deal with encoding
-# issues, well-formedness, etc.
-#
-# The current version does not provide built-in support for
-# namespaces. To create files using namespaces, you have to provide
-# "xmlns" attributes and explicitly add prefixes to tags and
-# attributes.
-#
-#
Patterns
-#
-# The following example generates a small XHTML document.
-#
-#
-# from elementtree.SimpleXMLWriter import XMLWriter
-# import sys
-#
-# w = XMLWriter(sys.stdout)
-#
-# html = w.start("html")
-#
-# w.start("head")
-# w.element("title", "my document")
-# w.element("meta", name="generator", value="my application 1.0")
-# w.end()
-#
-# w.start("body")
-# w.element("h1", "this is a heading")
-# w.element("p", "this is a paragraph")
-#
-# w.start("p")
-# w.data("this is ")
-# w.element("b", "bold")
-# w.data(" and ")
-# w.element("i", "italic")
-# w.data(".")
-# w.end("p")
-#
-# w.close(html)
-#
-##
-
-import re, sys, string
-
-try:
- unicode("")
-except NameError:
- def encode(s, encoding):
- # 1.5.2: application must use the right encoding
- return s
- _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2
-else:
- def encode(s, encoding):
- return s.encode(encoding)
- _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"'))
-
-def encode_entity(text, pattern=_escape):
- # map reserved and non-ascii characters to numerical entities
- def escape_entities(m):
- out = []
- for char in m.group():
- out.append("%d;" % ord(char))
- return string.join(out, "")
- return encode(pattern.sub(escape_entities, text), "ascii")
-
-del _escape
-
-#
-# the following functions assume an ascii-compatible encoding
-# (or "utf-16")
-
-def escape_cdata(s, encoding=None, replace=string.replace):
- s = replace(s, "&", "&")
- s = replace(s, "<", "<")
- s = replace(s, ">", ">")
- if encoding:
- try:
- return encode(s, encoding)
- except UnicodeError:
- return encode_entity(s)
- return s
-
-def escape_attrib(s, encoding=None, replace=string.replace):
- s = replace(s, "&", "&")
- s = replace(s, "'", "'")
- s = replace(s, "\"", """)
- s = replace(s, "<", "<")
- s = replace(s, ">", ">")
- if encoding:
- try:
- return encode(s, encoding)
- except UnicodeError:
- return encode_entity(s)
- return s
-
-##
-# XML writer class.
-#
-# @param file A file or file-like object. This object must implement
-# a
write method that takes an 8-bit string.
-# @param encoding Optional encoding.
-
-class XMLWriter:
-
- def __init__(self, file, encoding="us-ascii"):
- if not hasattr(file, "write"):
- file = open(file, "w")
- self.__write = file.write
- if hasattr(file, "flush"):
- self.flush = file.flush
- self.__open = 0 # true if start tag is open
- self.__tags = []
- self.__data = []
- self.__encoding = encoding
-
- def __flush(self):
- # flush internal buffers
- if self.__open:
- self.__write(">")
- self.__open = 0
- if self.__data:
- data = string.join(self.__data, "")
- self.__write(escape_cdata(data, self.__encoding))
- self.__data = []
-
- ##
- # Writes an XML declaration.
-
- def declaration(self):
- encoding = self.__encoding
- if encoding == "us-ascii" or encoding == "utf-8":
- self.__write("\n")
- else:
- self.__write("\n" % encoding)
-
- ##
- # Opens a new element. Attributes can be given as keyword
- # arguments, or as a string/string dictionary. You can pass in
- # 8-bit strings or Unicode strings; the former are assumed to use
- # the encoding passed to the constructor. The method returns an
- # opaque identifier that can be passed to the
close method,
- # to close all open elements up to and including this one.
- #
- # @param tag Element tag.
- # @param attrib Attribute dictionary. Alternatively, attributes
- # can be given as keyword arguments.
- # @return An element identifier.
-
- def start(self, tag, attrib={}, **extra):
- self.__flush()
- tag = escape_cdata(tag, self.__encoding)
- self.__data = []
- self.__tags.append(tag)
- self.__write("<%s" % tag)
- if attrib or extra:
- attrib = attrib.copy()
- attrib.update(extra)
- attrib = attrib.items()
- attrib.sort()
- for k, v in attrib:
- k = escape_cdata(k, self.__encoding)
- v = escape_attrib(v, self.__encoding)
- self.__write(" %s=\"%s\"" % (k, v))
- self.__open = 1
- return len(self.__tags)-1
-
- ##
- # Adds a comment to the output stream.
- #
- # @param comment Comment text, as an 8-bit string or Unicode string.
-
- def comment(self, comment):
- self.__flush()
- self.__write("\n" % escape_cdata(comment, self.__encoding))
-
- ##
- # Adds character data to the output stream.
- #
- # @param text Character data, as an 8-bit string or Unicode string.
-
- def data(self, text):
- self.__data.append(text)
-
- ##
- # Closes the current element (opened by the most recent call to
- #
start).
- #
- # @param tag Element tag. If given, the tag must match the start
- # tag. If omitted, the current element is closed.
-
- def end(self, tag=None):
- if tag:
- assert self.__tags, "unbalanced end(%s)" % tag
- assert escape_cdata(tag, self.__encoding) == self.__tags[-1],\
- "expected end(%s), got %s" % (self.__tags[-1], tag)
- else:
- assert self.__tags, "unbalanced end()"
- tag = self.__tags.pop()
- if self.__data:
- self.__flush()
- elif self.__open:
- self.__open = 0
- self.__write(" />")
- return
- self.__write("%s>" % tag)
-
- ##
- # Closes open elements, up to (and including) the element identified
- # by the given identifier.
- #
- # @param id Element identifier, as returned by the
start method.
-
- def close(self, id):
- while len(self.__tags) > id:
- self.end()
-
- ##
- # Adds an entire element. This is the same as calling
start,
- #
data, and
end in sequence. The
text argument
- # can be omitted.
-
- def element(self, tag, text=None, attrib={}, **extra):
- apply(self.start, (tag, attrib), extra)
- if text:
- self.data(text)
- self.end()
-
- ##
- # Flushes the output stream.
-
- def flush(self):
- pass # replaced by the constructor
diff --git a/lib/ogr2osm/SimpleXMLWriter.pyc b/lib/ogr2osm/SimpleXMLWriter.pyc
deleted file mode 100644
index fdbf1bcd..00000000
Binary files a/lib/ogr2osm/SimpleXMLWriter.pyc and /dev/null differ
diff --git a/lib/ogr2osm/ogr2osm.py b/lib/ogr2osm/ogr2osm.py
deleted file mode 100755
index b8e2762a..00000000
--- a/lib/ogr2osm/ogr2osm.py
+++ /dev/null
@@ -1,769 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-""" ogr2osm beta
-
- (c) Iván Sánchez Ortega, 2009
-
-
-
- This piece of crap^H^H^H^Hsoftware is supposed to take just about any vector file
- as an input thanks to the magic of the OGR libraries, and then output a pretty OSM XML
- file with that data.
-
- The cool part is that it will detect way segments shared between several ways, so
- it will build relations outof thin air. This simplifies the structure of boundaries, for
- example.
-
- It is also able to translate attributes to tags, though there is only one such translation
- scheme by now. In order to translate your own datasets, you should have some basic
- understanding of python programming. See the files in the translation/ directory.
-
- An outstanding issue is that elevation in 2.5D features (that can be generated by
- reprojecting) is ignored completely.
-
- Usage: specify a filename to be converted (its extension will be changed to .osm), and the
- the projection the source data is in. You can specify the source projection by using either
- an EPSG code or a Proj.4 string.
-
- If the projection is not specified, ogr2osm will try to fetch it from the source data. If
- there is no projection information in the source data, this will assume EPSG:4326 (WGS84
- latitude-longitude).
-
- python ogr2osm.py [options] [filename]
-
- Options:
- -e, --epsg=... EPSG code, forcing the source data projection
- -p, --proj4=... PROJ4 string, forcing the source data projection
- -v, --verbose Shows some seemingly random characters dancing in the screen
- for every feature that's being worked on.
- -h, --help Show this message
- -d, --debug-tags Outputs the tags for every feature parsed
- -a, --attribute-stats Outputs a summary of the different tags / attributes encountered
- -t, --translation Select the attribute-tags translation method.
- See the translations/ diredtory for valid values.
-
- (-e and -p are mutually exclusive. If both are specified, only the last one will be
- taken into account)
-
- For example, if the shapefile foobar.shp has projection EPSG:23030, do:
-
- python ogr2osm.py foobar.shp -e 23030
-
- This will do an in-the-fly reprojection from EPSG:23030 to EPSG:4326, and write a file
- called "foobar.osm"
-
-
-#####################################################################################
-# "THE BEER-WARE LICENSE": #
-# wrote this file. As long as you retain this notice you #
-# can do whatever you want with this stuff. If we meet some day, and you think #
-# this stuff is worth it, you can buy me a beer in return. #
-#####################################################################################
-"""
-
-
-import sys
-import os
-import getopt
-from SimpleXMLWriter import XMLWriter
-
-try:
- from osgeo import ogr
-except:
- import ogr
-
-try:
- from osgeo import osr
-except:
- import osr
-
-# Some needed constants
-from ogr import wkbPoint
-from ogr import wkbLineString
-from ogr import wkbPolygon
-from ogr import wkbMultiPoint
-from ogr import wkbMultiLineString
-from ogr import wkbMultiPolygon
-from ogr import wkbGeometryCollection
-
-from ogr import wkbUnknown
-from ogr import wkbNone
-
-from ogr import wkbPoint25D
-from ogr import wkbLineString25D
-from ogr import wkbPolygon25D
-from ogr import wkbMultiPoint25D
-from ogr import wkbMultiLineString25D
-from ogr import wkbMultiPolygon25D
-from ogr import wkbGeometryCollection25D
-
-
-
-# Default options
-sourceEPSG = 4326
-sourceProj4 = None
-detectProjection = True
-useEPSG = False
-useProj4 = False
-showProgress = False
-debugTags = False
-attributeStats = False
-translationMethod = None
-
-# Fetch command line parameters: file and source projection
-try:
- (opts, args) = getopt.getopt(sys.argv[1:], "e:p:hvdt:a", ["epsg","proj4","help","verbose","debug-tags","attribute-stats","translation"])
-except getopt.GetoptError:
- print __doc__
- sys.exit(2)
-for opt, arg in opts:
- if opt in ("-h", "--help"):
- print __doc__
- sys.exit()
- elif opt in ("-p", "--proj4"):
- sourceProj4 = arg
- useProj4 = True
- useEPSG = False
- detectProjection = False
- elif opt in ("-e", "--epsg"):
- try:
- sourceEPSG = int(arg)
- except:
- print "Error: EPSG code must be numeric (e.g. '4326' instead of 'epsg:4326')"
- sys.exit(1)
- detectProjection = False
- useEPSG = True
- useProj4 = False
- elif opt in ("-v", "--verbose"):
- showProgress=True
- elif opt in ("-d", "--debug-tags"):
- debugTags=True
- elif opt in ("-a", "--attribute-stats"):
- attributeStats=True
- attributeStatsTable = {}
- elif opt in ("-t", "--translation"):
- translationMethod = arg
- else:
- print "Unknown option " + opt
-
-print (opts,args)
-file = args[0]
-fileExtension = file.split('.')[-1]
-
-
-# FIXME: really complete this table
-if fileExtension == 'shp':
- driver = ogr.GetDriverByName('ESRI Shapefile');
-elif fileExtension == 'gpx':
- driver = ogr.GetDriverByName('GPX');
-elif fileExtension == 'dgn':
- driver = ogr.GetDriverByName('DGN');
-elif fileExtension == 'gml':
- driver = ogr.GetDriverByName('GML');
-elif fileExtension == 'csv':
- driver = ogr.GetDriverByName('CSV');
-elif fileExtension == 'sqlite':
- driver = ogr.GetDriverByName('SQLite');
-elif fileExtension == 'kml':
- driver = ogr.GetDriverByName('KML');
-#elif fileExtension == 'kmz':
- #driver = ogr.GetDriverByName('KML');
-else:
- print "Error: extension " + fileExtension + " is invalid or not implemented yet."
-
-
-# Strip directories from output file name
-slashPosition = file.rfind('/')
-if slashPosition != -1:
- #print slashPosition
- outputFile = file[slashPosition+1:]
- #print outputFile
- #print len(fileExtension)
-else:
- outputFile = file
-
-outputFile = outputFile[: -len(fileExtension) ] + 'osm'
-
-
-# 0 means read-only
-dataSource = driver.Open(file,0);
-
-if dataSource is None:
- print 'Could not open ' + file
- sys.exit(1)
-
-
-print
-print "Preparing to convert file " + file + " (extension is " + fileExtension + ") into " + outputFile
-
-if detectProjection:
- print "Will try to detect projection from source metadata, or fall back to EPSG:4326"
-elif useEPSG:
- print "Will assume that source data is in EPSG:" + str(sourceEPSG)
-elif useProj4:
- print "Will assume that source data has the Proj.4 string: " + sourceProj4
-
-if showProgress:
- print "Verbose mode is on. Get ready to see lots of dots."
-
-if debugTags:
- print "Tag debugging is on. Get ready to see lots of stuff."
-
-
-# Some variables to hold stuff...
-nodeIDsByXY = {}
-nodeTags = {}
-nodeCoords = {}
-nodeRefs = {}
-segmentNodes = {}
-segmentIDByNodes = {}
-segmentRefs = {}
-areaRings = {}
-areaTags = {}
-lineSegments = {}
-lineTags = {}
-
-# nodeIDsByXY holds a node ID, given a set of coordinates (useful for looking for duplicated nodes)
-# nodeTags holds the tag pairs given a node ID
-# nodeCoords holds the coordinates of a given node ID (redundant if nodeIDsByXY is properly iterated through)
-# nodeRefs holds up the IDs of any segment referencing (containing) a given node ID, as a dictionary
-# segmentNodes holds up the node IDs for a given segment ID
-# segmentIDByNodes holds up segment IDs for a given pair of node IDs (useful for looking for duplicated segments)
-# segmentRefs holds up the IDs of any ways or areas referencing (containing) a given segment ID, as a dictionary with segment IDs as keys, and a boolean as value (the bool is a flag indicating whether the segment is an existing segment, but reversed - will probably screw things up with oneway=yes stuff)
-# areaRings holds up the rings, as a list of segments, for a given area ID
-# areaTags holds up the tags for a given area ID
-# lineSegments and lineTags work pretty much as areaRings and areaTags (only that lineSegments is a list, and areaRings is a list of lists)
-
-
-# Stuff needed for locating translation methods
-if translationMethod:
- try:
- sys.path.append(os.getcwd() + "/translations")
- module = __import__(translationMethod)
- translateAttributes = module.translateAttributes
- translateAttributes([])
- except:
- print "Could not load translation method " + translationMethod + ". Check the translations/ directory for valid values."
- sys.exit(-1)
- print "Successfully loaded " + translationMethod + " translation method."
-else:
- # If no function has been defined, perform no translation: just copy everything.
- translateAttributes = lambda(attrs): attrs
-
-
-
-elementIdCounter = -1
-nodeCount = 0
-segmentCount = 0
-lineCount = 0
-areaCount = 0
-segmentJoinCount = 0
-
-
-print
-print "Parsing features"
-
-
-# Some aux stuff for parsing the features into the data arrays
-
-def addNode(x,y,tags = {}):
- "Given x,y, returns the ID of an existing node there, or creates it and returns the new ID. Node will be updated with the optional tags."
- global elementIdCounter, nodeCount, nodeCoords, nodeIDsByXT, nodeTags, nodeCoords
-
- if (x,y) in nodeIDsByXY:
- # Node already exists, merge tags
- #print
- #print "Warning, node already exists"
- nodeID = nodeIDsByXY[(x,y)]
- try:
- nodeTags[nodeID].update(tags)
- except:
- nodeTags[nodeID]=tags
- return nodeID
- else:
- # Allocate a new node
- nodeID = elementIdCounter
- elementIdCounter = elementIdCounter - 1
-
- nodeTags[nodeID]=tags
- nodeIDsByXY[(x,y)] = nodeID
- nodeCoords[nodeID] = (x,y)
- nodeCount = nodeCount +1
- return nodeID
-
-
-def lineStringToSegments(geometry,references):
- "Given a LineString geometry, will create the appropiate segments. It will add the optional tags and will not check for duplicate segments. Needs a line or area ID for updating the segment references. Returns a list of segment IDs."
- global elementIdCounter, segmentCount, segmentNodes, segmentTags, showProgress, nodeRefs, segmentRefs, segmentIDByNodes
-
- result = []
-
- (lastx,lasty,z) = geometry.GetPoint(0)
- lastNodeID = addNode(lastx,lasty)
-
- for k in range(1,geometry.GetPointCount()):
-
- (newx,newy,z) = geometry.GetPoint(k)
- newNodeID = addNode(newx,newy)
-
- if (lastNodeID, newNodeID) in segmentIDByNodes:
- if showProgress: sys.stdout.write(u"-")
- segmentID = segmentIDByNodes[(lastNodeID, newNodeID)]
- reversed = False
- #print
- #print "Duplicated segment"
- elif (newNodeID, lastNodeID) in segmentIDByNodes:
- if showProgress: sys.stdout.write(u"_")
- segmentID = segmentIDByNodes[(newNodeID, lastNodeID)]
- reversed = True
- #print
- #print "Duplicated reverse segment"
- else:
- if showProgress: sys.stdout.write('.')
- segmentID = elementIdCounter
-
- elementIdCounter = elementIdCounter - 1
- segmentCount = segmentCount +1
- segmentNodes[segmentID] = [ lastNodeID, newNodeID ]
- segmentIDByNodes[(lastNodeID, newNodeID)] = segmentID
- reversed = False
-
- try:
- nodeRefs[lastNodeID].update({segmentID:True})
- except:
- nodeRefs[lastNodeID]={segmentID:True}
- try:
- nodeRefs[newNodeID].update({segmentID:True})
- except:
- nodeRefs[newNodeID]={segmentID:True}
-
-
- try:
- segmentRefs[segmentID].update({references:reversed})
- except:
- segmentRefs[segmentID]={references:reversed}
-
- result.append(segmentID)
-
- # FIXME
- segmentRefs
-
- lastNodeID = newNodeID
- return result
-
-
-
-
-
-
-
-# Let's dive into the OGR data source and fetch the features
-
-for i in range(dataSource.GetLayerCount()):
- layer = dataSource.GetLayer(i)
- layer.ResetReading()
-
- spatialRef = None
- if detectProjection:
- spatialRef = layer.GetSpatialRef()
- if spatialRef != None:
- print "Detected projection metadata:"
- print spatialRef
- else:
- print "No projection metadata, falling back to EPSG:4326"
- elif useEPSG:
- spatialRef = osr.SpatialReference()
- spatialRef.ImportFromEPSG(sourceEPSG)
- elif useProj4:
- spatialRef = osr.SpatialReference()
- spatialRef.ImportFromProj4(sourceProj4)
-
-
-
- if spatialRef == None: # No source proj specified yet? Then default to do no reprojection.
- # Some python magic: skip reprojection altogether by using a dummy lamdba funcion. Otherwise, the lambda will be a call to the OGR reprojection stuff.
- reproject = lambda(geometry): None
- else:
- destSpatialRef = osr.SpatialReference()
- destSpatialRef.ImportFromEPSG(4326) # Destionation projection will *always* be EPSG:4326, WGS84 lat-lon
- coordTrans = osr.CoordinateTransformation(spatialRef,destSpatialRef)
- reproject = lambda(geometry): geometry.Transform(coordTrans)
-
-
- featureDefinition = layer.GetLayerDefn()
-
- fieldNames = []
- fieldCount = featureDefinition.GetFieldCount();
-
- for j in range(fieldCount):
- #print featureDefinition.GetFieldDefn(j).GetNameRef()
- fieldNames.append (featureDefinition.GetFieldDefn(j).GetNameRef())
- if attributeStats:
- attributeStatsTable.update({featureDefinition.GetFieldDefn(j).GetNameRef():{} })
-
- print
- print fieldNames
- print "Got layer field definitions"
-
- #print "Feature definition: " + str(featureDefinition);
-
- for j in range(layer.GetFeatureCount()):
- feature = layer.GetNextFeature()
- geometry = feature.GetGeometryRef()
-
- fields = {}
-
- for k in range(fieldCount-1):
- #fields[ fieldNames[k] ] = feature.GetRawFieldRef(k)
- fields[ fieldNames[k] ] = feature.GetFieldAsString(k)
- if attributeStats:
- try:
- attributeStatsTable[ fieldNames[k] ][ feature.GetFieldAsString(k) ] = attributeStatsTable[ fieldNames[k] ][ feature.GetFieldAsString(k) ] + 1
- except:
- attributeStatsTable[ fieldNames[k] ].update({ feature.GetFieldAsString(k) : 1})
-
-
- # Translate attributes into tags, as defined per the selected translation method
- tags = translateAttributes(fields)
-
- if debugTags:
- print
- print tags
-
- # Do the reprojection (or pass if no reprojection is neccesary, see the lambda function definition)
- reproject(geometry)
-
- # Now we got the fields for this feature. Now, let's convert the geometry.
- # Points will get converted into nodes.
- # LineStrings will get converted into a set of ways, each having only two nodes
- # Polygons will be converted into relations
- # Later, we'll fix the topology and simplify the ways. If a relation can be simplified into a way (i.e. only has one member), it will be. Adjacent segments will be merged if they share tags and direction.
-
- # We'll split a geometry into subGeometries or "elementary" geometries: points, linestrings, and polygons. This will take care of OGRMultiLineStrings, OGRGeometryCollections and the like
-
- geometryType = geometry.GetGeometryType()
-
- subGeometries = []
-
- if geometryType == wkbPoint or geometryType == wkbLineString or geometryType == wkbPolygon:
- subGeometries = [geometry]
- elif geometryType == wkbMultiPoint or geometryType == wkbMultiLineString or geometryType == wkbMultiPolygon or geometryType == wkbGeometryCollection:
- if showProgress: sys.stdout.write('M')
- for k in range(geometry.GetGeometryCount()):
- subGeometries.append(geometry.GetGeometryRef(k))
-
- elif geometryType == wkbPoint25D or geometryType == wkbLineString25D or geometryType == wkbPolygon25D:
- if showProgress: sys.stdout.write('z')
- subGeometries = [geometry]
- elif geometryType == wkbMultiPoint25D or geometryType == wkbMultiLineString25D or geometryType == wkbMultiPolygon25D or geometryType == wkbGeometryCollection25D:
- if showProgress: sys.stdout.write('Mz')
- for k in range(geometry.GetGeometryCount()):
- subGeometries.append(geometry.GetGeometryRef(k))
-
- elif geometryType == wkbUnknown:
- print "Geometry type is wkbUnknown, feature will be ignored\n"
- elif geometryType == wkbNone:
- print "Geometry type is wkbNone, feature will be ignored\n"
- else:
- print "Unknown or unimplemented geometry type :" + str(geometryType) + ", feature will be ignored\n"
-
-
- for geometry in subGeometries:
- if geometry.GetDimension() == 0:
- # 0-D = point
- if showProgress: sys.stdout.write(',')
- x = geometry.GetX()
- y = geometry.GetY()
-
- nodeID = addNode(x,y,tags)
- # TODO: tags
-
- elif geometry.GetDimension() == 1:
- # 1-D = linestring
- if showProgress: sys.stdout.write('|')
-
- lineID = elementIdCounter
- elementIdCounter = elementIdCounter - 1
- lineSegments[lineID] = lineStringToSegments(geometry,lineID)
- lineTags[lineID] = tags
- lineCount = lineCount + 1
-
- elif geometry.GetDimension() == 2:
- # FIXME
- # 2-D = area
-
- if showProgress: sys.stdout.write('O')
- areaID = elementIdCounter
- elementIdCounter = elementIdCounter - 1
- rings = []
-
- for k in range(0,geometry.GetGeometryCount()):
- if showProgress: sys.stdout.write('r')
- rings.append(lineStringToSegments(geometry.GetGeometryRef(k), areaID))
-
- areaRings[areaID] = rings
- areaTags[areaID] = tags
- areaCount = areaCount + 1
- # TODO: tags
- # The ring 0 will be the outer hull, any other rings will be inner hulls.
-
-
-
-print
-print "Nodes: " + str(nodeCount)
-print "Way segments: " + str(segmentCount)
-print "Lines: " + str(lineCount)
-print "Areas: " + str(areaCount)
-
-print
-print "Joining segments"
-
-
-# OK, all features should be parsed in the arrays by now
-# Let's start to do some topological magic
-
-# We'll iterate through all the lines and areas, then iterate through all the nodes contained there
-# We'll then fetch all segments referencing that node. If a pair of segments share the same references (i.e. they are part of the same line or area), they will be joined as one and de-referenced from that node. Joining segments mean than the concept of segment changes at this point, becoming linestrings or ways.
-# There are some edge cases in which the algorithm may not prove optimal: if a line (or area ring) crosses itself, then the node will have more than two segments referenced to the line (or area), and does NOT check for the optimal one. As a result, lines that cross themselves may be (incorrectly) split into two and merged via a relation. In other words, the order of the points in a line (or ring) may not be kept if the line crosses itself.
-# The algorithm will not check if the node has been de-referenced: instead, it will check for the first and last node of the segments involved - if the segments have already been joined, the check will fail.
-
-
-
-
-def simplifyNode(nodeID):
- global nodeRefs, segmentNodes, segmentRefs, showProgress, lineSegments, areaRings, segmentJoinCount
- #for (nodeID, segments) in nodeRefs.items():
- segments = nodeRefs[nodeID]
-
- segmentsJoined = 0
- #print
- #print "Node ID: " + str(nodeID)
- #print "Node references to: " + str(segments)
-
- # We have to try all pairs of segments somehow
- for segmentID1 in segments.copy():
- for segmentID2 in segments.copy(): # We'll be changing the references, so make sure we iterate through the original list
- if segmentID1 != segmentID2:
- #print str(segmentID1) + " vs " + str(segmentID2)
- try:
- if segmentNodes[segmentID1][-1] == segmentNodes[segmentID2][0] == nodeID and segmentRefs[segmentID1] == segmentRefs[segmentID2] :
-
- #print "Segment " + str(segmentID1) + ": " + str(segmentNodes[segmentID1])
- #print "Segment " + str(segmentID2) + ": " + str(segmentNodes[segmentID2])
-
- #if showProgress: sys.stdout.write('=')
- segmentNodes[segmentID1].extend( segmentNodes[segmentID2][1:] ) # Voila! Joined!
- for nodeShifted in segmentNodes[segmentID2][1:]: # Replace node references
- #print "deleting reference from node " + str(nodeShifted) + " to segment " + str(segmentID2) + "; updating to " + str(segmentID1)
- del nodeRefs[nodeShifted][segmentID2]
- nodeRefs[nodeShifted].update({segmentID1:True})
-
- # TODO: Check for potential clashes between the references? As in "way X has these segments in the wrong direction". The trivial case for this looks like a topology error, anyway.
- # Anyway, delete all references to the second segment - we're 100% sure that the line or area references the first one 'cause we've checked before joining the segments
- for segmentRef in segmentRefs[segmentID2]:
- try:
- lineSegments[segmentRef].remove(segmentID2)
- except:
- for ring in areaRings[segmentRef]:
- try:
- ring.remove(segmentID2)
- except:
- pass
-
-
- del segmentRefs[segmentID2]
-
- del segmentNodes[segmentID2]
- segmentJoinCount = segmentJoinCount +1
- segmentsJoined = segmentsJoined + 1
- except:
- pass # This is due to the node no longer referencing to a segment because we just de-referenced it in a previous pass of the loop; this will be quite common
-
- # FIXME: if segmentsJoined > 1, this should mark the node for further testing - It's very likely to be a self-intersection.
-
- if showProgress: sys.stdout.write(str(segmentsJoined))
-
-print
-print "Simplifying line segments"
-for line in lineSegments.values():
- #print line
- for segmentID in line: # No need to check the last segment, it could not be simplyfied
- #print segmentID
- #print segmentNodes[segmentID]
- for nodeID in segmentNodes[segmentID]:
- simplifyNode(nodeID)
- #simplifyNode(segmentNodes[segmentID][0]) # last node in segment
-
-print
-print "Simplifying area segments"
-for area in areaRings.values():
- for ring in area:
- for segmentID in ring:
- for nodeID in segmentNodes[segmentID]:
- simplifyNode(nodeID) # last node in segment
-
-
-# That *should* do it... but a second pass through all the nodes will really fix things up. I wonder why some nodes are left out of the previous pass
-print
-print "Simplifying remaining nodes"
-for node in nodeRefs.keys():
- simplifyNode(node)
-
-
-print
-print "Nodes: " + str(nodeCount)
-print "Original way segments: " + str(segmentCount)
-print "Segment join operations: " + str(segmentJoinCount)
-print "Lines: " + str(lineCount)
-print "Areas: " + str(areaCount)
-
-#print nodeRefs
-#print segmentNodes
-#print lineSegments
-#print areaRings
-#print segmentRefs
-
-
-
-print
-print "Generating OSM XML..."
-print "Generating nodes."
-
-
-#w = XMLWriter(sys.stdout)
-w = XMLWriter(open(outputFile,'w'))
-
-w.start("osm", version='0.6', generator='ogr2osm')
-
-# First, the nodes
-for (nodeID,(x,y)) in nodeCoords.items():
- w.start("node", visible="true", id=str(nodeID), lat=str(y), lon=str(x))
- for (tagKey,tagValue) in nodeTags[nodeID].items():
- if tagValue:
- w.element("tag", k=tagKey, v=tagValue)
- w.end("node")
- if showProgress: sys.stdout.write('.')
-
-
-#print "Generated nodes. On to shared segments."
-
-# Now, the segments used by more than one line/area, as untagged ways
-
-
-#for (segmentID, segmentRef) in segmentRefs.items():
- #if len(segmentRef) > 1:
- #print "FIXME: output shared segment"
- #outputtedSegments[segmentID] = True
-
-
-print
-print "Generated nodes. On to lines."
-
-# Next, the lines, either as ways or as relations
-
-outputtedSegments = {}
-
-for (lineID, lineSegment) in lineSegments.items():
- if showProgress: sys.stdout.write(str(len(lineSegment)) + " ")
- if len(lineSegment) == 1: # The line will be a simple way
- w.start('way', id=str(lineID), action='modify', visible='true')
-
- for nodeID in segmentNodes[ lineSegment[0] ]:
- w.element('nd',ref=str(nodeID))
-
- for (tagKey,tagValue) in lineTags[lineID].items():
- if tagValue:
- w.element("tag", k=tagKey, v=tagValue)
-
- w.end('way')
- pass
- else: # The line will be a relationship
- #print
- #print "Line ID " + str(lineID) + " uses more than one segment: " + str(lineSegment)
- for segmentID in lineSegment:
- if segmentID not in outputtedSegments:
- w.start('way', id=str(segmentID), action='modify', visible='true')
- for nodeID in segmentNodes[ segmentID ]:
- w.element('nd',ref=str(nodeID))
- w.end('way')
- w.start('relation', id=str(lineID), action='modify', visible='true')
- for segmentID in lineSegment:
- w.element('member', type='way', ref=str(segmentID), role='')
- for (tagKey,tagValue) in lineTags[lineID].items():
- if tagValue:
- w.element("tag", k=tagKey, v=tagValue)
- w.end('relation')
-
-print
-print "Generated lines. On to areas."
-
-# And last, the areas, either as ways or as relations
-
-#print areaRings
-
-for (areaID, areaRing) in areaRings.items():
- #sys.stdout.write(str(len(areaRings)))
-
- if len(areaRing) == 1 and len(areaRing[0]) == 1: # The area will be a simple way
- w.start('way', id=str(areaID), action='modify', visible='true')
-
- for nodeID in segmentNodes[ areaRing[0][0] ]:
- w.element('nd',ref=str(nodeID))
-
- for (tagKey,tagValue) in areaTags[areaID].items():
- if tagValue:
- w.element("tag", k=tagKey, v=tagValue)
-
- w.end('way')
- if showProgress: sys.stdout.write('0 ')
- else:
- segmentsUsed = 0
- segmentsUsedInRing = 0
- #print "FIXME"
-
- for ring in areaRing:
- for segmentID in ring:
- if segmentID not in outputtedSegments:
- w.start('way', id=str(segmentID), action='modify', visible='true')
- for nodeID in segmentNodes[ segmentID ]:
- w.element('nd',ref=str(nodeID))
- w.end('way')
-
-
- w.start('relation', id=str(areaID), action='modify', visible='true')
- w.element("tag", k='type', v='multipolygon')
-
- role = 'outer'
- for ring in areaRing:
- for segmentID in ring:
- w.element('member', type='way', ref=str(segmentID), role=role)
- segmentsUsed = segmentsUsed + 1
- segmentsUsedInRing = segmentsUsedInRing + 1
- role = 'inner'
- #if showProgress: sys.stdout.write(str(segmentsUsedInRing)+'r')
- segmentsUsedInRing = 0
-
- for (tagKey,tagValue) in areaTags[areaID].items():
- if tagValue:
- w.element("tag", k=tagKey, v=tagValue)
- w.end('relation')
- if showProgress: sys.stdout.write(str(segmentsUsed) + " ")
-
-
-
-
-if attributeStats:
- print
- for (attribute, stats) in attributeStatsTable.items():
- print "All values for attribute " + attribute + ":"
- print stats
-
-
-print
-print "All done. Enjoy your data!"
-
-
-w.end("osm")
-
-
diff --git a/lib/ogr2osm/translations/carreteras_gv.py b/lib/ogr2osm/translations/carreteras_gv.py
deleted file mode 100644
index 1cb2a2dc..00000000
--- a/lib/ogr2osm/translations/carreteras_gv.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""
-Translation rules for Valencia Community road network.
-
-This is so simple that it'll be used as an example of how to build translation methods.
-
-The important thing is that a file like this must define a "translateAttributes" function that, taking a directory of attributes (key:value), will return a directory of tags (key:value)
-
-The function must allow for empty directories.
-
-The reason for using a full module is that you can define auxiliary functions and data structures here. But this example is so simple it won't have any auxiliary stuff at all.
-"""
-
-
-
-def translateAttributes(attrs):
- if not attrs: return
-
- tags = {}
-
- # Use the "NOM_ACT" attribute as the name= tag
- if attrs['NOM_ACT']:
- tags = {'name':attrs['NOM_ACT']}
-
- # If the name contains an hyphen, set it to the ref= tag too
- if attrs['NOM_ACT'].find('-') != -1:
- tags.update({'ref':attrs['NOM_ACT']})
-
-
-
- # Depending on the value of the TIPUS_ACT, set the highway= tag
- if attrs['TIPUS_ACT'] == 'Altres comunitats autonomes':
- tags.update({'highway':'road'})
-
- elif attrs['TIPUS_ACT'] == 'Basica':
- tags.update({'highway':'trunk'})
-
- elif attrs['TIPUS_ACT'] == 'En construccio':
- tags.update({'highway':'construction','construction':'road'})
-
- elif attrs['TIPUS_ACT'] == 'Via de servei':
- tags.update({'highway':'service'})
-
- elif attrs['TIPUS_ACT'] == 'Municipal':
- tags.update({'highway':'primary'})
-
- elif attrs['TIPUS_ACT'] == 'Autopista/Autovia':
- tags.update({'highway':'motorway'})
-
- elif attrs['TIPUS_ACT'] == 'Auxiliar':
- tags.update({'highway':'motorway_link'})
-
- elif attrs['TIPUS_ACT'] == 'Local':
- tags.update({'highway':'tertiary'})
-
- elif attrs['TIPUS_ACT'] == 'Fora de servei':
- tags.update({'highway':'road', 'access':'no'})
-
-
-
- #print "foo!"
- return tags
- #sys.exit()
-
-
-
-
-"""
-Taken from --attribute-stats:
-
-All values for attribute TIPUS_ACT:
-{'Altres comunitats autonomes': 224, 'Basica': 2950, 'En construccio': 360, 'Via de servei': 505, 'Municipal': 3135, 'Autopista/Autovia': 2849, 'Auxiliar': 9887, 'Local': 4868, 'Fora de servei': 35}
-
-All values for attribute TIT_ACT:
-{'Diputacio': 3337, 'Municipal': 2152, 'Sense determinar': 6498, 'Ministeri': 5908, 'Conselleria': 6881, 'Fora de servei': 35, 'Altres administracions': 2}
-"""
-
diff --git a/lib/ogr2osm/translations/ithaca_haiti.py b/lib/ogr2osm/translations/ithaca_haiti.py
deleted file mode 100644
index 42f880b9..00000000
--- a/lib/ogr2osm/translations/ithaca_haiti.py
+++ /dev/null
@@ -1,55 +0,0 @@
-"""
-Translation rules for the Ithaca Haiti damage assesment report data.
-
-"""
-
-
-
-def translateAttributes(attrs):
- if not attrs: return
-
- tags = {}
-
- tags.update({'FIXME':'Check for duplicated data'})
-
- tags.update({'source':'Ithaca'})
-
- tags.update({'source:imagery': attrs['SOURCE'] })
-
- # Only thing to translate is the "TYPE" attr.
-
- if attrs['TYPE'] == 'Landslide':
- tags.update({'earthquake:damage':'landslide'})
-
-
- if attrs['TYPE'] == 'Damaged infrastructure':
- tags.update({'earthquake:damage':'damaged_infrastructure'})
-
-
- if attrs['TYPE'] == 'Spontaneous camp':
- tags.update({'tourism':'camp_site'})
- tags.update({'refugee':'yes'})
- tags.update({'earthquake:damage':'spontaneous_camp'})
-
-
- if attrs['TYPE'] == 'Collapsed building':
- tags.update({'earthquake:damage':'collapsed_buiding'})
- tags.update({'building':'collapsed'})
-
-
-
-
- #print "foo!"
- return tags
- #sys.exit()
-
-
-
-
-"""
-Taken from --attribute-stats:
-
-All values for attribute TYPE:
-{'Landslide': 45, 'Damaged infrastructure': 35, 'Spontaneous camp': 87, 'Collapsed building': 1490}
-
-"""
\ No newline at end of file