From 35d2bc36fc15233e26448a671558b09e31e58ec2 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 29 Nov 2018 11:40:07 +0100 Subject: [PATCH] cleanup selection_utilisateur geo_json --- app/controllers/champs/carte_controller.rb | 18 +++++++++--------- app/models/champs/carte_champ.rb | 18 +++++++++--------- app/services/geojson_service.rb | 17 +++++++++++++++++ spec/serializers/champ_serializer_spec.rb | 22 +++++++++++++++++++++- 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/app/controllers/champs/carte_controller.rb b/app/controllers/champs/carte_controller.rb index 3609272fd..9b96f24bb 100644 --- a/app/controllers/champs/carte_controller.rb +++ b/app/controllers/champs/carte_controller.rb @@ -8,9 +8,9 @@ class Champs::CarteController < ApplicationController @selector = ".carte-#{params[:position]}" if params[:dossier].key?(:champs_attributes) - geo_json = params[:dossier][:champs_attributes][params[:position]][:value] + coordinates = params[:dossier][:champs_attributes][params[:position]][:value] else - geo_json = params[:dossier][:champs_private_attributes][params[:position]][:value] + coordinates = params[:dossier][:champs_private_attributes][params[:position]][:value] end if params[:champ_id].present? @@ -30,18 +30,18 @@ class Champs::CarteController < ApplicationController geo_areas = [] - if geo_json == EMPTY_GEO_JSON + if coordinates == EMPTY_GEO_JSON @champ.value = nil @champ.geo_areas = [] - elsif geo_json == ERROR_GEO_JSON + elsif coordinates == ERROR_GEO_JSON @error = true @champ.value = nil @champ.geo_areas = [] else - geo_json = JSON.parse(geo_json) + coordinates = JSON.parse(coordinates) if @champ.cadastres? - cadastres = ModuleApiCartoService.generate_cadastre(geo_json) + cadastres = ModuleApiCartoService.generate_cadastre(coordinates) geo_areas += cadastres.map do |cadastre| cadastre[:source] = GeoArea.sources.fetch(:cadastre) cadastre @@ -49,7 +49,7 @@ class Champs::CarteController < ApplicationController end if @champ.quartiers_prioritaires? - quartiers_prioritaires = ModuleApiCartoService.generate_qp(geo_json) + quartiers_prioritaires = ModuleApiCartoService.generate_qp(coordinates) geo_areas += quartiers_prioritaires.map do |qp| qp[:source] = GeoArea.sources.fetch(:quartier_prioritaire) qp @@ -57,7 +57,7 @@ class Champs::CarteController < ApplicationController end if @champ.parcelles_agricoles? - parcelles_agricoles = ModuleApiCartoService.generate_rpg(geo_json) + parcelles_agricoles = ModuleApiCartoService.generate_rpg(coordinates) geo_areas += parcelles_agricoles.map do |parcelle_agricole| parcelle_agricole[:source] = GeoArea.sources.fetch(:parcelle_agricole) parcelle_agricole @@ -68,7 +68,7 @@ class Champs::CarteController < ApplicationController GeoArea.new(geo_area) end - @champ.value = geo_json.to_json + @champ.value = GeojsonService.to_json_polygon_for_selection_utilisateur(coordinates) end if @champ.persisted? diff --git a/app/models/champs/carte_champ.rb b/app/models/champs/carte_champ.rb index 17e1f91ab..7eff98481 100644 --- a/app/models/champs/carte_champ.rb +++ b/app/models/champs/carte_champ.rb @@ -44,18 +44,18 @@ class Champs::CarteChamp < Champ end def geo_json - @geo_json ||= value.blank? ? [] : JSON.parse(value) + @geo_json ||= value.blank? ? nil : JSON.parse(value) end def user_geometry - { - type: 'Polygon', - coordinates: [ - geo_json[0].map do |polygon| - [polygon['lng'], polygon['lat']] - end - ] - } + # We used to store in the value column a json array with coordinates. + if geo_json.is_a?(Array) + # If it is a coordinates array, format it as a GEO-JSON + GeojsonService.to_json_polygon_for_selection_utilisateur(geo_json) + else + # It is already a GEO-JSON + geo_json + end end def user_geo_area diff --git a/app/services/geojson_service.rb b/app/services/geojson_service.rb index d7d3a3519..bfa717982 100644 --- a/app/services/geojson_service.rb +++ b/app/services/geojson_service.rb @@ -36,4 +36,21 @@ class GeojsonService polygon.to_json end + + def self.to_json_polygon_for_selection_utilisateur(coordinates) + coordinates = coordinates.map do |lat_longs| + outbounds = lat_longs.map do |lat_long| + [lat_long['lng'], lat_long['lat']] + end + + [outbounds] + end + + polygon = { + type: 'MultiPolygon', + coordinates: coordinates + } + + polygon.to_json + end end diff --git a/spec/serializers/champ_serializer_spec.rb b/spec/serializers/champ_serializer_spec.rb index 840f79516..1c82e296a 100644 --- a/spec/serializers/champ_serializer_spec.rb +++ b/spec/serializers/champ_serializer_spec.rb @@ -21,7 +21,27 @@ describe ChampSerializer do context 'when type champ is carte' do let(:geo_area) { create(:geo_area) } - let(:champ) { create(:type_de_champ_carte).champ.create(geo_areas: [geo_area]) } + let(:coordinates) { [[{ "lat": 48.87442541960633, "lng": 2.3859214782714844 }, { "lat": 48.87273183590832, "lng": 2.3850631713867183 }, { "lat": 48.87081237174292, "lng": 2.3809432983398438 }, { "lat": 48.8712640169951, "lng": 2.377510070800781 }, { "lat": 48.87510283703279, "lng": 2.3778533935546875 }, { "lat": 48.87544154230615, "lng": 2.382831573486328 }, { "lat": 48.87442541960633, "lng": 2.3859214782714844 }]] } + + let(:champ_carte) { create(:champ_carte, value: coordinates.to_json, geo_areas: [geo_area]) } + let(:champ) { champ_carte } + + context 'legacy champ user_geometry' do + let(:champ) { champ_carte.user_geo_area } + + it { + expect(subject).to include( + type_de_champ: { + descripton: "", + id: -1, + libelle: "user geometry", + order_place: -1, + type_champ: "user_geometry" + }, + value: champ_carte.user_geometry + ) + } + end context 'and geo_area is cadastre' do it {