56 lines
1.7 KiB
Ruby
56 lines
1.7 KiB
Ruby
require_relative '../../../importer/lib/importer/query_batcher'
|
|
|
|
module CartoDB
|
|
module InternalGeocoder
|
|
|
|
class LatitudeLongitude
|
|
|
|
def initialize(db, logger = nil)
|
|
@db = db
|
|
@logger = logger
|
|
end
|
|
|
|
def geocode(table_schema, table_name, latitude_column, longitude_column)
|
|
qualified_table_name = "\"#{table_schema}\".\"#{table_name}\""
|
|
query_fragment_update = %Q{
|
|
UPDATE #{qualified_table_name}
|
|
SET
|
|
the_geom = ST_GeomFromText(
|
|
'POINT(' || REPLACE(TRIM(CAST("#{longitude_column}" AS text)), ',', '.') || ' ' ||
|
|
REPLACE(TRIM(CAST("#{latitude_column}" AS text)), ',', '.') || ')', 4326
|
|
)
|
|
}
|
|
query_fragment_where = %Q{
|
|
REPLACE(TRIM(CAST("#{longitude_column}" AS text)), ',', '.') ~
|
|
'^(([-+]?(([0-9]|[1-9][0-9]|1[0-7][0-9])(\.[0-9]+)?))|[-+]?180)$'
|
|
AND REPLACE(TRIM(CAST("#{latitude_column}" AS text)), ',', '.') ~
|
|
'^(([-+]?(([0-9]|[1-8][0-9])(\.[0-9]+)?))|[-+]?90)$'
|
|
}
|
|
|
|
CartoDB::Importer2::QueryBatcher.new(
|
|
@db,
|
|
@logger,
|
|
!table_has_cartodb_id(table_schema, table_name)
|
|
).execute_update(
|
|
%Q{#{query_fragment_update} where #{query_fragment_where}},
|
|
table_schema, table_name
|
|
)
|
|
end
|
|
|
|
def table_has_cartodb_id(table_schema, table_name)
|
|
result = @db.fetch(%Q{
|
|
select *
|
|
from information_schema.columns
|
|
where table_schema = '#{table_schema}'
|
|
and table_name = '#{table_name}'
|
|
and column_name = 'cartodb_id'
|
|
and data_type = 'integer';
|
|
}).all
|
|
!result[0].nil?
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|