2018-10-17 12:02:34 +02:00
|
|
|
class Champs::CarteController < ApplicationController
|
|
|
|
before_action :authenticate_logged_user!
|
|
|
|
|
2018-11-27 12:15:36 +01:00
|
|
|
EMPTY_GEO_JSON = '[]'
|
|
|
|
ERROR_GEO_JSON = ''
|
|
|
|
|
2018-10-17 12:02:34 +02:00
|
|
|
def show
|
|
|
|
@selector = ".carte-#{params[:position]}"
|
|
|
|
|
|
|
|
if params[:dossier].key?(:champs_attributes)
|
2018-11-29 11:40:07 +01:00
|
|
|
coordinates = params[:dossier][:champs_attributes][params[:position]][:value]
|
2018-10-17 12:02:34 +02:00
|
|
|
else
|
2018-11-29 11:40:07 +01:00
|
|
|
coordinates = params[:dossier][:champs_private_attributes][params[:position]][:value]
|
2018-10-17 12:02:34 +02:00
|
|
|
end
|
|
|
|
|
2019-02-19 16:14:42 +01:00
|
|
|
@champ = if params[:champ_id].present?
|
2019-06-27 16:26:07 +02:00
|
|
|
policy_scope(Champ).find(params[:champ_id])
|
2018-10-17 12:02:34 +02:00
|
|
|
else
|
2019-06-27 16:26:07 +02:00
|
|
|
policy_scope(TypeDeChamp).find(params[:type_de_champ_id]).champ.build
|
2018-10-17 12:02:34 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
geo_areas = []
|
|
|
|
|
2018-11-29 11:40:07 +01:00
|
|
|
if coordinates == EMPTY_GEO_JSON
|
2018-11-27 12:15:36 +01:00
|
|
|
@champ.value = nil
|
|
|
|
@champ.geo_areas = []
|
2018-11-29 11:40:07 +01:00
|
|
|
elsif coordinates == ERROR_GEO_JSON
|
2018-10-17 12:02:34 +02:00
|
|
|
@error = true
|
2018-11-21 12:42:13 +01:00
|
|
|
@champ.value = nil
|
|
|
|
@champ.geo_areas = []
|
2018-11-27 12:15:36 +01:00
|
|
|
else
|
2018-11-29 11:40:07 +01:00
|
|
|
coordinates = JSON.parse(coordinates)
|
2018-11-27 12:15:36 +01:00
|
|
|
|
2018-10-17 12:02:34 +02:00
|
|
|
if @champ.cadastres?
|
2018-12-10 11:31:07 +01:00
|
|
|
cadastres = ApiCartoService.generate_cadastre(coordinates)
|
2018-10-17 12:02:34 +02:00
|
|
|
geo_areas += cadastres.map do |cadastre|
|
|
|
|
cadastre[:source] = GeoArea.sources.fetch(:cadastre)
|
|
|
|
cadastre
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-04-09 17:32:20 +02:00
|
|
|
selections_utilisateur = legacy_selections_utilisateur_to_polygons(coordinates)
|
|
|
|
geo_areas += selections_utilisateur.map do |selection_utilisateur|
|
|
|
|
selection_utilisateur.merge(source: GeoArea.sources.fetch(:selection_utilisateur))
|
|
|
|
end
|
2018-12-19 11:09:13 +01:00
|
|
|
|
2018-11-21 12:42:13 +01:00
|
|
|
@champ.geo_areas = geo_areas.map do |geo_area|
|
|
|
|
GeoArea.new(geo_area)
|
|
|
|
end
|
2018-10-17 12:02:34 +02:00
|
|
|
|
2018-12-19 11:09:13 +01:00
|
|
|
@champ.value = coordinates.to_json
|
2018-11-21 12:42:13 +01:00
|
|
|
end
|
2018-10-17 12:02:34 +02:00
|
|
|
|
|
|
|
if @champ.persisted?
|
|
|
|
@champ.save
|
|
|
|
end
|
2019-01-24 18:30:14 +01:00
|
|
|
|
2020-03-05 13:50:38 +01:00
|
|
|
rescue ApiCarto::API::ResourceNotFound
|
2019-01-24 18:30:14 +01:00
|
|
|
flash.alert = 'Les données cartographiques sont temporairement indisponibles. Réessayez dans un instant.'
|
|
|
|
response.status = 503
|
2018-10-17 12:02:34 +02:00
|
|
|
end
|
2020-04-09 17:32:20 +02:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def legacy_selections_utilisateur_to_polygons(coordinates)
|
|
|
|
coordinates.map do |lat_longs|
|
|
|
|
{
|
|
|
|
geometry: {
|
|
|
|
type: 'Polygon',
|
|
|
|
coordinates: [lat_longs.map { |lat_long| [lat_long['lng'], lat_long['lat']] }]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
2018-10-17 12:02:34 +02:00
|
|
|
end
|