cartodb-4.29/services/table-geocoder/lib/internal-geocoder/latitude_longitude.rb
2020-06-15 10:58:47 +08:00

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