demarches-normaliennes/app/models/champs/carte_champ.rb

166 lines
4.1 KiB
Ruby
Raw Normal View History

2018-10-16 13:01:12 +02:00
class Champs::CarteChamp < Champ
# Default map location. Center of the World, ahm, France...
DEFAULT_LON = 2.428462
DEFAULT_LAT = 46.538192
2018-10-16 13:01:12 +02:00
# We are not using scopes here as we want to access
# the following collections on unsaved records.
def cadastres
2019-09-12 11:26:22 +02:00
geo_areas.filter do |area|
2018-10-16 13:01:12 +02:00
area.source == GeoArea.sources.fetch(:cadastre)
end
end
def quartiers_prioritaires
2019-09-12 11:26:22 +02:00
geo_areas.filter do |area|
2018-10-16 13:01:12 +02:00
area.source == GeoArea.sources.fetch(:quartier_prioritaire)
end
end
2018-10-23 15:38:20 +02:00
def parcelles_agricoles
2019-09-12 11:26:22 +02:00
geo_areas.filter do |area|
2018-10-23 15:38:20 +02:00
area.source == GeoArea.sources.fetch(:parcelle_agricole)
end
end
def selections_utilisateur
geo_areas.filter do |area|
area.source == GeoArea.sources.fetch(:selection_utilisateur)
end
2018-12-19 11:09:13 +01:00
end
2018-10-17 12:42:06 +02:00
def cadastres?
type_de_champ&.cadastres && type_de_champ.cadastres != '0'
end
def quartiers_prioritaires?
type_de_champ&.quartiers_prioritaires && type_de_champ.quartiers_prioritaires != '0'
end
2018-10-23 15:38:20 +02:00
def parcelles_agricoles?
type_de_champ&.parcelles_agricoles && type_de_champ.parcelles_agricoles != '0'
end
2018-10-16 13:01:12 +02:00
def position
if dossier.present?
dossier.geo_position
else
lon = DEFAULT_LON.to_s
lat = DEFAULT_LAT.to_s
2018-10-16 13:01:12 +02:00
zoom = "13"
{ lon: lon, lat: lat, zoom: zoom }
end
end
2018-10-17 12:02:34 +02:00
def bounding_box
factory = RGeo::Geographic.simple_mercator_factory
bounding_box = RGeo::Cartesian::BoundingBox.new(factory)
2018-12-19 11:09:13 +01:00
if geo_areas.present?
geo_areas.each do |area|
bounding_box.add(area.rgeo_geometry)
2018-11-30 13:19:19 +01:00
end
elsif dossier.present?
point = dossier.geo_position
bounding_box.add(factory.point(point[:lon], point[:lat]))
else
bounding_box.add(factory.point(DEFAULT_LON, DEFAULT_LAT))
2018-11-30 13:19:19 +01:00
end
[bounding_box.max_point, bounding_box.min_point].compact.flat_map(&:coordinates)
end
def to_feature_collection
{
type: 'FeatureCollection',
id: type_de_champ.stable_id,
bbox: bounding_box,
features: (legacy_selections_utilisateur + except_selections_utilisateur).map(&:to_feature)
}
end
def geometry?
geo_areas.present?
2018-10-17 12:02:34 +02:00
end
2018-10-31 13:29:25 +01:00
def selection_utilisateur_legacy_geometry
if selection_utilisateur_legacy?
selections_utilisateur.first.geometry
elsif selections_utilisateur.present?
{
type: 'MultiPolygon',
coordinates: selections_utilisateur.filter do |selection_utilisateur|
selection_utilisateur.geometry['type'] == 'Polygon'
end.map do |selection_utilisateur|
selection_utilisateur.geometry['coordinates']
end
}
else
nil
end
end
def selection_utilisateur_legacy_geo_area
geometry = selection_utilisateur_legacy_geometry
if geometry.present?
GeoArea.new(
source: GeoArea.sources.fetch(:selection_utilisateur),
geometry: geometry
)
end
end
2018-11-30 13:19:19 +01:00
def to_render_data
{
position: position,
selection: selection_utilisateur_legacy_geometry,
2018-11-30 13:19:19 +01:00
quartiersPrioritaires: quartiers_prioritaires? ? quartiers_prioritaires.as_json(except: :properties) : [],
cadastres: cadastres? ? cadastres.as_json(except: :properties) : [],
parcellesAgricoles: parcelles_agricoles? ? parcelles_agricoles.as_json(except: :properties) : []
}
2018-10-31 13:29:25 +01:00
end
def for_api
nil
end
2018-12-19 11:09:13 +01:00
def for_export
nil
2018-10-31 13:29:25 +01:00
end
2018-12-28 17:59:14 +01:00
private
def selection_utilisateur_legacy?
if selections_utilisateur.size == 1
geometry = selections_utilisateur.first.geometry
return geometry && geometry['type'] == 'MultiPolygon'
2018-12-19 11:09:13 +01:00
end
false
2018-12-19 11:09:13 +01:00
end
def legacy_selections_utilisateur
if selection_utilisateur_legacy?
selections_utilisateur.first.geometry['coordinates'].map do |coordinates|
GeoArea.new(
geometry: {
type: 'Polygon',
coordinates: coordinates
},
properties: {},
source: GeoArea.sources.fetch(:selection_utilisateur)
)
end
else
selections_utilisateur
end
2018-12-19 11:09:13 +01:00
end
def except_selections_utilisateur
geo_areas.filter do |area|
area.source != GeoArea.sources.fetch(:selection_utilisateur)
end
2018-12-28 17:59:14 +01:00
end
2018-10-16 13:01:12 +02:00
end