diff --git a/.copier-answers.yml b/.copier-answers.yml index 46c9746e95..6fdbd4bafb 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: v1.21.1 +_commit: v1.24 _src_path: gh:oca/oca-addons-repo-template additional_ruff_rules: [] ci: GitHub diff --git a/.eslintrc.yml b/.eslintrc.yml index fed88d70d2..0b38203958 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,7 +4,7 @@ env: # See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 parserOptions: - ecmaVersion: 2019 + ecmaVersion: 2022 overrides: - files: diff --git a/.gitignore b/.gitignore index 0090721f5d..2b045db399 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,15 @@ var/ *.egg *.eggs +# Debian packages +*.deb + +# Redhat packages +*.rpm + +# MacOS packages +*.dmg + # Installer logs pip-log.txt pip-delete-this-directory.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1a09da21b7..8d77e21028 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -43,7 +43,7 @@ repos: hooks: - id: whool-init - repo: https://github.com/oca/maintainer-tools - rev: 9a170331575a265c092ee6b24b845ec508e8ef75 + rev: d5fab7ee87fceee858a3d01048c78a548974d935 hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons diff --git a/README.md b/README.md index 156c2ab656..42d6655770 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,11 @@ TODO: add repo description. [//]: # (addons) -This part will be replaced when running the oca-gen-addons-table script from OCA/maintainer-tools. +Available addons +---------------- +addon | version | maintainers | summary +--- | --- | --- | --- +[base_geoengine](base_geoengine/) | 17.0.1.0.0 | | Geospatial support for Odoo [//]: # (end addons) diff --git a/base_geoengine/README.rst b/base_geoengine/README.rst new file mode 100644 index 0000000000..a019e34424 --- /dev/null +++ b/base_geoengine/README.rst @@ -0,0 +1,365 @@ +=========================== +Geospatial support for Odoo +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:120a763031af0baf572a3fe62056aaecc78ee43706b35ea218521126231cee6d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fgeospatial-lightgray.png?logo=github + :target: https://github.com/OCA/geospatial/tree/17.0/base_geoengine + :alt: OCA/geospatial +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/geospatial-17-0/geospatial-17-0-base_geoengine + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/geospatial&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +GeoEngine is an Odoo module that adds spatial/GIS capabilites to Odoo. +It will allow you to : + +- Visualize and query your business information on map +- Perform GeoBI and spatial query +- Configure your spatial layers and spatial datasources +- Extend Odoo models with spatial columns + +GeoEngine relies on `OpenLayers `__ and +`PostgGIS `__ technologies. + +Postgis is used to store spatial information in databases. OpenLayer is +used to represent spatial data in other words to show maps and the +different spatial layers. The GeoEngine module acts as a data provider +and as an OpenLayers configurator. It also provides a complete extension +to Odoo ORM. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +To install this module, you need to have +`PostGIS `__ installed. + +On Ubuntu: + +:: + + .. code-block:: bash + +.. + + sudo apt-get install postgis + +The module also requires two additional python libs: + +- `Shapely `__ +- `geojson `__ + +When you will install the module this two additional libs will be +installed. + +For a complete documentation please refer to the `public +documenation `__ + +Usage +===== + +Geoengine Demo +-------------- + +1. As a user/admin, when I am in the Geoengine Demo module and I go to + the ZIP menu. When I click on an item in the list view, I get to the + form view showing me the different information about the ZIP. We can + see its ZIP, city, priority, total sales and his spatial + representation. +2. As a user, I can't modify the information in the form view. +3. As an admin, I can modify the information in the form view. I can + click on the bin button to clear the map and I can draw a new shape. +4. As a user, when I go the "Retail machines" tab and there are no + items to display, it does not show me anything. +5. As an admin, when I go the "Retail machines" tab and there are no + items to display, the list view of the retail machines suggests to + me to add a new line. +6. As a user/admin, if there are items to be displayed in the "Retail + machines" tab then I can click on an item and the retail machines + form view will be displayed. We can see its spatial representation + by going to "The point" tab and its attributes in "Attributes" tab. +7. As a user/admin, when I go to the geoengine zip view by clicking on + the map button at the top right of the screen. The geoengine view + appears with the first 80 results displayed on the map. The vector + layers selected are those defined as "active on startup" by the + admin. The selected raster layer is the first one that is not an + overlay layer. +8. As a user/admin, when I hover over an area on the map, the area + changes its style. +9. As a user/admin, when I click on an area, a popup appears an I can + see the different information about the area. If I click on the + cross, the popup will disappear. If I click somewhere else on the + map, the popup will also disappear. If I click on the about button, + then the form view will be displayed. +10. As a user/admin, when I use the paging system, then the results + displayed on the map are different (corresponding to the request). +11. As a user/admin, if we use the search bar, we can search results by + his zip or his city. +12. As an admin, if I change the sequence of layers with the handle + button then the change are persisted in database. +13. As a user, if I change the sequence of layers with the handle button + then the change are not persisted in database. There are just the + changes in the display. +14. As an admin, if I change the domain of a layer with the filter + button then the change are persisted in database. +15. As a user, if I change the domain of a layer with the filter button + then the change are not persisted in database. There are just the + changes in the display. +16. As an admin, I have the possibility to edit the layer with its + corresponding button. +17. As a user/admin, I can open/close LayerPanel with its button. +18. As a user/admin, I can open/close RecordsPanel with its button. +19. As a user/admin, when I click on a record in RecordsPanel, a move is + made on the map to the selected record. +20. As a user/admin, when I click on a record in RecordsPanel, I can + also click on the left magnifying glass to zoom on the record. +21. As a user/admin, when I click on a record in RecordsPanel, I can + also click on the right magnifying glass to get the original zoom. +22. As a user/admin, I can use the search bar to search in the + RecordsPanel. +23. As an admin,If the geoengine view is in edit mode, I can create new + records by drawing them in the view. +24. As an admin, If the geoengine view is in edit mode, I can modify its + spatial representation. + +Geoengine Backend +----------------- + +1. As an admin, if I go into the configuration of the raster layers and + it has elements, I can click on one and see its information. +2. As an admin, if I want to create a new raster layer, I can click on + "NEW" and fill out the form. The required fields for OpenStreetMap + type are "Layer Name" and "Related View". If we want to have a WMTS + (Web Map Tile Service) raster type. The required fields in addition + to the precedents are "Service URL", "Matrix set","Format", + "Projection" and "Resolutions". If we take WMS (Web Map Service) + raster type, then the required fields are "Layer Name", "Related + View", "Service URL", "Params", "Server Type". +3. As an admin,if I go into the configuration of the vector layers and + it has elements, I can click on one and see its information. +4. As an admin, if I want to create a new vector layer, I can click on + "NEW" and fill out the form. The required fields are "Layer Name", + "Related View", "Geo field" and "Representation mode". + +Known issues / Roadmap +====================== + + + +Changelog +========= + +16.0.1.0.0 (2023-03-20) +----------------------- + +- LayerSwitcher has been removed as it was not really practical. A + LayerPanel is now active. +- The geo_search method is now deprecated and replaced by the standard + odoo search method. +- The widget "geo_edit_map" attribute is no longer necessary as the + field is automatically detected by his type. We can also provide an + option attribute that allows us to pass an opacity and a color as + parameters. + +.. code:: xml + +
+ + + + + +
+ +- The method geo_search is now deprecated. We now need to use the + standard odoo search method. + +.. code:: python + + obj.search([("the_point","geo_intersect",{"dummy.zip.the_geom": [("id", "=", rec.id)]})]) + +- We can now pass to the geoengine view a template to display the + information we want to see when clicking on a feature. + +.. code:: xml + + + + + + + + + +
    +
  • ZIP : +
  • +
  • Total Sales: +
  • +
+
+
+
+ +- We can now pass a model to use to a layer to display other + information on the map. + +.. code:: xml + + + + [('state', '=', 'hs')] + + HS retail machines + + basic + + #FF0000 + + 0.8 + + +- There is some new features in the LayerPanel. + +1. If you are logged in as an admin, you have the possibility to edit + the layer by clicking on the edit button. This will open a dialog + box. Changes will appear in real time on the view. +2. If you are logged in as an admin, you can also change the domain of + the layer. If you are logged in as a user, changes will not be + persisted in the database. Changes will appear in real time on the + view. +3. If you are logged in as an admin, you can also change the sequence of + the layers by sliding them over each other. If you are logged in as a + user, changes will not be persisted in the database. + +- Widget domain is now implemented for geo field This means that the + geo-operators are also implemented and that there is the possibility + to add a sub-domain. If we want to add a domain that includes all the + records that are displayed in the geoengine view (active_ids). We can + use the two new operators : "in active_ids" and "not in active_ids". + These will automatically replace the marker with ids. Note that the + widget will indicate that the domain is invalid because of the + marker. +- Creation of the RecordsPanel. This panel allows you to retrieve all + active records. You can click on record to get the movement to the + selected record. Two magnifying glass are also available. You can + click on the left one to zoom on the record. You can click on the + right one to get the original zoom. +- A search bar is also available. It allows you to perform a search + into the RecordsPanel. +- A button to open/close the panels is also available. +- The module has been translated in French. +- Now you can now make the geoengine view editable. Simply add editable + attribute in the geoengine view. + +.. code:: xml + + + + + + + + + + +
    +
  • ZIP : +
  • +
  • Total Sales: +
  • +
+
+
+
+ + Thanks to that, you can create new records by drawing them directly in the geoengine view. You can also edit record in the same view. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Camptocamp +* ACSONE SA/NV + +Contributors +------------ + +- Nicolas Bessi +- Frederic Junod +- Yannick Payot +- Sandy Carter +- Laurent Mignon +- Jonathan Nemry +- David Lasley +- Daniel Reis +- Matthieu Dietrich +- Alan Ramos +- Damien Crier +- Cyril Gaudin +- Pierre Verkest +- Benjamin Willig +- Devendra Kavthekar +- Emanuel Cino +- Thomas Nowicki +- Alexandre Saunier +- Sandip Mangukiya +- Samuel Kouff +- `APSL-Nagarro `__: + + - Antoni Marroig + - Miquel Alzanillas + +- Red Butay <> +- Sergio Sancho + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/geospatial `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_geoengine/__init__.py b/base_geoengine/__init__.py new file mode 100644 index 0000000000..205ee0f384 --- /dev/null +++ b/base_geoengine/__init__.py @@ -0,0 +1,6 @@ +from . import models +from . import expressions +from . import fields +from . import geo_convertion_helper +from . import geo_operators +from .geo_db import init_postgis diff --git a/base_geoengine/__manifest__.py b/base_geoengine/__manifest__.py new file mode 100644 index 0000000000..1679b8d32b --- /dev/null +++ b/base_geoengine/__manifest__.py @@ -0,0 +1,36 @@ +# Copyright 2011-2015 Nicolas Bessi (Camptocamp SA) +# Copyright 2016 Yannick Payot (Camptocamp SA) +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Geospatial support for Odoo", + "version": "17.0.1.0.0", + "category": "GeoBI", + "author": "Camptocamp,ACSONE SA/NV,Odoo Community Association (OCA)", + "license": "AGPL-3", + "website": "https://github.com/OCA/geospatial", + "depends": ["base", "web"], + "data": [ + "security/data.xml", + "views/base_geoengine_view.xml", + "views/ir_model_view.xml", + "views/ir_view_view.xml", + "views/geo_raster_layer_view.xml", + "views/geo_vector_layer_view.xml", + "security/ir.model.access.csv", + ], + "assets": { + "web.assets_backend": [ + "base_geoengine/static/src/js/**/*", + "base_geoengine/static/src/css/style.css", + "web/static/src/libs/fontawesome/css/font-awesome.css", + ("include", "web._assets_helpers"), + "web/static/src/scss/pre_variables.scss", + "web/static/lib/bootstrap/scss/_variables.scss", + ("include", "web._assets_bootstrap"), + ] + }, + "external_dependencies": {"python": ["shapely", "geojson"]}, + "installable": True, + "pre_init_hook": "init_postgis", +} diff --git a/base_geoengine/expressions.py b/base_geoengine/expressions.py new file mode 100644 index 0000000000..1e61134745 --- /dev/null +++ b/base_geoengine/expressions.py @@ -0,0 +1,137 @@ +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import random +import string + +from odoo.osv import expression +from odoo.osv.expression import TERM_OPERATORS +from odoo.tools import SQL, Query + +from .fields import GeoField +from .geo_operators import GeoOperator + +original__leaf_to_sql = expression.expression._expression__leaf_to_sql + +GEO_OPERATORS = { + "geo_greater": ">", + "geo_lesser": "<", + "geo_equal": "=", + "geo_touch": "ST_Touches", + "geo_within": "ST_Within", + "geo_contains": "ST_Contains", + "geo_intersect": "ST_Intersects", +} +term_operators_list = list(TERM_OPERATORS) +for op in GEO_OPERATORS: + term_operators_list.append(op) + +expression.TERM_OPERATORS = tuple(term_operators_list) + + +def __leaf_to_sql(self, leaf, model, alias): + """ + This method has been monkey patched in order to be able to include + geo_operators into the Odoo search method. + """ + left, operator, right = leaf + if isinstance(leaf, list | tuple): + current_field = model._fields.get(left) + current_operator = GeoOperator(current_field) + if current_field and isinstance(current_field, GeoField): + params = [] + if isinstance(right, dict): + # We are having indirect geo_operator like (‘geom’, ‘geo_...’, + # {‘res.zip.poly’: [‘id’, ‘in’, [1,2,3]] }) + ref_search = right + sub_queries = [] + for key in ref_search: + i = key.rfind(".") + rel_model = key[0:i] + rel_col = key[i + 1 :] + rel_model = model.env[rel_model] + # we compute the attributes search on spatial rel + if ref_search[key]: + rel_alias = ( + rel_model._table + + "_" + + "".join(random.choices(string.ascii_lowercase, k=5)) + ) + rel_query = where_calc( + rel_model, + ref_search[key], + active_test=True, + alias=rel_alias, + ) + model._apply_ir_rules(rel_query, "read") + if operator == "geo_equal": + rel_query.add_where( + f'"{alias}"."{left}" {GEO_OPERATORS[operator]} ' + f"{rel_alias}.{rel_col}" + ) + elif operator in ("geo_greater", "geo_lesser"): + rel_query.add_where( + f"ST_Area({alias}.{left}) {GEO_OPERATORS[operator]} " + f"ST_Area({rel_alias}.{rel_col})" + ) + else: + rel_query.add_where( + f'{GEO_OPERATORS[operator]}("{alias}"."{left}", ' + f"{rel_alias}.{rel_col})" + ) + + subquery, subparams = rel_query.subselect("1") + sub_queries.append(f"EXISTS({subquery})") + params += subparams + query = " AND ".join(sub_queries) + else: + query = get_geo_func( + current_operator, operator, left, right, params, model._table + ) + return SQL(query, *params) + return original__leaf_to_sql(self, leaf=leaf, model=model, alias=alias) + + +def get_geo_func(current_operator, operator, left, right, params, table): + """ + This method will call the SQL query corresponding to the requested geo operator + """ + match operator: + case "geo_greater": + query = current_operator.get_geo_greater_sql(table, left, right, params) + case "geo_lesser": + query = current_operator.get_geo_lesser_sql(table, left, right, params) + case "geo_equal": + query = current_operator.get_geo_equal_sql(table, left, right, params) + case "geo_touch": + query = current_operator.get_geo_touch_sql(table, left, right, params) + case "geo_within": + query = current_operator.get_geo_within_sql(table, left, right, params) + case "geo_contains": + query = current_operator.get_geo_contains_sql(table, left, right, params) + case "geo_intersect": + query = current_operator.get_geo_intersect_sql(table, left, right, params) + case _: + raise NotImplementedError(f"The operator {operator} is not supported") + return query + + +def where_calc(model, domain, active_test=True, alias=None): + """ + This method is copied from base, we need to create our own query. + """ + # if the object has an active field ('active', 'x_active'), filter out all + # inactive records unless they were explicitly asked for + if model._active_name and active_test and model._context.get("active_test", True): + # the item[0] trick below works for domain items and '&'/'|'/'!' + # operators too + if not any(item[0] == model._active_name for item in domain): + domain = [(model._active_name, "=", 1)] + domain + + query = Query(model.env.cr, alias, model._table) + if domain: + return expression.expression(domain, model, alias=alias, query=query).query + return query + + +expression.expression._expression__leaf_to_sql = __leaf_to_sql diff --git a/base_geoengine/fields.py b/base_geoengine/fields.py new file mode 100644 index 0000000000..f0d8beedbf --- /dev/null +++ b/base_geoengine/fields.py @@ -0,0 +1,341 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# Copyright 2016 Yannick Payot (Camptocamp SA) +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import json +import logging +from operator import attrgetter + +from odoo import _, fields +from odoo.tools import sql + +from . import geo_convertion_helper as convert +from .geo_db import create_geo_column, create_geo_index + +logger = logging.getLogger(__name__) +try: + import geojson + from shapely.geometry import Point, shape + from shapely.geometry.base import BaseGeometry + from shapely.wkb import loads as wkbloads +except ImportError: + logger.warning("Shapely or geojson are not available in the sys path") + + +class GeoField(fields.Field): + """The field descriptor contains the field definition common to all + specialized fields for geolocalization. Subclasses must define a type + and a geo_type. The type is the name of the corresponding column type, + the geo_type is the name of the corresponding type in the GIS system. + """ + + geo_type = None + dim = "2" + srid = 3857 + gist_index = True + + @property + def column_type(self): + postgis_geom_type = self.geo_type.upper() if self.geo_type else "GEOMETRY" + if self.dim == "3": + postgis_geom_type += "Z" + elif self.dim == "4": + postgis_geom_type += "ZM" + return ("geometry", f"geometry({postgis_geom_type}, {self.srid})") + + def convert_to_column(self, value, record, values=None): + """Convert value to database format + + value can be geojson, wkt, shapely geometry object. + If geo_direct_write in context you can pass diretly WKT""" + if not value: + return None + shape_to_write = self.entry_to_shape(value, same_type=True) + if shape_to_write.is_empty: + return None + else: + return f"SRID={self.srid};{shape_to_write.wkt}" + + def convert_to_cache(self, value, record, validate=True): + val = value + if isinstance(val, bytes | str): + try: + int(val, 16) + except Exception: + # not an hex value -> try to load from a sting + # representation of a geometry + value = convert.value_to_shape(value, use_wkb=False) + if isinstance(value, BaseGeometry): + val = value.wkb_hex + return val + + def convert_to_record(self, value, record): + """Value may be: + - a GeoJSON string when field onchange is triggered + - a geometry object hexcode from cache + - a unicode containing dict + """ + if not value: + return False + return convert.value_to_shape(value, use_wkb=True) + + def convert_to_read(self, value, record, use_name_get=True): + if not isinstance(value, BaseGeometry): + # read hexadecimal value from database + shape = self.load_geo(value) + else: + shape = value + if not shape or shape.is_empty: + return False + return geojson.dumps(shape) + + # + # Field description + # + + # properties used by get_description() + _description_dim = property(attrgetter("dim")) + _description_srid = property(attrgetter("srid")) + _description_gist_index = property(attrgetter("gist_index")) + + @classmethod + def load_geo(cls, wkb): + """Load geometry into browse record after read was done""" + if isinstance(wkb, BaseGeometry): + return wkb + return wkbloads(wkb, hex=True) if wkb else False + + def entry_to_shape(self, value, same_type=False): + """Transform input into an object""" + shape = convert.value_to_shape(value) + if same_type and not shape.is_empty: + if shape.geom_type.lower() != self.geo_type.lower(): + msg = _( + "Geo Value %(geom_type)s must be of the same type %(geo_type)s \ + as fields", + geom_type=shape.geom_type.lower(), + geo_type=self.geo_type.lower(), + ) + raise TypeError(msg) + return shape + + def update_geo_db_column(self, model): + """Update the column type in the database.""" + cr = model._cr + query = """SELECT srid, type, coord_dimension + FROM geometry_columns + WHERE f_table_name = %s + AND f_geometry_column = %s""" + cr.execute(query, (model._table, self.name)) + check_data = cr.fetchone() + if not check_data: + raise TypeError( + _( + "geometry_columns table seems to be corrupted." + " SRID check is not possible" + ) + ) + if check_data[0] != self.srid: + raise TypeError( + _( + "Reprojection of column is not implemented." + " We can not change srid %(srid)s to %(data)s", + srid=self.srid, + data=check_data[0], + ) + ) + elif check_data[1] != self.geo_type.upper(): + raise TypeError( + _( + "Geo type modification is not implemented." + " We can not change type %(data)s to %(geo_type)s", + data=check_data[1], + geo_type=self.geo_type.upper(), + ) + ) + elif check_data[2] != self.dim: + raise TypeError( + _( + "Geo dimention modification is not implemented." + " We can not change dimention %(data)s to %(dim)s", + data=check_data[2], + dim=self.dim, + ) + ) + if self.gist_index: + create_geo_index(cr, self.name, model._table) + return True + + def update_db_column(self, model, column): + """Create/update the column corresponding to ``self``. + + For creation of geo column + + :param model: an instance of the field's model + :param column: the column's configuration (dict) + if it exists, or ``None`` + """ + # the column does not exist, create it + + if not column: + create_geo_column( + model._cr, + model._table, + self.name, + self.geo_type.upper(), + self.srid, + self.dim, + self.string, + ) + if self.gist_index: + create_geo_index(model._cr, self.name, model._table) + return + + if column["udt_name"] == self.column_type[0]: + if self.gist_index: + create_geo_index(model._cr, self.name, model._table) + return + + self.update_geo_db_column(model) + + if column["udt_name"] in self.column_cast_from: + sql.convert_column(model._cr, model._table, self.name, self.column_type[1]) + else: + newname = (self.name + "_moved{}").format + i = 0 + while sql.column_exists(model._cr, model._table, newname(i)): + i += 1 + if column["is_nullable"] == "NO": + sql.drop_not_null(model._cr, model._table, self.name) + sql.rename_column(model._cr, model._table, self.name, newname(i)) + sql.create_column( + model._cr, model._table, self.name, self.column_type[1], self.string + ) + + +class GeoLine(GeoField): + """Field for POSTGIS geometry Line type""" + + type = "geo_line" + geo_type = "LineString" + + @classmethod + def from_points(cls, cr, point1, point2, srid=None): + """ + Converts given points in parameter to a line. + :param cr: DB cursor + :param point1: Point (BaseGeometry) + :param point2: Point (BaseGeometry) + :param srid: SRID + :return: LINESTRING Object + """ + sql = """ + SELECT + ST_MakeLine( + ST_GeomFromText(%(wkt1)s, %(srid)s), + ST_GeomFromText(%(wkt2)s, %(srid)s) + ) + """ + cr.execute( + sql, + { + "wkt1": point1.wkt, + "wkt2": point2.wkt, + "srid": srid or cls.srid, + }, + ) + res = cr.fetchone() + return cls.load_geo(res[0]) + + +class GeoPoint(GeoField): + """Field for POSTGIS geometry Point type""" + + type = "geo_point" + geo_type = "Point" + + @classmethod + def from_latlon(cls, cr, latitude, longitude): + """Convert a (latitude, longitude) into an UTM coordinate Point:""" + pt = Point(longitude, latitude) + cr.execute( + """ + SELECT + ST_Transform( + ST_GeomFromText(%(wkt)s, 4326), + %(srid)s) + """, + {"wkt": pt.wkt, "srid": cls.srid}, + ) + res = cr.fetchone() + return cls.load_geo(res[0]) + + @classmethod + def to_latlon(cls, cr, geopoint): + """Convert a UTM coordinate point to \ + (latitude, longitude):""" + # Line to execute to retrieve + # longitude, latitude from UTM in postgres command line: + # SELECT ST_X(geom), ST_Y(geom) FROM (SELECT ST_TRANSFORM(ST_SetSRID( + # ST_MakePoint(601179.61612, 6399375,681364), + # ..............900913), 4326) as geom) g; + if isinstance(geopoint, BaseGeometry): + geo_point_instance = geopoint + else: + geo_point_instance = shape(json.loads(geopoint)) + cr.execute( + """ + SELECT + ST_TRANSFORM( + ST_SetSRID( + ST_MakePoint( + %(coord_x)s, %(coord_y)s + ), + %(srid)s + ), 4326)""", + { + "coord_x": geo_point_instance.x, + "coord_y": geo_point_instance.y, + "srid": cls.srid, + }, + ) + + res = cr.fetchone() + point_latlon = cls.load_geo(res[0]) + return point_latlon.x, point_latlon.y + + +class GeoPolygon(GeoField): + """Field for POSTGIS geometry Polygon type""" + + type = "geo_polygon" + geo_type = "Polygon" + + +class GeoMultiLine(GeoField): + """Field for POSTGIS geometry MultiLine type""" + + type = "geo_multi_line" + geo_type = "MultiLineString" + + +class GeoMultiPoint(GeoField): + """Field for POSTGIS geometry MultiPoint type""" + + type = "geo_multi_point" + geo_type = "MultiPoint" + + +class GeoMultiPolygon(GeoField): + """Field for POSTGIS geometry MultiPolygon type""" + + type = "geo_multi_polygon" + geo_type = "MultiPolygon" + + +fields.GeoLine = GeoLine +fields.GeoPoint = GeoPoint +fields.GeoPolygon = GeoPolygon +fields.GeoMultiLine = GeoMultiLine +fields.GeoMultiPoint = GeoMultiPoint +fields.GeoMultiPolygon = GeoMultiPolygon diff --git a/base_geoengine/geo_convertion_helper.py b/base_geoengine/geo_convertion_helper.py new file mode 100644 index 0000000000..faa015c3f2 --- /dev/null +++ b/base_geoengine/geo_convertion_helper.py @@ -0,0 +1,42 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import logging + +from odoo import _ + +try: + import geojson + from shapely import wkb, wkt + from shapely.geometry import shape + from shapely.geometry.base import BaseGeometry +except ImportError: + logger = logging.getLogger(__name__) + logger.warning(_("Shapely or geojson are not available in the sys path")) + + +def value_to_shape(value, use_wkb=False): + """Transforms input into a Shapely object""" + if not value: + return wkt.loads("GEOMETRYCOLLECTION EMPTY") + if isinstance(value, str): + # We try to do this before parsing json exception + # exception are ressource costly + if "{" in value: + geo_dict = geojson.loads(value) + return shape(geo_dict) + elif use_wkb: + return wkb.loads(value, hex=True) + else: + return wkt.loads(value) + elif hasattr(value, "wkt"): + if isinstance(value, BaseGeometry): + return value + else: + return wkt.loads(value.wkt) + else: + raise TypeError( + _( + "Write/create/search geo type must be wkt/geojson " + "string or must respond to wkt" + ) + ) diff --git a/base_geoengine/geo_db.py b/base_geoengine/geo_db.py new file mode 100644 index 0000000000..9c8e4b6332 --- /dev/null +++ b/base_geoengine/geo_db.py @@ -0,0 +1,90 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +"""Helper to setup Postgis""" + +import logging + +from odoo import _ +from odoo.exceptions import MissingError +from odoo.tools import sql + +logger = logging.getLogger("geoengine.sql") +_schema = logging.getLogger("odoo.schema") + + +def init_postgis(env): + """Initialize postgis + Add PostGIS support to the database. PostGIS is a spatial database + extender for PostgreSQL object-relational database. It adds support for + geographic objects allowing location queries to be run in SQL. + """ + cr = env.cr + cr.execute( + """ + SELECT + tablename + FROM + pg_tables + WHERE + tablename='spatial_ref_sys'; + """ + ) + check = cr.fetchone() + if check: + return {} + try: + cr.execute( + """ + CREATE EXTENSION postgis; + CREATE EXTENSION postgis_topology; + """ + ) + except Exception as exc: + raise MissingError( + _( + "Error, can not automatically initialize spatial postgis" + " support. Database user may have to be superuser and" + " postgres/postgis extensions with their devel header have" + " to be installed. If you do not want Odoo to connect with a" + " super user you can manually prepare your database. To do" + " this, open a client to your database using a super user and" + " run:\n" + "CREATE EXTENSION postgis;\n" + "CREATE EXTENSION postgis_topology;\n" + ) + ) from exc + + +def create_geo_column(cr, tablename, columnname, geotype, srid, dim, comment=None): + """Create a geometry column with the given type. + + :params: srid: geometry's projection srid + :params: dim: geometry's dimension (2D or 3D) + """ + cr.execute( + "SELECT AddGeometryColumn( %s, %s, %s, %s, %s)", + (tablename, columnname, srid, geotype, dim), + ) + if comment: + # pylint: disable=E8103 + cr.execute( + f'COMMENT ON COLUMN "{tablename}"."{columnname}" IS %s', + (comment,), + ) + _schema.debug( + "Table %r: added geometry column %r of type %s", tablename, columnname, geotype + ) + + +def _postgis_index_name(table, col_name): + return f"{table}_{col_name}_gist_index" + + +def create_geo_index(cr, columnname, tablename): + """Create the given index unless it exists.""" + indexname = _postgis_index_name(tablename, columnname) + if sql.index_exists(cr, indexname): + return + # pylint: disable=E8103 + cr.execute(f"CREATE INDEX {indexname} ON {tablename} USING GIST ( {columnname} )") + _schema.debug("Table %r: created index %r", tablename, indexname) diff --git a/base_geoengine/geo_operators.py b/base_geoengine/geo_operators.py new file mode 100644 index 0000000000..8be01f44e1 --- /dev/null +++ b/base_geoengine/geo_operators.py @@ -0,0 +1,75 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +class GeoOperator: + def __init__(self, geo_field): + self.geo_field = geo_field + + def _get_direct_como_op_sql(self, table, col, value, params, op=""): + """provide raw sql for geater and lesser operators""" + if isinstance(value, int | float): + return f" ST_Area({table}.{col}) {op} {value}" + else: + base = self.geo_field.entry_to_shape(value, same_type=False) + params.append(base.wkt) + return f" ST_Area({table}.{col}) {op} ST_Area(ST_GeomFromText(%s))" + + def _get_postgis_comp_sql(self, table, col, value, params, op=""): + """return raw sql for all search based on St_**(a, b) posgis operator""" + base = self.geo_field.entry_to_shape(value, same_type=False) + srid = self.geo_field.srid + params.append(base.wkt) + params.append(srid) + return f"{op}({table}.{col}, ST_GeomFromText(%s, %s))" + + def get_geo_greater_sql(self, table, col, value, params): + """Returns raw sql for geo_greater operator + (used for area comparison) + """ + return self._get_direct_como_op_sql(table, col, value, params, op=">") + + def get_geo_lesser_sql(self, table, col, value, params): + """Returns raw sql for geo_lesser operator + (used for area comparison)""" + return self._get_direct_como_op_sql(table, col, value, params, op="<") + + def get_geo_equal_sql( + self, + table, + col, + value, + params, + ): + """Returns raw sql for geo_equal operator + (used for equality comparison) + """ + base = self.geo_field.entry_to_shape(value, same_type=False) + compare_to = "ST_GeomFromText(%s)" + params.append(base.wkt) + return f" {table}.{col} = {compare_to}" + + def get_geo_intersect_sql(self, table, col, value, params): + """Returns raw sql for geo_intersec operator + (used for spatial comparison) + """ + return self._get_postgis_comp_sql(table, col, value, params, op="ST_Intersects") + + def get_geo_touch_sql(self, table, col, value, params): + """Returns raw sql for geo_touch operator + (used for spatial comparison) + """ + return self._get_postgis_comp_sql(table, col, value, params, op="ST_Touches") + + def get_geo_within_sql(self, table, col, value, params): + """Returns raw sql for geo_within operator + (used for spatial comparison) + """ + return self._get_postgis_comp_sql(table, col, value, params, op="ST_Within") + + def get_geo_contains_sql(self, table, col, value, params): + """Returns raw sql for geo_contains operator + (used for spatial comparison) + """ + return self._get_postgis_comp_sql(table, col, value, params, op="ST_Contains") diff --git a/base_geoengine/i18n/base_geoengine.pot b/base_geoengine/i18n/base_geoengine.pot new file mode 100644 index 0000000000..c4db43369c --- /dev/null +++ b/base_geoengine/i18n/base_geoengine.pot @@ -0,0 +1,995 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_geoengine +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "%s column does not exists or is not a geo field" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Active On Startup" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add new value" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add tag" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__attribute_field_id +msgid "Attribute field" +msgstr "" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_base +msgid "Base" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__basic +msgid "Basic" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__begin_color +msgid "Begin color class" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Classification" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__classification +msgid "Classification mode" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__code +msgid "Code" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__colored +msgid "Colored range/Chroma.js" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Colors" +msgstr "" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_view_menu +msgid "Configuration" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__gist_index +msgid "Create gist index" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_uid +msgid "Created by" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_date +msgid "Created on" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__custom +msgid "Custom" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_extent +msgid "Default map extent" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_zoom +msgid "Default map zoom" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params +msgid "Dictiorary of values for dimensions as JSON" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "Dimensions" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Discard" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_polygon_labels +msgid "Display Labels on Polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_name +msgid "Display Name" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__d_wms +msgid "Distant WMS" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Domain editing" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing Raster Layer" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing vector layer" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__end_color +msgid "End color class" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_db.py:0 +#, python-format +msgid "" +"Error, can not automatically initialize spatial postgis support. Database user may have to be superuser and postgres/postgis extensions with their devel header have to be installed. If you do not want Odoo to connect with a super user you can manually prepare your database. To do this, open a client to your database using a super user and run:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__ttype +msgid "Field Type" +msgstr "" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_model_fields +msgid "Fields" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "Format" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "General" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo Value %(geom_type)s must be of the same type %(geo_type)s" +" as fields" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo dimention modification is not implemented. We can not change dimention " +"%(data)s to %(dim)s" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_field_id +msgid "Geo field" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo type modification is not implemented. We can not change type %(data)s to" +" %(geo_type)s" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_ui_view__type__geoengine +msgid "GeoEngine" +msgstr "" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_menu +msgid "GeoEngine Backend" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "GeoEngine Data" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_view.esm.js:0 +#, python-format +msgid "Geoengine" +msgstr "" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_admin +msgid "Geoengine Admin" +msgstr "" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_user +msgid "Geoengine User" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__has_type +msgid "Has Type" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__id +msgid "ID" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__interval +msgid "Interval" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wms +msgid "Is Wms" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wmts +msgid "Is Wmts" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__overlay +msgid "Is overlay layer?" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type_id +msgid "Layer" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__name +msgid "Layer Name" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_opacity +msgid "Layer Opacity" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__sequence +msgid "Layer Priority" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_transparent +msgid "Layer Transparent" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Layer data" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__readonly +msgid "Layer is read only" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__sequence +msgid "Layer priority" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Layer will be shown on startup if checked." +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Layers (" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__linestring +msgid "LineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "List of dimensions separated by ','" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__matrix_set +msgid "Matrix set" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__max_extent +msgid "Max extent" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js:0 +#, python-format +msgid "Missing ${INFO_BOX_ATTRIBUTE} template." +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_name +msgid "Model" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_domain +msgid "Model Domain" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_id +msgid "Model to use" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_view_id +msgid "Model view" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multilinestring +msgid "MultiLineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipoint +msgid "MultiPoint" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipolygon +msgid "MultiPolygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__name +msgid "Name" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Need to provide at least a LAYERS param" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "New record" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "" +"No GeoEngine view defined for the model %s. Please " +"create a view or modify view mode" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "No raster layer for view %s" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__nb_class +msgid "Number of class" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.xml:0 +#, python-format +msgid "OPEN" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__odoo +msgid "Odoo field" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Odoo layer data (Not implemented)" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__field_id +msgid "Odoo layer field to use" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__opacity +msgid "Opacity" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__osm +msgid "OpenStreetMap" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Params" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Params Wms" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__point +msgid "Point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__polygon +msgid "Polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__dim +msgid "PostGIs Dimension" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__geo_type +msgid "PostGIs type" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__projection +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__projection +msgid "Projection" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__proportion +msgid "Proportional Symbol" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__quantile +msgid "Quantile" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Raster (Background layers)" +msgstr "" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_form_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_rater_action +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer +msgid "Raster Layer" +msgstr "" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_raster_layer_menu +msgid "Raster Layer Management" +msgstr "" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer_type +msgid "Raster Layer Type" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Raster Layer View" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__raster_type +msgid "Raster layer type" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__raster_layer_ids +msgid "Raster layers" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Rasters" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml:0 +#, python-format +msgid "Records (" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Related Model" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__view_id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__view_id +msgid "Related View" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Remove tag" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Representation" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_repr +msgid "Representation mode" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Reprojection of column is not implemented. We can not change srid %(srid)s " +"to %(data)s" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "Request encoding" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__resolutions +msgid "Resolutions" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__restricted_extent +msgid "Restricted map extent" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/search_bar_records/search_bar_records.xml:0 +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/search_bar_records/search_bar_records.xml:0 +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/search_bar_records/search_bar_records.xml:0 +#, python-format +msgid "Search..." +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__server_type +msgid "Server Type" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__service +msgid "Service" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__url +msgid "Service URL" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "Shapely or geojson are not available in the sys path" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field_input/domain_selector_geo_field_input.esm.js:0 +#, python-format +msgid "Subdomain" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "The geo_field_id must be a field in %s model" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__server_type +msgid "" +"The type of the remote WMS server: mapserver, geoserver, " +"carmentaserver, or qgis" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__unique +msgid "Unique value" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__units +msgid "Units" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__use_to_edit +msgid "Use to edit" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Vector" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Vector (Active layers)" +msgstr "" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_vector_geoengine_view_action +#: model:ir.model,name:base_geoengine.model_geoengine_vector_layer +msgid "Vector Layer" +msgstr "" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_vector_layer_menu +msgid "Vector Layer Management" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__vector_layer_ids +msgid "Vector layers" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Vectors" +msgstr "" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_view_menu +msgid "View Management" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__type +msgid "View Type" +msgstr "" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_action +msgid "Views" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMS options" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__wmts +msgid "WMTS" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMTS options" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "Warning" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "" +"Write/create/search geo type must be wkt/geojson string or must respond to " +"wkt" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "" +"You are about to create a new record without having displayed all the " +"others. A risk of overlap could occur. Would you like to continue ?" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "You must at least provide one of domain or geo_domain" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to provide an attribute that exists in %s model" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to select a numeric field" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__projection +msgid "eg. EPSG:21781" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "eg. REST" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__units +msgid "eg. m" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "eg. png" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_contains" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_equal" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_greater" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_intersect" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_lesser" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_line +msgid "geo_line" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_line +msgid "geo_multi_line" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_point +msgid "geo_multi_point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_polygon +msgid "geo_multi_polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_point +msgid "geo_point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_polygon +msgid "geo_polygon" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "geo_search is deprecated: uses search method defined on base model" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_touch" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_within" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"geometry_columns table seems to be corrupted. SRID check is not possible" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__begin_color +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__end_color +msgid "hex value" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "in active_ids" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "not in active_ids" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__srid +msgid "srid" +msgstr "" diff --git a/base_geoengine/i18n/es.po b/base_geoengine/i18n/es.po new file mode 100644 index 0000000000..9c09f6137e --- /dev/null +++ b/base_geoengine/i18n/es.po @@ -0,0 +1,1044 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_geoengine +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-08-08 11:10+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "%s column does not exists or is not a geo field" +msgstr "La columna %s no existe o no es un campo geográfico" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Active On Startup" +msgstr "Activo en el arranque" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add new value" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add tag" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__attribute_field_id +msgid "Attribute field" +msgstr "Campo de atributo" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_base +msgid "Base" +msgstr "Base/Fuente" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__basic +msgid "Basic" +msgstr "Básico" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__begin_color +msgid "Begin color class" +msgstr "Iniciar clase de color" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Classification" +msgstr "Clasificación" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__classification +msgid "Classification mode" +msgstr "Modo de clasificación" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__code +msgid "Code" +msgstr "Código" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__colored +msgid "Colored range/Chroma.js" +msgstr "Gama de colores/Chroma.js" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Colors" +msgstr "Colores" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_view_menu +msgid "Configuration" +msgstr "Configuración" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__gist_index +msgid "Create gist index" +msgstr "Crear un índice gist" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__custom +msgid "Custom" +msgstr "Personalizar" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_extent +msgid "Default map extent" +msgstr "Extensión predeterminada del mapa" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_zoom +msgid "Default map zoom" +msgstr "Zoom predeterminado del mapa" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params +msgid "Dictiorary of values for dimensions as JSON" +msgstr "Diccionario de valores de las dimensiones en formato JSON" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "Dimensions" +msgstr "Dimensiones" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Discard" +msgstr "Descartar" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_polygon_labels +msgid "Display Labels on Polygon" +msgstr "Mostrar etiquetas en el polígono" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__d_wms +msgid "Distant WMS" +msgstr "Sistema de gestión de almacenes (SGA) a distancia" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Domain editing" +msgstr "Editando Dominio" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing Raster Layer" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing vector layer" +msgstr "Edición de capas vectoriales" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__end_color +msgid "End color class" +msgstr "Fin de la clase de color" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_db.py:0 +#, python-format +msgid "" +"Error, can not automatically initialize spatial postgis support. Database " +"user may have to be superuser and postgres/postgis extensions with their " +"devel header have to be installed. If you do not want Odoo to connect with a " +"super user you can manually prepare your database. To do this, open a client " +"to your database using a super user and run:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" +msgstr "" +"Error, no se puede inicializar automáticamente el soporte espacial postgis. " +"El usuario de la base de datos debe ser superusuario y las extensiones " +"postgres/postgis con su cabecera devel deben estar instaladas. Si no quieres " +"que Odoo se conecte con un superusuario puedes preparar manualmente tu base " +"de datos. Para hacer esto, abre un cliente a tu base de datos usando un " +"superusuario y ejecuta\n" +"CREAR EXTENSIÓN postgis;\n" +"CREAR EXTENSIÓN postgis_topología;\n" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__ttype +msgid "Field Type" +msgstr "Tipo de campo" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_model_fields +msgid "Fields" +msgstr "Campos" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "Format" +msgstr "Formato" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "General" +msgstr "General" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo Value %(geom_type)s must be of the same type " +"%(geo_type)s as fields" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo dimention modification is not implemented. We can not change dimention " +"%(data)s to %(dim)s" +msgstr "" +"La modificación de la dimensión geográfica no está implementada. No podemos " +"cambiar la dimensión %(data)s a %(dim)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_field_id +msgid "Geo field" +msgstr "Campo geográfico" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo type modification is not implemented. We can not change type %(data)s to " +"%(geo_type)s" +msgstr "" +"La modificación del geotipo no está implementada. No podemos cambiar el tipo " +"%(data)s a %(geo_type)s" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_ui_view__type__geoengine +msgid "GeoEngine" +msgstr "GeoIngeniería" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_menu +msgid "GeoEngine Backend" +msgstr "Servidor de Geoingeniería" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "GeoEngine Data" +msgstr "Fecha de Geoingeniería" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_view.esm.js:0 +#, python-format +msgid "Geoengine" +msgstr "Geoingeniería" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_admin +msgid "Geoengine Admin" +msgstr "Administración de Geoingeniería" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_user +msgid "Geoengine User" +msgstr "Usuario de Geoingeniería" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__has_type +msgid "Has Type" +msgstr "Tiene Tipo" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__interval +msgid "Interval" +msgstr "Intervalo" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wms +msgid "Is Wms" +msgstr "Es Wms" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wmts +msgid "Is Wmts" +msgstr "Es Wmts" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__overlay +msgid "Is overlay layer?" +msgstr "¿Es una capa de superposición?" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type_id +msgid "Layer" +msgstr "Capa" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__name +msgid "Layer Name" +msgstr "nombre de Capa" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_opacity +msgid "Layer Opacity" +msgstr "Opacidad de la capa" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__sequence +msgid "Layer Priority" +msgstr "Prioridad de Capa" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_transparent +msgid "Layer Transparent" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Layer data" +msgstr "Fecha de Capa" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__readonly +msgid "Layer is read only" +msgstr "La capa es de sólo lectura" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__sequence +msgid "Layer priority" +msgstr "Prioridad de Capa" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Layer will be shown on startup if checked." +msgstr "La capa se mostrará al inicio si está marcada." + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Layers (" +msgstr "Capas (" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__linestring +msgid "LineString" +msgstr "Secuencia de líneas" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "List of dimensions separated by ','" +msgstr "Lista de dimensiones separadas por ','" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__matrix_set +msgid "Matrix set" +msgstr "Conjunto matriz" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__max_extent +msgid "Max extent" +msgstr "Extensión máxima" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js:0 +#, python-format +msgid "Missing ${INFO_BOX_ATTRIBUTE} template." +msgstr "Falta la plantilla ${INFO_BOX_ATTRIBUTE}." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_name +msgid "Model" +msgstr "Modelo" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_domain +msgid "Model Domain" +msgstr "Dominio del modelo" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_id +msgid "Model to use" +msgstr "Modelo a utilizar" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_view_id +msgid "Model view" +msgstr "Vista del modelo" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multilinestring +msgid "MultiLineString" +msgstr "Cadena multilínea" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipoint +msgid "MultiPoint" +msgstr "Punto Múltiple" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipolygon +msgid "MultiPolygon" +msgstr "Multipolígono" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__name +msgid "Name" +msgstr "Nombre" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Need to provide at least a LAYERS param" +msgstr "Necesidad de proporcionar al menos un parámetro de CAPAS" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "New record" +msgstr "Nuevo récord" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "" +"No GeoEngine view defined for the model %s. Please " +"create a view or modify view mode" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "No raster layer for view %s" +msgstr "No hay capa ráster para la vista %s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__nb_class +msgid "Number of class" +msgstr "Número de clase" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.xml:0 +#, python-format +msgid "OPEN" +msgstr "ABRIR" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__odoo +msgid "Odoo field" +msgstr "Campo de odoo" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Odoo layer data (Not implemented)" +msgstr "Datos de la capa Odoo (No implementado)" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__field_id +msgid "Odoo layer field to use" +msgstr "Campo de capa de Odoo a utilizar" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__opacity +msgid "Opacity" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__osm +msgid "OpenStreetMap" +msgstr "OpenStreetMap" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Params" +msgstr "Parámetros" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Params Wms" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__point +msgid "Point" +msgstr "Punto" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__polygon +msgid "Polygon" +msgstr "Polígono" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__dim +msgid "PostGIs Dimension" +msgstr "Dimensión PostGIs" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__geo_type +msgid "PostGIs type" +msgstr "Tipo PostGIs" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__projection +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__projection +msgid "Projection" +msgstr "Proyección" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__proportion +msgid "Proportional Symbol" +msgstr "Símbolo proporcional" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__quantile +msgid "Quantile" +msgstr "Cuantil" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Raster (Background layers)" +msgstr "Ráster (capas de fondo)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_form_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_rater_action +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer +msgid "Raster Layer" +msgstr "Capa Ráster" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_raster_layer_menu +msgid "Raster Layer Management" +msgstr "Gestión de capas rasterizadas" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer_type +msgid "Raster Layer Type" +msgstr "Tipo de capa rasterizada" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Raster Layer View" +msgstr "Vista de capa rasterizada" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__raster_type +msgid "Raster layer type" +msgstr "Tipo de capa rasterizada" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__raster_layer_ids +msgid "Raster layers" +msgstr "Capas Ráster" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Rasters" +msgstr "Rásteres" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml:0 +#, python-format +msgid "Records (" +msgstr "Registros (" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Related Model" +msgstr "Modelo relacionado" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__view_id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__view_id +msgid "Related View" +msgstr "Vista relacionada" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Remove tag" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Representation" +msgstr "Representación" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_repr +msgid "Representation mode" +msgstr "Modo de representación" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Reprojection of column is not implemented. We can not change srid %(srid)s " +"to %(data)s" +msgstr "" +"La reproyección de columna no está implementada. No podemos cambiar srid " +"%(srid)s por %(data)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "Request encoding" +msgstr "Solicitar codificación" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__resolutions +msgid "Resolutions" +msgstr "Resoluciones" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__restricted_extent +msgid "Restricted map extent" +msgstr "Extensión de mapa restringida" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/search_bar_records/search_bar_records.xml:0 +#, python-format +msgid "Search..." +msgstr "Buscar..." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__server_type +msgid "Server Type" +msgstr "Tipo de servidor" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__service +msgid "Service" +msgstr "Servicio" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__url +msgid "Service URL" +msgstr "URL de servicio" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "Shapely or geojson are not available in the sys path" +msgstr "Shapely o geojson no están disponibles en la ruta del sistema" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field_input/domain_selector_geo_field_input.esm.js:0 +#, python-format +msgid "Subdomain" +msgstr "Subdominio" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "The geo_field_id must be a field in %s model" +msgstr "El geo_field_id debe ser un campo del modelo %s" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__server_type +msgid "" +"The type of the remote WMS server: mapserver, geoserver, " +"carmentaserver, or qgis" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__unique +msgid "Unique value" +msgstr "Valor único" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__units +msgid "Units" +msgstr "Unidades" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__use_to_edit +msgid "Use to edit" +msgstr "Utilizar para editar" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Vector" +msgstr "Vector" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Vector (Active layers)" +msgstr "Vector (capas activas)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_vector_geoengine_view_action +#: model:ir.model,name:base_geoengine.model_geoengine_vector_layer +msgid "Vector Layer" +msgstr "Capa vectorial" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_vector_layer_menu +msgid "Vector Layer Management" +msgstr "Gestión de capas vectoriales" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__vector_layer_ids +msgid "Vector layers" +msgstr "Capas vectoriales" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Vectors" +msgstr "Vectores" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_ui_view +msgid "View" +msgstr "Vista" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_view_menu +msgid "View Management" +msgstr "Gestión de visualización" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__type +msgid "View Type" +msgstr "Tipo de vista" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_action +msgid "Views" +msgstr "Vistas" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMS options" +msgstr "Opciones WMS" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__wmts +msgid "WMTS" +msgstr "WMTS" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMTS options" +msgstr "Opciones WMTS" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "Warning" +msgstr "Aviso" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "" +"Write/create/search geo type must be wkt/geojson string or must respond to " +"wkt" +msgstr "" +"Write/create/search geo type debe ser wkt/geojson string o debe responder a " +"wkt" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "" +"You are about to create a new record without having displayed all the " +"others. A risk of overlap could occur. Would you like to continue ?" +msgstr "" +"Está a punto de crear un nuevo registro sin haber visualizado todos los " +"demás. Podría producirse un riesgo de solapamiento. ¿Desea continuar?" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "You must at least provide one of domain or geo_domain" +msgstr "Debe proporcionar al menos uno de los dominios o geo_domain" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to provide an attribute that exists in %s model" +msgstr "Necesita proporcionar un atributo que existe en el modelo %s" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to select a numeric field" +msgstr "Debe seleccionar un campo numérico" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__projection +msgid "eg. EPSG:21781" +msgstr "ej. EPSG:21781" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "eg. REST" +msgstr "ej. REST" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__units +msgid "eg. m" +msgstr "ej. m" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "eg. png" +msgstr "ej. png" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_contains" +msgstr "geo_contains (geo_contenedores)" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_equal" +msgstr "geo_equal (geo_igual)" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_greater" +msgstr "geo_greater (geo_mayor)" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_intersect" +msgstr "geo_intersect (geo_intersección)" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_lesser" +msgstr "geo_lesser (geo_menor)" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_line +msgid "geo_line" +msgstr "geo_line (geo_línea)" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_line +msgid "geo_multi_line" +msgstr "geo_multi_line (geo_multi_línea)" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_point +msgid "geo_multi_point" +msgstr "geo_multi_point (geo_multi_punto)" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_polygon +msgid "geo_multi_polygon" +msgstr "geo_multi_polygon (geo_multi_polígono)" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_point +msgid "geo_point" +msgstr "geo_point (geo_punto)" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_polygon +msgid "geo_polygon" +msgstr "geo_polygon (geo_polígono)" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "geo_search is deprecated: uses search method defined on base model" +msgstr "" +"geo_search está obsoleto: utiliza el método de búsqueda definido en el " +"modelo base" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_touch" +msgstr "geo_touch (geo_táctil)" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_within" +msgstr "geo_within (geo_interior)" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"geometry_columns table seems to be corrupted. SRID check is not possible" +msgstr "" +"La tabla geometry_columns parece estar dañada. No es posible comprobar el " +"SRID" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__begin_color +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__end_color +msgid "hex value" +msgstr "valor hexadecimal" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "in active_ids" +msgstr "En active_ids" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "not in active_ids" +msgstr "No en active_ids" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__srid +msgid "srid" +msgstr "srid" + +#, python-format +#~ msgid "" +#~ "Geo Value %(geom_type)s must be of the same type %(geo_type)s as fields" +#~ msgstr "" +#~ "Los valores geográficos %(geom_type)s deben ser del mismo tipo " +#~ "%(geo_type)s que los campos" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" + +#, python-format +#~ msgid "No GeoEngine view defined for the model %s" +#~ msgstr "No se definió una vista de GeoIngeniería para el modelo %s" + +#, python-format +#~ msgid "Please create a view or modify view mode" +#~ msgstr "Por favor, cree una vista o modifique el modo de vista" + +#~ msgid "" +#~ "The type of the remote WMS server: mapserver, geoserver, carmentaserver, " +#~ "or qgis" +#~ msgstr "" +#~ "Tipo de servidor WMS remoto: mapserver, geoserver, carmentaserver o qgis" diff --git a/base_geoengine/i18n/fr_BE.po b/base_geoengine/i18n/fr_BE.po new file mode 100644 index 0000000000..34ca132cd4 --- /dev/null +++ b/base_geoengine/i18n/fr_BE.po @@ -0,0 +1,1046 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_geoengine +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-15 06:18+0000\n" +"PO-Revision-Date: 2023-05-15 06:18+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "%s column does not exists or is not a geo field" +msgstr "%s la colonne n'existe pas ou n'est pas un champ géographique" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Active On Startup" +msgstr "Actif au démarrage" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add new value" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add tag" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__attribute_field_id +msgid "Attribute field" +msgstr "Attribut" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_base +msgid "Base" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__basic +msgid "Basic" +msgstr "Basique" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__begin_color +msgid "Begin color class" +msgstr "Début de la classe de couleur" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Classification" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__classification +msgid "Classification mode" +msgstr "Mode de classification" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__code +msgid "Code" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__colored +msgid "Colored range/Chroma.js" +msgstr "Plage de couleurs/Chroma.js" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Colors" +msgstr "Couleurs" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_view_menu +msgid "Configuration" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__gist_index +msgid "Create gist index" +msgstr "Création d'un index gist" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__custom +msgid "Custom" +msgstr "Personnalisable" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_extent +msgid "Default map extent" +msgstr "Étendue de la carte par défaut" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_zoom +msgid "Default map zoom" +msgstr "Zoom par défaut de la carte" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params +msgid "Dictiorary of values for dimensions as JSON" +msgstr "Liste de valeurs pour les dimensions sous forme de JSON" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "Dimensions" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Discard" +msgstr "Annuler" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_polygon_labels +msgid "Display Labels on Polygon" +msgstr "Afficher les étiquettes sur les polygones" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__d_wms +msgid "Distant WMS" +msgstr "WMS distant" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Domain editing" +msgstr "Édition du domaine" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing Raster Layer" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing vector layer" +msgstr "Edition de la couche vectorielle" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__end_color +msgid "End color class" +msgstr "Fin de la classe de couleur" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_db.py:0 +#, python-format +msgid "" +"Error, can not automatically initialize spatial postgis support. Database " +"user may have to be superuser and postgres/postgis extensions with their " +"devel header have to be installed. If you do not want Odoo to connect with a " +"super user you can manually prepare your database. To do this, open a client " +"to your database using a super user and run:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" +msgstr "" +"Erreur, impossible d'initialiser automatiquement le support spatial postigs. " +"L'utilisateur de la base de données doit être un super utilisateur et les " +"extensions postgres/postgis doivent être installées avec leurs en-tête " +"devel. Si vous ne voulez pas qu'Odoo se connecte avec un super utilisateur, " +"vous pouvez préparer manuellement votre base de données. Pour ce faire, " +"ouvrez un client à votre base de données en utilisant un super utilisateur " +"et exécutez:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__ttype +msgid "Field Type" +msgstr "Type de champ" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_model_fields +msgid "Fields" +msgstr "Champs" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "Format" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "General" +msgstr "Général" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo Value %(geom_type)s must be of the same type " +"%(geo_type)s as fields" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo dimention modification is not implemented. We can not change dimention " +"%(data)s to %(dim)s" +msgstr "" +"La modification de la dimension de la géométrie n'est pas implémentée. Nous " +"ne pouvons pas modifier la dimension %(data)s to %(dim)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_field_id +msgid "Geo field" +msgstr "Champ géographique" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo type modification is not implemented. We can not change type %(data)s to " +"%(geo_type)s" +msgstr "" +"La modification du type de la géométrie n'est pas implémentée. Nous ne " +"pouvons pas changer le type %(data)s to %(geo_type)s" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_ui_view__type__geoengine +msgid "GeoEngine" +msgstr "" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_menu +msgid "GeoEngine Backend" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "GeoEngine Data" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_view.esm.js:0 +#, python-format +msgid "Geoengine" +msgstr "" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_admin +msgid "Geoengine Admin" +msgstr "Admin Geoengine" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_user +msgid "Geoengine User" +msgstr "Utilisateur GeoEngine" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__has_type +msgid "Has Type" +msgstr "A le type" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__id +msgid "ID" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__interval +msgid "Interval" +msgstr "Intervalle" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wms +msgid "Is Wms" +msgstr "Est un Wms" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wmts +msgid "Is Wmts" +msgstr "Est un Wmts" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__overlay +msgid "Is overlay layer?" +msgstr "S'agit-il d'une couche superposée ?" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type_id +msgid "Layer" +msgstr "Couche" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__name +msgid "Layer Name" +msgstr "Nom de la couche" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_opacity +msgid "Layer Opacity" +msgstr "Opacité de la couche" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__sequence +msgid "Layer Priority" +msgstr "Priorité de la couche" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_transparent +msgid "Layer Transparent" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Layer data" +msgstr "Données de la couche" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__readonly +msgid "Layer is read only" +msgstr "La couche est en lecture seule" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__sequence +msgid "Layer priority" +msgstr "Priorité de la couche" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Layer will be shown on startup if checked." +msgstr "Si cette case est cochée, la couche sera affichée au démarrage" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Layers (" +msgstr "Couches (" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__linestring +msgid "LineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "List of dimensions separated by ','" +msgstr "Liste des dimensions séparées par ','" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__matrix_set +msgid "Matrix set" +msgstr "Ensemble matriciel" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__max_extent +msgid "Max extent" +msgstr "Étendue maximum" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js:0 +#, python-format +msgid "Missing ${INFO_BOX_ATTRIBUTE} template." +msgstr "Template ${INFO_BOX_ATTRIBUTE} manquant." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_name +msgid "Model" +msgstr "Modèle" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_domain +msgid "Model Domain" +msgstr "Domaine du modèle" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_id +msgid "Model to use" +msgstr "Modèle à utiliser" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_view_id +msgid "Model view" +msgstr "Vue du modèle" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multilinestring +msgid "MultiLineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipoint +msgid "MultiPoint" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipolygon +msgid "MultiPolygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__name +msgid "Name" +msgstr "Nom" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Need to provide at least a LAYERS param" +msgstr "Besoin de fournir au moins un paramètre LAYERS" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "New record" +msgstr "Nouvel enregistrement" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "" +"No GeoEngine view defined for the model %s. Please " +"create a view or modify view mode" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "No raster layer for view %s" +msgstr "Pas de couche d'arrière-plan pour la vue %s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__nb_class +msgid "Number of class" +msgstr "Nombre de classe" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.xml:0 +#, python-format +msgid "OPEN" +msgstr "OUVRIR" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__odoo +msgid "Odoo field" +msgstr "Champ Odoo" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Odoo layer data (Not implemented)" +msgstr "Données de couche Odoo (non implémenté)" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__field_id +msgid "Odoo layer field to use" +msgstr "Champ de couche Odoo à utiliser" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__opacity +msgid "Opacity" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__osm +msgid "OpenStreetMap" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Params" +msgstr "Paramètres" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Params Wms" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__point +msgid "Point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__polygon +msgid "Polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__dim +msgid "PostGIs Dimension" +msgstr "Dimension PostGIs" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__geo_type +msgid "PostGIs type" +msgstr "Type PostGIs" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__projection +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__projection +msgid "Projection" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__proportion +msgid "Proportional Symbol" +msgstr "Symbole proportionnel" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__quantile +msgid "Quantile" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Raster (Background layers)" +msgstr "Raster (Couches d'arrière-plan)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_form_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_rater_action +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer +msgid "Raster Layer" +msgstr "Couche d'arrière-plan" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_raster_layer_menu +msgid "Raster Layer Management" +msgstr "Gestion des couches d'arrière-plan" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer_type +msgid "Raster Layer Type" +msgstr "Type de couche d'arrière-plan" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Raster Layer View" +msgstr "Vue de la couche d'arrière-plan" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__raster_type +msgid "Raster layer type" +msgstr "Type de couche d'arrière-plan" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__raster_layer_ids +msgid "Raster layers" +msgstr "Couches d'arrière-plan" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Rasters" +msgstr "Couches d'arrière-plan" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml:0 +#, python-format +msgid "Records (" +msgstr "Enregistrements (" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Related Model" +msgstr "Modèle associé" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__view_id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__view_id +msgid "Related View" +msgstr "Vue associé" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Remove tag" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Representation" +msgstr "Représentation" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_repr +msgid "Representation mode" +msgstr "Mode de représentation" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Reprojection of column is not implemented. We can not change srid %(srid)s " +"to %(data)s" +msgstr "" +"La reprojection de la colonne n'est pas mise en oeuvre. Nous ne pouvons pas " +"modifier le srid %(srid)s to %(data)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "Request encoding" +msgstr "Demande d'encodage" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__resolutions +msgid "Resolutions" +msgstr "Résolutions" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__restricted_extent +msgid "Restricted map extent" +msgstr "Limitation de l'étendue de la carte" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Save" +msgstr "Sauvegarder" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/search_bar_records/search_bar_records.xml:0 +#, python-format +msgid "Search..." +msgstr "Rechercher..." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__server_type +msgid "Server Type" +msgstr "Type de serveur" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__service +msgid "Service" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__url +msgid "Service URL" +msgstr "URL du service" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "Shapely or geojson are not available in the sys path" +msgstr "" +"Shapely ou geojson ne sont pas disponibles dans le chemin d'accès système" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field_input/domain_selector_geo_field_input.esm.js:0 +#, python-format +msgid "Subdomain" +msgstr "Sous domaine" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "The geo_field_id must be a field in %s model" +msgstr "Le geo_field_id doit être un champ dans le modèle %s" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__server_type +msgid "" +"The type of the remote WMS server: mapserver, geoserver, " +"carmentaserver, or qgis" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__unique +msgid "Unique value" +msgstr "Valeur unique" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__units +msgid "Units" +msgstr "Unités" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__use_to_edit +msgid "Use to edit" +msgstr "Autorisation d'édition" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Vector" +msgstr "Vecteur" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Vector (Active layers)" +msgstr "Vecteur (couche actives)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_vector_geoengine_view_action +#: model:ir.model,name:base_geoengine.model_geoengine_vector_layer +msgid "Vector Layer" +msgstr "Couche vectorielle" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_vector_layer_menu +msgid "Vector Layer Management" +msgstr "Gestion des couches vectorielles" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__vector_layer_ids +msgid "Vector layers" +msgstr "Couches vectorielles" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Vectors" +msgstr "Couches vectorielles" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_ui_view +msgid "View" +msgstr "Vue" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_view_menu +msgid "View Management" +msgstr "Gestion des vues" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__type +msgid "View Type" +msgstr "Type de vue" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_action +msgid "Views" +msgstr "Vues" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMS options" +msgstr "Options du WMS" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__wmts +msgid "WMTS" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMTS options" +msgstr "Options du WMTS" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "Warning" +msgstr "Attention" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "" +"Write/create/search geo type must be wkt/geojson string or must respond to " +"wkt" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "" +"You are about to create a new record without having displayed all the " +"others. A risk of overlap could occur. Would you like to continue ?" +msgstr "" +"Vous êtes sur le point de créer un nouvel enregistrement sans avoir affiché " +"tous les autres. Un risque de chevauchement pourrait se produire. Voulez-" +"vous continuer ?" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "You must at least provide one of domain or geo_domain" +msgstr "Vous devez fournir au moins un domaine ou un géo-domaine" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to provide an attribute that exists in %s model" +msgstr "Vous devez fournir un attribut qui existe dans le modèle %s" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to select a numeric field" +msgstr "Vous devez sélectionner un champ numérique" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__projection +msgid "eg. EPSG:21781" +msgstr "ex. EPSG:21781" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "eg. REST" +msgstr "ex. REST" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__units +msgid "eg. m" +msgstr "ex. m" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "eg. png" +msgstr "ex. png" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_contains" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_equal" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_greater" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_intersect" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_lesser" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_line +msgid "geo_line" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_line +msgid "geo_multi_line" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_point +msgid "geo_multi_point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_polygon +msgid "geo_multi_polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_point +msgid "geo_point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_polygon +msgid "geo_polygon" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "geo_search is deprecated: uses search method defined on base model" +msgstr "" +"la méthode geo_search est dépréciée : utilisez la méthode search définie " +"dans le modèle de base" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_touch" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_within" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"geometry_columns table seems to be corrupted. SRID check is not possible" +msgstr "" +"La table geometry_columns semble être corrompue. La vérification de SRID " +"n'est pas possible" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__begin_color +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__end_color +msgid "hex value" +msgstr "valeur hexadécimale" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "in active_ids" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "not in active_ids" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__srid +msgid "srid" +msgstr "" + +#, python-format +#~ msgid "" +#~ "Geo Value %(geom_type)s must be of the same type %(geo_type)s as fields" +#~ msgstr "" +#~ "La valeur géographique %(geom_type)s doit être du même type %(geo_type)s " +#~ "queles champs" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" + +#, python-format +#~ msgid "No GeoEngine view defined for the model %s" +#~ msgstr "Aucune vue GeoEngine n'est définie pour le modèle %s" + +#, python-format +#~ msgid "Please create a view or modify view mode" +#~ msgstr "Veuillez créer une vue ou modifier le mode de vue" + +#~ msgid "" +#~ "The type of the remote WMS server: mapserver, geoserver, carmentaserver, " +#~ "or qgis" +#~ msgstr "" +#~ "Le type du serveur WMS distant: mapserver, geoserver, camentaserver, " +#~ "orqgis" diff --git a/base_geoengine/i18n/it.po b/base_geoengine/i18n/it.po new file mode 100644 index 0000000000..d870846088 --- /dev/null +++ b/base_geoengine/i18n/it.po @@ -0,0 +1,1043 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_geoengine +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-01-26 15:34+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "%s column does not exists or is not a geo field" +msgstr "La colonna %s non esiste, o non è un campo geo" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Active On Startup" +msgstr "Attivo all'avvio" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add new value" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add tag" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__attribute_field_id +msgid "Attribute field" +msgstr "Campo attributo" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_base +msgid "Base" +msgstr "Base" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__basic +msgid "Basic" +msgstr "Base" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__begin_color +msgid "Begin color class" +msgstr "Classe colore inizio" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Classification" +msgstr "Classificazione" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__classification +msgid "Classification mode" +msgstr "Modo di classificazione" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__code +msgid "Code" +msgstr "Codice" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__colored +msgid "Colored range/Chroma.js" +msgstr "Intervallo colorato/Chroma.js" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Colors" +msgstr "Colori" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_view_menu +msgid "Configuration" +msgstr "Configurazione" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__gist_index +msgid "Create gist index" +msgstr "Crea indice gist" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__custom +msgid "Custom" +msgstr "Personalizzato" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_extent +msgid "Default map extent" +msgstr "Estensione predefinita della mappa" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_zoom +msgid "Default map zoom" +msgstr "Zoom predefinito della mappa" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params +msgid "Dictiorary of values for dimensions as JSON" +msgstr "Dizionario JSON di valori delle dimensioni" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "Dimensions" +msgstr "Dimensioni" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Discard" +msgstr "Abbandona" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_polygon_labels +msgid "Display Labels on Polygon" +msgstr "Mostra etichette sul poligono" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__d_wms +msgid "Distant WMS" +msgstr "WMS remoto" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Domain editing" +msgstr "Modifica dminio" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing Raster Layer" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing vector layer" +msgstr "Modifica livello vettore" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__end_color +msgid "End color class" +msgstr "Classe colore fine" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_db.py:0 +#, python-format +msgid "" +"Error, can not automatically initialize spatial postgis support. Database " +"user may have to be superuser and postgres/postgis extensions with their " +"devel header have to be installed. If you do not want Odoo to connect with a " +"super user you can manually prepare your database. To do this, open a client " +"to your database using a super user and run:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" +msgstr "" +"Errore, impossibile inizializzare automaticamente il supporto spaziale " +"postgis. L'utente database deve essere superutente e le estensioni postgres/" +"postgis con le loro intestazioni devono essere installate. Se non si vuole " +"che Odoo si connetta con un super utente si può preparare manualmente il " +"database. Per questo, aprire un client verso il database utilizzando un " +"super utente ed eseguendo:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__ttype +msgid "Field Type" +msgstr "Tipo campo" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_model_fields +msgid "Fields" +msgstr "Campi" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "Format" +msgstr "Formato" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "General" +msgstr "Generale" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo Value %(geom_type)s must be of the same type " +"%(geo_type)s as fields" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo dimention modification is not implemented. We can not change dimention " +"%(data)s to %(dim)s" +msgstr "" +"La modifica della dimensione geo non è implementata. Non si possono cambiare " +"le dimensioni %(data)s a %(dim)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_field_id +msgid "Geo field" +msgstr "Campo geo" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo type modification is not implemented. We can not change type %(data)s to " +"%(geo_type)s" +msgstr "" +"La modifica del tipo geo non è implementata. Non si può cambiare il tipo " +"%(data)s a %(geo_type)s" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_ui_view__type__geoengine +msgid "GeoEngine" +msgstr "GeoEngine" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_menu +msgid "GeoEngine Backend" +msgstr "Backend GeoEngine" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "GeoEngine Data" +msgstr "Dati GeoEngine" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_view.esm.js:0 +#, python-format +msgid "Geoengine" +msgstr "GeoEngine" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_admin +msgid "Geoengine Admin" +msgstr "Amministratore Geoengine" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_user +msgid "Geoengine User" +msgstr "Utente GeoEngine" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__has_type +msgid "Has Type" +msgstr "Ha tipo" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__id +msgid "ID" +msgstr "ID" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__interval +msgid "Interval" +msgstr "Intervallo" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wms +msgid "Is Wms" +msgstr "È WMS" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wmts +msgid "Is Wmts" +msgstr "È WMTS" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__overlay +msgid "Is overlay layer?" +msgstr "È livello in sovraimpressione?" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type_id +msgid "Layer" +msgstr "Livello" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__name +msgid "Layer Name" +msgstr "Nome livello" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_opacity +msgid "Layer Opacity" +msgstr "Opacità ivello" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__sequence +msgid "Layer Priority" +msgstr "Priorità livello" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_transparent +msgid "Layer Transparent" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Layer data" +msgstr "Dati ivello" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__readonly +msgid "Layer is read only" +msgstr "Il ivello è in sola lettura" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__sequence +msgid "Layer priority" +msgstr "Priorità livello" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Layer will be shown on startup if checked." +msgstr "Il livello verrà mostrato all'avvio se selezionato." + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Layers (" +msgstr "Livelli (" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__linestring +msgid "LineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "List of dimensions separated by ','" +msgstr "Elenco dimensioni separate da ','" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__matrix_set +msgid "Matrix set" +msgstr "Set matrice" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__max_extent +msgid "Max extent" +msgstr "Estensione massima" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js:0 +#, python-format +msgid "Missing ${INFO_BOX_ATTRIBUTE} template." +msgstr "Modello ${INFO_BOX_ATTRIBUTE} non trovato." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_name +msgid "Model" +msgstr "Modello" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_domain +msgid "Model Domain" +msgstr "Dominio modello" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_id +msgid "Model to use" +msgstr "Modello da usare" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_view_id +msgid "Model view" +msgstr "Vista modello" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multilinestring +msgid "MultiLineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipoint +msgid "MultiPoint" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipolygon +msgid "MultiPolygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__name +msgid "Name" +msgstr "Nome" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Need to provide at least a LAYERS param" +msgstr "Serve fornire almeno un parametro LAYERS" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "New record" +msgstr "Nuovo record" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "" +"No GeoEngine view defined for the model %s. Please " +"create a view or modify view mode" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "No raster layer for view %s" +msgstr "Nessuno livello raster per la vista %s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__nb_class +msgid "Number of class" +msgstr "Numero di classi" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.xml:0 +#, python-format +msgid "OPEN" +msgstr "OPEN" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__odoo +msgid "Odoo field" +msgstr "Campo Odoo" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Odoo layer data (Not implemented)" +msgstr "Livello dati Odoo (non implementato)" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__field_id +msgid "Odoo layer field to use" +msgstr "Livello campo Odoo da usare" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__opacity +msgid "Opacity" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__osm +msgid "OpenStreetMap" +msgstr "OpenStreetMap" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Params" +msgstr "Parametri" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Params Wms" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__point +msgid "Point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__polygon +msgid "Polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__dim +msgid "PostGIs Dimension" +msgstr "Dimensione PostGIs" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__geo_type +msgid "PostGIs type" +msgstr "Tipo PostGIs" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__projection +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__projection +msgid "Projection" +msgstr "Proiezione" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__proportion +msgid "Proportional Symbol" +msgstr "Simbolo proporzionale" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__quantile +msgid "Quantile" +msgstr "Quantile" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Raster (Background layers)" +msgstr "Raster (livello di sfondo)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_form_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_rater_action +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer +msgid "Raster Layer" +msgstr "Livello raster" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_raster_layer_menu +msgid "Raster Layer Management" +msgstr "Gestione livello raster" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer_type +msgid "Raster Layer Type" +msgstr "Tipo livello raster" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Raster Layer View" +msgstr "Vista livello raster" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__raster_type +msgid "Raster layer type" +msgstr "Tipo livello raster" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__raster_layer_ids +msgid "Raster layers" +msgstr "Livelli raster" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Rasters" +msgstr "Raster" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml:0 +#, python-format +msgid "Records (" +msgstr "Record (" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Related Model" +msgstr "Modello correlato" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__view_id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__view_id +msgid "Related View" +msgstr "Viste correlata" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Remove tag" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Representation" +msgstr "Rappresentazione" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_repr +msgid "Representation mode" +msgstr "Modalità di rappresentazione" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Reprojection of column is not implemented. We can not change srid %(srid)s " +"to %(data)s" +msgstr "" +"Riproiezione della colonna nn implementata. Non si può modificare srid " +"%(srid)s a %(data)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "Request encoding" +msgstr "Codifica richiesta" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__resolutions +msgid "Resolutions" +msgstr "Risoluzione" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__restricted_extent +msgid "Restricted map extent" +msgstr "Estensione ristretta della mappa" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Save" +msgstr "Salva" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/search_bar_records/search_bar_records.xml:0 +#, python-format +msgid "Search..." +msgstr "Cerca..." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__server_type +msgid "Server Type" +msgstr "Tipo server" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__service +msgid "Service" +msgstr "Servizio" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__url +msgid "Service URL" +msgstr "URL servizio" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "Shapely or geojson are not available in the sys path" +msgstr "Shapely o geojson non sono disponibili nel path di sistema" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field_input/domain_selector_geo_field_input.esm.js:0 +#, python-format +msgid "Subdomain" +msgstr "Sottodominio" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "The geo_field_id must be a field in %s model" +msgstr "Il geo_field_id deve essere un campo nel modello %s" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__server_type +msgid "" +"The type of the remote WMS server: mapserver, geoserver, " +"carmentaserver, or qgis" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__unique +msgid "Unique value" +msgstr "Valore unico" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__units +msgid "Units" +msgstr "Unità" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__use_to_edit +msgid "Use to edit" +msgstr "Usa per modificare" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Vector" +msgstr "Vettore" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Vector (Active layers)" +msgstr "Vettore (livelli attivi)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_vector_geoengine_view_action +#: model:ir.model,name:base_geoengine.model_geoengine_vector_layer +msgid "Vector Layer" +msgstr "Livello vettoriale" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_vector_layer_menu +msgid "Vector Layer Management" +msgstr "Gestione livello vettoriale" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__vector_layer_ids +msgid "Vector layers" +msgstr "Livelli vettoriali" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Vectors" +msgstr "Vettori" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_ui_view +msgid "View" +msgstr "Vista" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_view_menu +msgid "View Management" +msgstr "Gestione vista" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__type +msgid "View Type" +msgstr "Tipo vista" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_action +msgid "Views" +msgstr "Viste" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMS options" +msgstr "Opzioni WMS" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__wmts +msgid "WMTS" +msgstr "WMTS" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMTS options" +msgstr "Opzioni WMTS" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "Warning" +msgstr "Attenzione" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "" +"Write/create/search geo type must be wkt/geojson string or must respond to " +"wkt" +msgstr "" +"Il tipo geo scrittura/creazione/ricerca deve essere una stringa wkt/geojson " +"odeve rispondere a wkt" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "" +"You are about to create a new record without having displayed all the " +"others. A risk of overlap could occur. Would you like to continue ?" +msgstr "" +"Si sta per creare un nuovo record senza aver disabilitato tutti gli altri. " +"C'è il rischio di sovrapposizione. Si vuole continuare?" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "You must at least provide one of domain or geo_domain" +msgstr "Bisogna fornire almeno un dominio o un geo_domain" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to provide an attribute that exists in %s model" +msgstr "Bisogna fornire un attributo che esista nel modello %s" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to select a numeric field" +msgstr "Bisogna selezionare un campo numerico" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__projection +msgid "eg. EPSG:21781" +msgstr "es. EPSG:21781" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "eg. REST" +msgstr "es. REST" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__units +msgid "eg. m" +msgstr "es. m" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "eg. png" +msgstr "es. png" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_contains" +msgstr "geo_contains" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_equal" +msgstr "geo_equal" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_greater" +msgstr "geo_greater" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_intersect" +msgstr "geo_intersect" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_lesser" +msgstr "geo_lesser" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_line +msgid "geo_line" +msgstr "geo_line" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_line +msgid "geo_multi_line" +msgstr "geo_multi_line" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_point +msgid "geo_multi_point" +msgstr "geo_multi_point" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_polygon +msgid "geo_multi_polygon" +msgstr "geo_multi_polygon" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_point +msgid "geo_point" +msgstr "geo_point" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_polygon +msgid "geo_polygon" +msgstr "geo_polygon" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "geo_search is deprecated: uses search method defined on base model" +msgstr "" +"geo_search è deprecat: usare il motodo ricerca definito nel modello base" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_touch" +msgstr "geo_touch" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_within" +msgstr "geo_within" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"geometry_columns table seems to be corrupted. SRID check is not possible" +msgstr "" +"la tabella geometry_columns sembra corrotta.Il controllo SRID non è possibile" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__begin_color +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__end_color +msgid "hex value" +msgstr "valore esadecimale" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "in active_ids" +msgstr "in active_ids" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "not in active_ids" +msgstr "not in active_ids" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__srid +msgid "srid" +msgstr "srid" + +#, python-format +#~ msgid "" +#~ "Geo Value %(geom_type)s must be of the same type %(geo_type)s as fields" +#~ msgstr "" +#~ "Il valore geo %(geom_type)s deve essere dello stesso tipo %(geo_type)s " +#~ "come i campi" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#, python-format +#~ msgid "No GeoEngine view defined for the model %s" +#~ msgstr "Nessuna vista GeoEngine definita per il modello %s" + +#, python-format +#~ msgid "Please create a view or modify view mode" +#~ msgstr "Creare una vista o modificare la modalità di visualizzazione" + +#~ msgid "" +#~ "The type of the remote WMS server: mapserver, geoserver, carmentaserver, " +#~ "or qgis" +#~ msgstr "" +#~ "Il tipo sel server WMS remoto: mapserver, geoserver, carmentaserver, o " +#~ "qgis" diff --git a/base_geoengine/i18n/sv.po b/base_geoengine/i18n/sv.po new file mode 100644 index 0000000000..b02fbf6175 --- /dev/null +++ b/base_geoengine/i18n/sv.po @@ -0,0 +1,1038 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_geoengine +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-02 13:38+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "%s column does not exists or is not a geo field" +msgstr "%s kolumnen finns inte eller är inte ett geofält" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Active On Startup" +msgstr "Aktiv vid uppstart" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add new value" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Add tag" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__attribute_field_id +msgid "Attribute field" +msgstr "Attributfält" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_base +msgid "Base" +msgstr "Bas" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__basic +msgid "Basic" +msgstr "Grundläggande" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__begin_color +msgid "Begin color class" +msgstr "Börja färgklass" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Classification" +msgstr "Klassificering" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__classification +msgid "Classification mode" +msgstr "Klassificeringsläge" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__code +msgid "Code" +msgstr "Kod" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__colored +msgid "Colored range/Chroma.js" +msgstr "Färgat område/Chroma.js" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Colors" +msgstr "Färger" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_view_menu +msgid "Configuration" +msgstr "Konfiguration" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__gist_index +msgid "Create gist index" +msgstr "Skapa huvudindex" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_uid +msgid "Created by" +msgstr "Skapad av" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__create_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__create_date +msgid "Created on" +msgstr "Skapad på" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__custom +msgid "Custom" +msgstr "Anpassad" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_extent +msgid "Default map extent" +msgstr "Standard kartomfattning" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__default_zoom +msgid "Default map zoom" +msgstr "Standard kartzoom" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params +msgid "Dictiorary of values for dimensions as JSON" +msgstr "Ordbok med värden för dimensioner som JSON" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "Dimensions" +msgstr "Dimensioner" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Discard" +msgstr "Kassera" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_polygon_labels +msgid "Display Labels on Polygon" +msgstr "Visa etiketter på polygon" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__display_name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__display_name +msgid "Display Name" +msgstr "Visningsnamn" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__d_wms +msgid "Distant WMS" +msgstr "Avlägsen WMS" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Domain editing" +msgstr "Domänredigering" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing Raster Layer" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js:0 +#, python-format +msgid "Editing vector layer" +msgstr "Redigera vektorlager" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__end_color +msgid "End color class" +msgstr "Avsluta färgklass" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_db.py:0 +#, python-format +msgid "" +"Error, can not automatically initialize spatial postgis support. Database " +"user may have to be superuser and postgres/postgis extensions with their " +"devel header have to be installed. If you do not want Odoo to connect with a " +"super user you can manually prepare your database. To do this, open a client " +"to your database using a super user and run:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" +msgstr "" +"Fel, kan inte automatiskt initiera spatial postgis-stöd. Databasanvändare " +"kan behöva vara superanvändare och postgres/postgis-tillägg med deras " +"utvecklingshuvud måste installeras. Om du inte vill att Odoo ska ansluta " +"till en superanvändare kan du manuellt förbereda din databas. För att göra " +"detta, öppna en klient till din databas med en superanvändare och kör:\n" +"CREATE EXTENSION postgis;\n" +"CREATE EXTENSION postgis_topology;\n" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__ttype +msgid "Field Type" +msgstr "Fälttyp" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_model_fields +msgid "Fields" +msgstr "Fält" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "Format" +msgstr "Format" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "General" +msgstr "Generell" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo Value %(geom_type)s must be of the same type " +"%(geo_type)s as fields" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo dimention modification is not implemented. We can not change dimention " +"%(data)s to %(dim)s" +msgstr "" +"Modifiering av geografisk dimension är inte implementerad. Vi kan inte ändra " +"dimension %(data)s till %(dim)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_field_id +msgid "Geo field" +msgstr "Geofält" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Geo type modification is not implemented. We can not change type %(data)s to " +"%(geo_type)s" +msgstr "" +"Ändring av geotyp är inte implementerad. Vi kan inte ändra typ %(data)s till " +"%(geo_type)s" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_ui_view__type__geoengine +msgid "GeoEngine" +msgstr "GeoMotor" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_base_menu +msgid "GeoEngine Backend" +msgstr "GeoMotor Backend" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "GeoEngine Data" +msgstr "GeoMotor data" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_view.esm.js:0 +#, python-format +msgid "Geoengine" +msgstr "Geomotor" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_admin +msgid "Geoengine Admin" +msgstr "Geomotor Admin" + +#. module: base_geoengine +#: model:res.groups,name:base_geoengine.group_geoengine_user +msgid "Geoengine User" +msgstr "Geomotor användare" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__has_type +msgid "Has Type" +msgstr "Har typ" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__id +msgid "ID" +msgstr "ID" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__interval +msgid "Interval" +msgstr "Intervall" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wms +msgid "Is Wms" +msgstr "Är Wms" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__is_wmts +msgid "Is Wmts" +msgstr "Är Wmts" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__overlay +msgid "Is overlay layer?" +msgstr "Är överläggslager?" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_uid +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_uid +msgid "Last Updated by" +msgstr "Senast uppdaterad av" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__write_date +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__write_date +msgid "Last Updated on" +msgstr "Senast uppdaterad på" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__type_id +msgid "Layer" +msgstr "Lager" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__name +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__name +msgid "Layer Name" +msgstr "Lagernamn" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_opacity +msgid "Layer Opacity" +msgstr "Lageropacitet" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__sequence +msgid "Layer Priority" +msgstr "Lagerprioritet" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__layer_transparent +msgid "Layer Transparent" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Layer data" +msgstr "Lagerdata" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__readonly +msgid "Layer is read only" +msgstr "Layer är skrivskyddad" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__sequence +msgid "Layer priority" +msgstr "Lagerprioritet" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__active_on_startup +msgid "Layer will be shown on startup if checked." +msgstr "Lager kommer att visas vid start om det är markerat." + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Layers (" +msgstr "Lager (" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__linestring +msgid "LineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__dimensions +msgid "List of dimensions separated by ','" +msgstr "Lista över dimensioner avgränsade med ','" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__matrix_set +msgid "Matrix set" +msgstr "Matris set" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__max_extent +msgid "Max extent" +msgstr "Max omfattning" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js:0 +#, python-format +msgid "Missing ${INFO_BOX_ATTRIBUTE} template." +msgstr "${INFO_BOX_ATTRIBUTE} mall saknas." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_name +msgid "Model" +msgstr "Modell" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_domain +msgid "Model Domain" +msgstr "Modelldomän" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_id +msgid "Model to use" +msgstr "Modell att använda" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__model_view_id +msgid "Model view" +msgstr "Modellvy" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multilinestring +msgid "MultiLineString" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipoint +msgid "MultiPoint" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__multipolygon +msgid "MultiPolygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__name +msgid "Name" +msgstr "Namn" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Need to provide at least a LAYERS param" +msgstr "Behöver tillhandahålla minst en LAGER parameter" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "New record" +msgstr "Ny post" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "" +"No GeoEngine view defined for the model %s. Please " +"create a view or modify view mode" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "No raster layer for view %s" +msgstr "Inget rasterlager för vyn %s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__nb_class +msgid "Number of class" +msgstr "Nummer av klass" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.xml:0 +#, python-format +msgid "OPEN" +msgstr "ÖPPNA" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__odoo +msgid "Odoo field" +msgstr "Odoofält" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Odoo layer data (Not implemented)" +msgstr "Odoo lagerdata (inte implementerad)" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__field_id +msgid "Odoo layer field to use" +msgstr "Odoo lagerfält att använda" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__opacity +msgid "Opacity" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__osm +msgid "OpenStreetMap" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Params" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__params_wms +msgid "Params Wms" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__point +msgid "Point" +msgstr "Peka" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__geo_type__polygon +msgid "Polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__dim +msgid "PostGIs Dimension" +msgstr "PostGIs dimension" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__geo_type +msgid "PostGIs type" +msgstr "PostGIs typ" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__projection +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__projection +msgid "Projection" +msgstr "Projektion" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__geo_repr__proportion +msgid "Proportional Symbol" +msgstr "Proportionell symbol" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__quantile +msgid "Quantile" +msgstr "Kvantil" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Raster (Background layers)" +msgstr "Raster (bakgrundslager)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_form_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_rater_action +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer +msgid "Raster Layer" +msgstr "Raster lager" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_raster_layer_menu +msgid "Raster Layer Management" +msgstr "Rasterlagerhantering" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_geoengine_raster_layer_type +msgid "Raster Layer Type" +msgstr "Rasterlagertyp" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "Raster Layer View" +msgstr "Rasterlagervy" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__raster_type +msgid "Raster layer type" +msgstr "Rasterlagertyp" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__raster_layer_ids +msgid "Raster layers" +msgstr "Rasterlager" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Rasters" +msgstr "Raster" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml:0 +#, python-format +msgid "Records (" +msgstr "Poster (" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Related Model" +msgstr "Relaterad modell" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__view_id +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__view_id +msgid "Related View" +msgstr "Relaterad vy" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_field_input_with_tags/domain_selector_field_input_with_tags.xml:0 +#, python-format +msgid "Remove tag" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_geoengine_view_form +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Representation" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_vector_layer__geo_repr +msgid "Representation mode" +msgstr "Representationsläge" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"Reprojection of column is not implemented. We can not change srid %(srid)s " +"to %(data)s" +msgstr "" +"Omprojektering av kolumn är inte implementerad. Vi kan inte ändra srid " +"%(srid)s till %(data)s" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "Request encoding" +msgstr "Begär kodning" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__resolutions +msgid "Resolutions" +msgstr "Upplösningar" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__restricted_extent +msgid "Restricted map extent" +msgstr "Begränsad kartutsträckning" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.xml:0 +#, python-format +msgid "Save" +msgstr "Spara" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/records_panel/search_bar_records/search_bar_records.xml:0 +#, python-format +msgid "Search..." +msgstr "Sök..." + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__server_type +msgid "Server Type" +msgstr "Servertyp" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer_type__service +msgid "Service" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__url +msgid "Service URL" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "Shapely or geojson are not available in the sys path" +msgstr "Shapely eller geojson är inte tillgängliga i sys-sökvägen" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field_input/domain_selector_geo_field_input.esm.js:0 +#, python-format +msgid "Subdomain" +msgstr "Subdomän" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "The geo_field_id must be a field in %s model" +msgstr "Värdet i geo_field_id fältet måste vara i %s modellen" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__server_type +msgid "" +"The type of the remote WMS server: mapserver, geoserver, " +"carmentaserver, or qgis" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_vector_layer__classification__unique +msgid "Unique value" +msgstr "Unikt värde" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__units +msgid "Units" +msgstr "Enheter" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_geoengine_raster_layer__use_to_edit +msgid "Use to edit" +msgstr "Använd för att redigera" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_vector_view_form +msgid "Vector" +msgstr "Vektor" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geoengine_view_form +msgid "Vector (Active layers)" +msgstr "Vektor (aktivt lager)" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_raster_action +#: model:ir.actions.act_window,name:base_geoengine.geo_vector_geoengine_view_action +#: model:ir.model,name:base_geoengine.model_geoengine_vector_layer +msgid "Vector Layer" +msgstr "Vektor lager" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_vector_layer_menu +msgid "Vector Layer Management" +msgstr "Vektor lagerhantering" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__vector_layer_ids +msgid "Vector layers" +msgstr "Vektor lager" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.xml:0 +#, python-format +msgid "Vectors" +msgstr "Vektorer" + +#. module: base_geoengine +#: model:ir.model,name:base_geoengine.model_ir_ui_view +msgid "View" +msgstr "Vy" + +#. module: base_geoengine +#: model:ir.ui.menu,name:base_geoengine.geoengine_view_menu +msgid "View Management" +msgstr "Visningshanterare" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_ui_view__type +msgid "View Type" +msgstr "Vytyp" + +#. module: base_geoengine +#: model:ir.actions.act_window,name:base_geoengine.geo_engine_view_action +msgid "Views" +msgstr "Vyer" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMS options" +msgstr "WMS alternativ" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__geoengine_raster_layer__raster_type__wmts +msgid "WMTS" +msgstr "" + +#. module: base_geoengine +#: model_terms:ir.ui.view,arch_db:base_geoengine.geo_raster_view_form +msgid "WMTS options" +msgstr "WMTS alternativ" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "Warning" +msgstr "Varning" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/geo_convertion_helper.py:0 +#, python-format +msgid "" +"Write/create/search geo type must be wkt/geojson string or must respond to " +"wkt" +msgstr "" +"Skriv/skapa/sök geotyp måste vara wkt/geojson-sträng eller måste svara på wkt" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js:0 +#, python-format +msgid "" +"You are about to create a new record without having displayed all the " +"others. A risk of overlap could occur. Would you like to continue ?" +msgstr "" +"Du är på väg att skapa en ny post utan att ha visat alla de andra. Det kan " +"uppstå risk för överlappning. Vill du fortsätta?" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "You must at least provide one of domain or geo_domain" +msgstr "Du måste åtminstone tillhandahålla en av domän eller geo_domän" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to provide an attribute that exists in %s model" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/geo_vector_layer.py:0 +#, python-format +msgid "You need to select a numeric field" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__projection +msgid "eg. EPSG:21781" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__request_encoding +msgid "eg. REST" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__units +msgid "eg. m" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_raster_layer__format_suffix +msgid "eg. png" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_contains" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_equal" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_greater" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_intersect" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_lesser" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_line +msgid "geo_line" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_line +msgid "geo_multi_line" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_point +msgid "geo_multi_point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_multi_polygon +msgid "geo_multi_polygon" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_point +msgid "geo_point" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields.selection,name:base_geoengine.selection__ir_model_fields__ttype__geo_polygon +msgid "geo_polygon" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/models/base.py:0 +#, python-format +msgid "geo_search is deprecated: uses search method defined on base model" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_touch" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_geo_field/domain_selector_geo_field.esm.js:0 +#, python-format +msgid "geo_within" +msgstr "" + +#. module: base_geoengine +#. odoo-python +#: code:addons/base_geoengine/fields.py:0 +#, python-format +msgid "" +"geometry_columns table seems to be corrupted. SRID check is not possible" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__begin_color +#: model:ir.model.fields,help:base_geoengine.field_geoengine_vector_layer__end_color +msgid "hex value" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "in active_ids" +msgstr "" + +#. module: base_geoengine +#. odoo-javascript +#: code:addons/base_geoengine/static/src/js/widgets/domain_selector_geo_field/domain_selector_number_field/domain_selector_number_field.esm.js:0 +#, python-format +msgid "not in active_ids" +msgstr "" + +#. module: base_geoengine +#: model:ir.model.fields,field_description:base_geoengine.field_ir_model_fields__srid +msgid "srid" +msgstr "" + +#, python-format +#~ msgid "" +#~ "Geo Value %(geom_type)s must be of the same type %(geo_type)s as fields" +#~ msgstr "" +#~ "Geovärde %(geom_type)s måste vara av samma typ %(geo_type)s som fält" + +#~ msgid "Last Modified on" +#~ msgstr "Senast modifierad på" + +#, python-format +#~ msgid "No GeoEngine view defined for the model %s" +#~ msgstr "Ingen GeoMotor-vy definierad för modellen %s" + +#, python-format +#~ msgid "Please create a view or modify view mode" +#~ msgstr "Vänligen skapa en vy eller ändra visningsläge" + +#~ msgid "" +#~ "The type of the remote WMS server: mapserver, geoserver, carmentaserver, " +#~ "or qgis" +#~ msgstr "" +#~ "Typen av fjärr-WMS-servern: mapserver, geoserver, carmentaserver eller " +#~ "qgis" diff --git a/base_geoengine/images/map-hover.png b/base_geoengine/images/map-hover.png new file mode 100644 index 0000000000..14799049f5 Binary files /dev/null and b/base_geoengine/images/map-hover.png differ diff --git a/base_geoengine/images/map.png b/base_geoengine/images/map.png new file mode 100644 index 0000000000..17214344b2 Binary files /dev/null and b/base_geoengine/images/map.png differ diff --git a/base_geoengine/models/__init__.py b/base_geoengine/models/__init__.py new file mode 100644 index 0000000000..7436a36f52 --- /dev/null +++ b/base_geoengine/models/__init__.py @@ -0,0 +1,26 @@ +############################################################################## +# +# Author: Nicolas Bessi +# Copyright 2011-2012 Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +"""Module that manages map view and vector/raster layer""" + +from . import base +from . import geo_raster_layer +from . import geo_vector_layer +from . import ir_view +from . import ir_model diff --git a/base_geoengine/models/base.py b/base_geoengine/models/base.py new file mode 100644 index 0000000000..c99f1cc65b --- /dev/null +++ b/base_geoengine/models/base.py @@ -0,0 +1,175 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# Copyright 2016 Yannick Payot (Camptocamp SA) +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import logging + +from odoo import _, api, models +from odoo.exceptions import MissingError, UserError +from odoo.osv.expression import AND + +from .. import fields as geo_fields + +DEFAULT_EXTENT = ( + "-123164.85222423, 5574694.9538936, " "1578017.6490538, 6186191.1800898" +) + +_logger = logging.getLogger(__name__) + + +class Base(models.AbstractModel): + """Extend Base class for to allow definition of geo fields.""" + + _inherit = "base" + + # Array of ash that define layer and data to use + _georepr = [] + + @api.model + def fields_get(self, allfields=None, attributes=None): + """Add geo_type definition for geo fields""" + res = super().fields_get(allfields=allfields, attributes=attributes) + for f_name in res: + field = self._fields.get(f_name) + if field and field.type.startswith("geo_"): + geo_type = { + "type": field.type, + "dim": int(field.dim), + "srid": field.srid, + "geo_type": field.geo_type, + } + # TODO + if field.compute or field.related: + if not field.dim: + geo_type["dim"] = 2 + if not field.srid: + geo_type["srid"] = 3857 + res[f_name]["geo_type"] = geo_type + return res + + @api.model + def _get_geo_view(self): + IrView = self.env["ir.ui.view"] + geo_view = IrView.sudo().search( + [("model", "=", self._name), ("type", "=", "geoengine")], + limit=1, + ) + if not geo_view: + raise UserError( + _( + "No GeoEngine view defined for the model %s. \ + Please create a view or modify view mode" + ) + % self._name, + ) + return geo_view + + @api.model + def set_field_real_name(self, in_tuple): + field_obj = self.env["ir.model.fields"] + if not in_tuple: + return in_tuple + name = field_obj.browse(in_tuple[0]).name + out = (in_tuple[0], name, in_tuple[1]) + return out + + @api.model + def get_geoengine_layers(self, view_id=None, view_type="geoengine", **options): + view_obj = self.env["ir.ui.view"] + + if not view_id: + view = self._get_geo_view() + else: + view = view_obj.browse(view_id) + geoengine_layers = { + "backgrounds": [], + "actives": [], + "projection": view.projection, + "restricted_extent": view.restricted_extent, + "default_extent": view.default_extent or DEFAULT_EXTENT, + "default_zoom": view.default_zoom, + } + + for layer in view.raster_layer_ids: + layer_dict = layer.read()[0] + geoengine_layers["backgrounds"].append(layer_dict) + for layer in view.vector_layer_ids: + layer_dict = layer.read()[0] + layer_dict["attribute_field_id"] = self.set_field_real_name( + layer_dict.get("attribute_field_id", False) + ) + layer_dict["geo_field_id"] = self.set_field_real_name( + layer_dict.get("geo_field_id", False) + ) + layer_dict["resModel"] = layer._name + layer_dict["model"] = layer.model_id.model + layer_dict["model_domain"] = layer.model_domain + geoengine_layers["actives"].append(layer_dict) + return geoengine_layers + + @api.model + def get_edit_info_for_geo_column(self, column): + raster_obj = self.env["geoengine.raster.layer"] + + field = self._fields.get(column) + if not field or not isinstance(field, geo_fields.GeoField): + raise ValueError( + _("%s column does not exists or is not a geo field") % column + ) + view = self._get_geo_view() + raster = raster_obj.search( + [("view_id", "=", view.id), ("use_to_edit", "=", True)], limit=1 + ) + if not raster: + raster = raster_obj.search([("view_id", "=", view.id)], limit=1) + if not raster: + raise MissingError(_("No raster layer for view %s") % (view.name,)) + return { + "edit_raster": raster.read()[0], + "srid": field.srid, + "projection": view.projection, + "restricted_extent": view.restricted_extent, + "default_extent": view.default_extent or DEFAULT_EXTENT, + "default_zoom": view.default_zoom, + } + + @api.model + def geo_search( + self, domain=None, geo_domain=None, offset=0, limit=None, order=None + ): + """Perform a geo search it allows direct domain: + geo_search( + domain=[('name', 'ilike', 'toto']), + geo_domain=[('the_point', 'geo_intersect', + myshaply_obj or mywkt or mygeojson)]) + + We can also support indirect geo_domain ( + ‘geom’, ‘geo_operator’, {‘res.zip.poly’: [‘id’, ‘in’, [1,2,3]] }) + + The supported operators are : + * geo_greater + * geo_lesser + * geo_equal + * geo_touch + * geo_within + * geo_contains + * geo_intersect""" + # First we do a standard search in order to apply security rules + # and do a search on standard attributes + # Limit and offset are managed after, we may loose a lot of performance + # here + _logger.debug( + _("geo_search is deprecated: uses search method defined on base model") + ) + domain = domain or [] + geo_domain = geo_domain or [] + search_domain = domain or [] + if domain and geo_domain: + search_domain = AND([domain, geo_domain]) + elif geo_domain: + search_domain = geo_domain + + if not search_domain: + raise ValueError(_("You must at least provide one of domain or geo_domain")) + + return self.search(search_domain, limit=limit, offset=offset, order=order) diff --git a/base_geoengine/models/geo_raster_layer.py b/base_geoengine/models/geo_raster_layer.py new file mode 100644 index 0000000000..c7d98662e0 --- /dev/null +++ b/base_geoengine/models/geo_raster_layer.py @@ -0,0 +1,90 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# Copyright 2016 Yannick Payot (Camptocamp SA) +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class GeoRasterLayerType(models.Model): + _name = "geoengine.raster.layer.type" + _description = "Raster Layer Type" + + name = fields.Char(translate=True, required=True) + code = fields.Char(required=True) + service = fields.Char(required=True) + + +class GeoRasterLayer(models.Model): + _name = "geoengine.raster.layer" + _description = "Raster Layer" + _order = "sequence ASC, name" + + raster_type = fields.Selection( + [ + ("osm", "OpenStreetMap"), + ("wmts", "WMTS"), + ("d_wms", "Distant WMS"), + ("odoo", "Odoo field"), + ], + string="Raster layer type", + default="osm", + required=True, + ) + name = fields.Char("Layer Name", translate=True, required=True) + url = fields.Char("Service URL") + + # technical field to display or not wmts options + is_wmts = fields.Boolean(compute="_compute_is_wmts") + # technical field to display or not wms options + is_wms = fields.Boolean(compute="_compute_is_wms") + # wmts options + matrix_set = fields.Char("Matrix set") + format_suffix = fields.Char("Format", help="eg. png") + request_encoding = fields.Char("Request encoding", help="eg. REST") + projection = fields.Char(help="eg. EPSG:21781") + units = fields.Char(help="eg. m") # Not used + resolutions = fields.Char() + max_extent = fields.Char("Max extent") + dimensions = fields.Char(help="List of dimensions separated by ','") + params = fields.Char(help="Dictiorary of values for dimensions as JSON") + + # wms options + params_wms = fields.Char(help="Need to provide at least a LAYERS param") + server_type = fields.Char( + help="The type of the remote WMS server: mapserver, \ + geoserver, carmentaserver, or qgis", + ) + + # technical field to display or not layer type -- Not used + has_type = fields.Boolean(compute="_compute_has_type") + type_id = fields.Many2one( + "geoengine.raster.layer.type", "Layer", domain="[('service', '=', raster_type)]" + ) + type = fields.Char(related="type_id.code") + sequence = fields.Integer("Layer priority", default=6) + overlay = fields.Boolean("Is overlay layer?") + field_id = fields.Many2one( + "ir.model.fields", + "Odoo layer field to use", + domain=[("ttype", "ilike", "geo_"), ("model", "=", "view_id.model")], + ) + view_id = fields.Many2one( + "ir.ui.view", "Related View", domain=[("type", "=", "geoengine")], required=True + ) + use_to_edit = fields.Boolean("Use to edit") + opacity = fields.Float(default=1.0) + + @api.depends("raster_type", "is_wmts") + def _compute_has_type(self): + for rec in self: + rec.has_type = rec.raster_type == "is_wmts" + + @api.depends("raster_type") + def _compute_is_wmts(self): + for rec in self: + rec.is_wmts = rec.raster_type == "wmts" + + @api.depends("raster_type") + def _compute_is_wms(self): + for rec in self: + rec.is_wms = rec.raster_type == "d_wms" diff --git a/base_geoengine/models/geo_vector_layer.py b/base_geoengine/models/geo_vector_layer.py new file mode 100644 index 0000000000..f7c90460c2 --- /dev/null +++ b/base_geoengine/models/geo_vector_layer.py @@ -0,0 +1,157 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# Copyright 2016 Yannick Payot (Camptocamp SA) +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + +SUPPORTED_ATT = [ + "float", + "integer", + "integer_big", + "related", + "function", + "date", + "datetime", + "char", + "text", + "selection", +] + +NUMBER_ATT = ["float", "integer", "integer_big"] + + +class GeoVectorLayer(models.Model): + _name = "geoengine.vector.layer" + _description = "Vector Layer" + _order = "sequence ASC, name" + + geo_repr = fields.Selection( + [ + ("basic", "Basic"), + # Actually we have to think if we should separate it for colored + ("proportion", "Proportional Symbol"), + ("colored", "Colored range/Chroma.js"), + ], + string="Representation mode", + required=True, + ) + + classification = fields.Selection( + [ + ("unique", "Unique value"), + ("interval", "Interval"), + ("quantile", "Quantile"), + ("custom", "Custom"), + ], + string="Classification mode", + required=False, + ) + name = fields.Char("Layer Name", translate=True, required=True) + begin_color = fields.Char("Begin color class", required=False, help="hex value") + end_color = fields.Char( + "End color class", required=False, help="hex value", default="#FF680A" + ) + nb_class = fields.Integer("Number of class", default=1) + geo_field_id = fields.Many2one( + "ir.model.fields", + "Geo field", + required=True, + ondelete="cascade", + domain=[("ttype", "ilike", "geo_")], + ) + attribute_field_id = fields.Many2one( + "ir.model.fields", "Attribute field", domain=[("ttype", "in", SUPPORTED_ATT)] + ) + model_id = fields.Many2one( + "ir.model", + "Model to use", + store=True, + readonly=False, + compute="_compute_model_id", + ) + model_name = fields.Char(related="model_id.model", readonly=True) + + view_id = fields.Many2one( + "ir.ui.view", "Related View", domain=[("type", "=", "geoengine")], required=True + ) + sequence = fields.Integer("Layer Priority", default=6) + readonly = fields.Boolean("Layer is read only") + display_polygon_labels = fields.Boolean("Display Labels on Polygon") + active_on_startup = fields.Boolean( + help="Layer will be shown on startup if checked." + ) + layer_opacity = fields.Float(default=1.0) + model_domain = fields.Char(default="[]") + model_view_id = fields.Many2one( + "ir.ui.view", + "Model view", + domain=[("type", "=", "geoengine")], + compute="_compute_model_view_id", + readonly=False, + ) + layer_transparent = fields.Boolean() + + @api.constrains("geo_field_id", "model_id") + def _check_geo_field_id(self): + for rec in self: + if rec.model_id: + if not rec.geo_field_id.model_id == rec.model_id: + raise ValidationError( + _( + "The geo_field_id must be a field in %s model", + rec.model_id.display_name, + ) + ) + + @api.constrains("geo_repr", "attribute_field_id") + def _check_geo_repr(self): + for rec in self: + if ( + rec.attribute_field_id + and rec.attribute_field_id.ttype not in NUMBER_ATT + ): + if ( + rec.geo_repr == "colored" + and rec.classification != "unique" + or rec.geo_repr == "proportion" + ): + raise ValidationError( + _( + "You need to select a numeric field", + ) + ) + + @api.constrains("attribute_field_id", "geo_field_id") + def _check_if_attribute_in_geo_field(self): + for rec in self: + if rec.attribute_field_id and rec.geo_field_id: + if rec.attribute_field_id.model != rec.geo_field_id.model: + raise ValidationError( + _( + "You need to provide an attribute that exists in %s model", + rec.geo_field_id.model_id.display_name, + ) + ) + + @api.depends("model_id") + def _compute_model_view_id(self): + for rec in self: + if rec.model_id: + for view in rec.model_id.view_ids: + if view.type == "geoengine": + rec.model_view_id = view + else: + rec.model_view_id = "" + + @api.depends("geo_field_id", "view_id") + def _compute_model_id(self): + for rec in self: + if rec.view_id and rec.geo_field_id: + if rec.view_id.model != rec.geo_field_id.model: + rec.model_id = rec.geo_field_id.model_id + else: + rec.model_id = "" + else: + rec.model_id = "" diff --git a/base_geoengine/models/ir_model.py b/base_geoengine/models/ir_model.py new file mode 100644 index 0000000000..ba3f442186 --- /dev/null +++ b/base_geoengine/models/ir_model.py @@ -0,0 +1,51 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# Copyright 2023 Yannick Payot (Camptocamp SA) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + +from odoo.addons import base + +if "geoengine" not in base.models.ir_actions.VIEW_TYPES: + base.models.ir_actions.VIEW_TYPES.append(("geoengine", "Geoengine")) + +GEO_TYPES = [ + ("geo_polygon", "geo_polygon"), + ("geo_multi_polygon", "geo_multi_polygon"), + ("geo_point", "geo_point"), + ("geo_multi_point", "geo_multi_point"), + ("geo_line", "geo_line"), + ("geo_multi_line", "geo_multi_line"), +] + +GEO_TYPES_ONDELETE = { + "geo_polygon": "cascade", + "geo_multi_polygon": "cascade", + "geo_point": "cascade", + "geo_multi_point": "cascade", + "geo_line": "cascade", + "geo_multi_line": "cascade", +} + +POSTGIS_GEO_TYPES = [ + ("Point", "Point"), + ("MultiPoint", "MultiPoint"), + ("LineString", "LineString"), + ("MultiLineString", "MultiLineString"), + ("Polygon", "Polygon"), + ("MultiPolygon", "MultiPolygon"), +] + + +class IrModelField(models.Model): + _inherit = "ir.model.fields" + + srid = fields.Integer("srid", required=False) + geo_type = fields.Selection(POSTGIS_GEO_TYPES, string="PostGIs type") + dim = fields.Selection( + [("2", "2"), ("3", "3"), ("4", "4")], string="PostGIs Dimension", default="2" + ) + gist_index = fields.Boolean("Create gist index") + ttype = fields.Selection( + selection_add=GEO_TYPES, + ondelete=GEO_TYPES_ONDELETE, + ) diff --git a/base_geoengine/models/ir_view.py b/base_geoengine/models/ir_view.py new file mode 100644 index 0000000000..21c4695334 --- /dev/null +++ b/base_geoengine/models/ir_view.py @@ -0,0 +1,35 @@ +# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA) +# Copyright 2016-2023 Yannick Payot (Camptocamp SA) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class IrUIView(models.Model): + _inherit = "ir.ui.view" + + type = fields.Selection( + selection_add=[("geoengine", "GeoEngine")], + ondelete={"geoengine": "cascade"}, + ) + + raster_layer_ids = fields.One2many( + "geoengine.raster.layer", "view_id", "Raster layers", required=False + ) + + vector_layer_ids = fields.One2many( + "geoengine.vector.layer", "view_id", "Vector layers", required=True + ) + + projection = fields.Char(default="EPSG:3857", required=True) + default_extent = fields.Char( + "Default map extent", + default="-123164.85222423, 5574694.9538936, 1578017.6490538," + " 6186191.1800898", + ) + default_zoom = fields.Integer("Default map zoom") + restricted_extent = fields.Char("Restricted map extent") + + def _is_qweb_based_view(self, view_type): + if view_type == "geoengine": + return True + return super()._is_qweb_based_view(view_type) diff --git a/base_geoengine/pyproject.toml b/base_geoengine/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/base_geoengine/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/base_geoengine/readme/CONTRIBUTORS.md b/base_geoengine/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..7313dd40fb --- /dev/null +++ b/base_geoengine/readme/CONTRIBUTORS.md @@ -0,0 +1,25 @@ +- Nicolas Bessi \<\> +- Frederic Junod \<\> +- Yannick Payot \<\> +- Sandy Carter \<\> +- Laurent Mignon \<\> +- Jonathan Nemry \<\> +- David Lasley \<\> +- Daniel Reis \<\> +- Matthieu Dietrich \<\> +- Alan Ramos \<\> +- Damien Crier \<\> +- Cyril Gaudin \<\> +- Pierre Verkest \<\> +- Benjamin Willig \<\> +- Devendra Kavthekar \<\> +- Emanuel Cino \<\> +- Thomas Nowicki \<\> +- Alexandre Saunier \<\> +- Sandip Mangukiya \<\> +- Samuel Kouff \<\> +- [APSL-Nagarro](https://www.apsl.tech): + - Antoni Marroig \<\> + - Miquel Alzanillas \<\> +- Red Butay \<\> +- Sergio Sancho \<\> diff --git a/base_geoengine/readme/DESCRIPTION.md b/base_geoengine/readme/DESCRIPTION.md new file mode 100644 index 0000000000..3af0efdc10 --- /dev/null +++ b/base_geoengine/readme/DESCRIPTION.md @@ -0,0 +1,16 @@ +GeoEngine is an Odoo module that adds spatial/GIS capabilites to Odoo. +It will allow you to : + +- Visualize and query your business information on map +- Perform GeoBI and spatial query +- Configure your spatial layers and spatial datasources +- Extend Odoo models with spatial columns + +GeoEngine relies on [OpenLayers](http://openlayers.org) and +[PostgGIS](http://postgis.refractions.net/) technologies. + +Postgis is used to store spatial information in databases. OpenLayer is +used to represent spatial data in other words to show maps and the +different spatial layers. The GeoEngine module acts as a data provider +and as an OpenLayers configurator. It also provides a complete extension +to Odoo ORM. diff --git a/base_geoengine/readme/HISTORY.md b/base_geoengine/readme/HISTORY.md new file mode 100644 index 0000000000..77872b7ff7 --- /dev/null +++ b/base_geoengine/readme/HISTORY.md @@ -0,0 +1,123 @@ +## 16.0.1.0.0 (2023-03-20) + +- LayerSwitcher has been removed as it was not really practical. A + LayerPanel is now active. +- The geo_search method is now deprecated and replaced by the standard + odoo search method. +- The widget "geo_edit_map" attribute is no longer necessary as the + field is automatically detected by his type. We can also provide an + option attribute that allows us to pass an opacity and a color as + parameters. + +``` xml +
+ + + + + +
+``` + +- The method geo_search is now deprecated. We now need to use the + standard odoo search method. + +``` python +obj.search([("the_point","geo_intersect",{"dummy.zip.the_geom": [("id", "=", rec.id)]})]) +``` + +- We can now pass to the geoengine view a template to display the + information we want to see when clicking on a feature. + +``` xml + + + + + + + + +
    +
  • ZIP : +
  • +
  • Total Sales: +
  • +
+
+
+
+``` + +- We can now pass a model to use to a layer to display other information + on the map. + +``` xml + + + [('state', '=', 'hs')] + + HS retail machines + + basic + + #FF0000 + + 0.8 + +``` + +- There is some new features in the LayerPanel. + +1. If you are logged in as an admin, you have the possibility to edit + the layer by clicking on the edit button. This will open a dialog + box. Changes will appear in real time on the view. +2. If you are logged in as an admin, you can also change the domain of + the layer. If you are logged in as a user, changes will not be + persisted in the database. Changes will appear in real time on the + view. +3. If you are logged in as an admin, you can also change the sequence + of the layers by sliding them over each other. If you are logged in + as a user, changes will not be persisted in the database. + +- Widget domain is now implemented for geo field This means that the + geo-operators are also implemented and that there is the possibility + to add a sub-domain. If we want to add a domain that includes all the + records that are displayed in the geoengine view (active_ids). We can + use the two new operators : "in active_ids" and "not in active_ids". + These will automatically replace the marker with ids. Note that the + widget will indicate that the domain is invalid because of the marker. +- Creation of the RecordsPanel. This panel allows you to retrieve all + active records. You can click on record to get the movement to the + selected record. Two magnifying glass are also available. You can + click on the left one to zoom on the record. You can click on the + right one to get the original zoom. +- A search bar is also available. It allows you to perform a search into + the RecordsPanel. +- A button to open/close the panels is also available. +- The module has been translated in French. +- Now you can now make the geoengine view editable. Simply add editable + attribute in the geoengine view. + +``` xml + + + + + + + + + +
    +
  • ZIP : +
  • +
  • Total Sales: +
  • +
+
+
+
+ +Thanks to that, you can create new records by drawing them directly in the geoengine view. You can also edit record in the same view. +``` diff --git a/base_geoengine/readme/INSTALL.md b/base_geoengine/readme/INSTALL.md new file mode 100644 index 0000000000..c72a805b74 --- /dev/null +++ b/base_geoengine/readme/INSTALL.md @@ -0,0 +1,19 @@ +To install this module, you need to have [PostGIS](http://postgis.net/) +installed. + +On Ubuntu: + + .. code-block:: bash + +> sudo apt-get install postgis + +The module also requires two additional python libs: + +- [Shapely](http://pypi.python.org/pypi/Shapely) +- [geojson](http://pypi.python.org/pypi/geojson) + +When you will install the module this two additional libs will be +installed. + +For a complete documentation please refer to the [public +documenation](http://oca.github.io/geospatial/index.html) diff --git a/base_geoengine/readme/ROADMAP.md b/base_geoengine/readme/ROADMAP.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/base_geoengine/readme/ROADMAP.md @@ -0,0 +1 @@ + diff --git a/base_geoengine/readme/USAGE.md b/base_geoengine/readme/USAGE.md new file mode 100644 index 0000000000..6ddda6d33c --- /dev/null +++ b/base_geoengine/readme/USAGE.md @@ -0,0 +1,80 @@ +## Geoengine Demo + +1. As a user/admin, when I am in the Geoengine Demo module and I go to + the ZIP menu. When I click on an item in the list view, I get to the + form view showing me the different information about the ZIP. We can + see its ZIP, city, priority, total sales and his spatial + representation. +2. As a user, I can't modify the information in the form view. +3. As an admin, I can modify the information in the form view. I can + click on the bin button to clear the map and I can draw a new shape. +4. As a user, when I go the "Retail machines" tab and there are no + items to display, it does not show me anything. +5. As an admin, when I go the "Retail machines" tab and there are no + items to display, the list view of the retail machines suggests to + me to add a new line. +6. As a user/admin, if there are items to be displayed in the "Retail + machines" tab then I can click on an item and the retail machines + form view will be displayed. We can see its spatial representation + by going to "The point" tab and its attributes in "Attributes" tab. +7. As a user/admin, when I go to the geoengine zip view by clicking on + the map button at the top right of the screen. The geoengine view + appears with the first 80 results displayed on the map. The vector + layers selected are those defined as "active on startup" by the + admin. The selected raster layer is the first one that is not an + overlay layer. +8. As a user/admin, when I hover over an area on the map, the area + changes its style. +9. As a user/admin, when I click on an area, a popup appears an I can + see the different information about the area. If I click on the + cross, the popup will disappear. If I click somewhere else on the + map, the popup will also disappear. If I click on the about button, + then the form view will be displayed. +10. As a user/admin, when I use the paging system, then the results + displayed on the map are different (corresponding to the request). +11. As a user/admin, if we use the search bar, we can search results by + his zip or his city. +12. As an admin, if I change the sequence of layers with the handle + button then the change are persisted in database. +13. As a user, if I change the sequence of layers with the handle button + then the change are not persisted in database. There are just the + changes in the display. +14. As an admin, if I change the domain of a layer with the filter + button then the change are persisted in database. +15. As a user, if I change the domain of a layer with the filter button + then the change are not persisted in database. There are just the + changes in the display. +16. As an admin, I have the possibility to edit the layer with its + corresponding button. +17. As a user/admin, I can open/close LayerPanel with its button. +18. As a user/admin, I can open/close RecordsPanel with its button. +19. As a user/admin, when I click on a record in RecordsPanel, a move is + made on the map to the selected record. +20. As a user/admin, when I click on a record in RecordsPanel, I can + also click on the left magnifying glass to zoom on the record. +21. As a user/admin, when I click on a record in RecordsPanel, I can + also click on the right magnifying glass to get the original zoom. +22. As a user/admin, I can use the search bar to search in the + RecordsPanel. +23. As an admin,If the geoengine view is in edit mode, I can create new + records by drawing them in the view. +24. As an admin, If the geoengine view is in edit mode, I can modify its + spatial representation. + +## Geoengine Backend + +1. As an admin, if I go into the configuration of the raster layers and + it has elements, I can click on one and see its information. +2. As an admin, if I want to create a new raster layer, I can click on + "NEW" and fill out the form. The required fields for OpenStreetMap + type are "Layer Name" and "Related View". If we want to have a WMTS + (Web Map Tile Service) raster type. The required fields in addition + to the precedents are "Service URL", "Matrix set","Format", + "Projection" and "Resolutions". If we take WMS (Web Map Service) + raster type, then the required fields are "Layer Name", "Related + View", "Service URL", "Params", "Server Type". +3. As an admin,if I go into the configuration of the vector layers and + it has elements, I can click on one and see its information. +4. As an admin, if I want to create a new vector layer, I can click on + "NEW" and fill out the form. The required fields are "Layer Name", + "Related View", "Geo field" and "Representation mode". diff --git a/base_geoengine/security/data.xml b/base_geoengine/security/data.xml new file mode 100644 index 0000000000..37b6ba5fba --- /dev/null +++ b/base_geoengine/security/data.xml @@ -0,0 +1,22 @@ + + + + + Geoengine User + + + + Geoengine Admin + + + + + + + + + + + + + diff --git a/base_geoengine/security/ir.model.access.csv b/base_geoengine/security/ir.model.access.csv new file mode 100644 index 0000000000..44559f50ef --- /dev/null +++ b/base_geoengine/security/ir.model.access.csv @@ -0,0 +1,9 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_geo_user_vector_user,geoengine.user.vector.layer,base_geoengine.model_geoengine_vector_layer,base_geoengine.group_geoengine_user,1,0,0,0 +access_geo_admin_vector_user,geoengine.admin.vector.layer,base_geoengine.model_geoengine_vector_layer,base_geoengine.group_geoengine_admin,1,1,1,1 +access_geo_user_raster_user,geoengine.user.raster.layer,base_geoengine.model_geoengine_raster_layer,base_geoengine.group_geoengine_user,1,0,0,0 +access_geo_admin_raster_user,geoengine.admin.raster.layer,base_geoengine.model_geoengine_raster_layer,base_geoengine.group_geoengine_admin,1,1,1,1 +access_geo_user_raster_type_user,geoengine.user.raster.layer.type,base_geoengine.model_geoengine_raster_layer_type,base_geoengine.group_geoengine_user,1,0,0,0 +access_geo_admin_raster_type_user,geoengine.admin.raster.layer.type,base_geoengine.model_geoengine_raster_layer_type,base_geoengine.group_geoengine_admin,1,1,1,1 +access_geo_user_allmodels,ir.model,base.model_ir_model,base_geoengine.group_geoengine_user,1,0,0,0 +access_geo_user_allviews,ir.ui.view,base.model_ir_ui_view,base_geoengine.group_geoengine_user,1,0,0,0 diff --git a/base_geoengine/static/description/icon.png b/base_geoengine/static/description/icon.png new file mode 100644 index 0000000000..b698310eef Binary files /dev/null and b/base_geoengine/static/description/icon.png differ diff --git a/base_geoengine/static/description/index.html b/base_geoengine/static/description/index.html new file mode 100644 index 0000000000..54de0b054d --- /dev/null +++ b/base_geoengine/static/description/index.html @@ -0,0 +1,718 @@ + + + + + +Geospatial support for Odoo + + + +
+

Geospatial support for Odoo

+ + +

Beta License: AGPL-3 OCA/geospatial Translate me on Weblate Try me on Runboat

+

GeoEngine is an Odoo module that adds spatial/GIS capabilites to Odoo. +It will allow you to :

+
    +
  • Visualize and query your business information on map
  • +
  • Perform GeoBI and spatial query
  • +
  • Configure your spatial layers and spatial datasources
  • +
  • Extend Odoo models with spatial columns
  • +
+

GeoEngine relies on OpenLayers and +PostgGIS technologies.

+

Postgis is used to store spatial information in databases. OpenLayer is +used to represent spatial data in other words to show maps and the +different spatial layers. The GeoEngine module acts as a data provider +and as an OpenLayers configurator. It also provides a complete extension +to Odoo ORM.

+

Table of contents

+ +
+

Installation

+

To install this module, you need to have +PostGIS installed.

+

On Ubuntu:

+
+.. code-block:: bash
+
+ +
+sudo apt-get install postgis
+

The module also requires two additional python libs:

+ +

When you will install the module this two additional libs will be +installed.

+

For a complete documentation please refer to the public +documenation

+
+
+

Usage

+
+

Geoengine Demo

+
    +
  1. As a user/admin, when I am in the Geoengine Demo module and I go to +the ZIP menu. When I click on an item in the list view, I get to the +form view showing me the different information about the ZIP. We can +see its ZIP, city, priority, total sales and his spatial +representation.
  2. +
  3. As a user, I can’t modify the information in the form view.
  4. +
  5. As an admin, I can modify the information in the form view. I can +click on the bin button to clear the map and I can draw a new shape.
  6. +
  7. As a user, when I go the “Retail machines” tab and there are no +items to display, it does not show me anything.
  8. +
  9. As an admin, when I go the “Retail machines” tab and there are no +items to display, the list view of the retail machines suggests to +me to add a new line.
  10. +
  11. As a user/admin, if there are items to be displayed in the “Retail +machines” tab then I can click on an item and the retail machines +form view will be displayed. We can see its spatial representation +by going to “The point” tab and its attributes in “Attributes” tab.
  12. +
  13. As a user/admin, when I go to the geoengine zip view by clicking on +the map button at the top right of the screen. The geoengine view +appears with the first 80 results displayed on the map. The vector +layers selected are those defined as “active on startup” by the +admin. The selected raster layer is the first one that is not an +overlay layer.
  14. +
  15. As a user/admin, when I hover over an area on the map, the area +changes its style.
  16. +
  17. As a user/admin, when I click on an area, a popup appears an I can +see the different information about the area. If I click on the +cross, the popup will disappear. If I click somewhere else on the +map, the popup will also disappear. If I click on the about button, +then the form view will be displayed.
  18. +
  19. As a user/admin, when I use the paging system, then the results +displayed on the map are different (corresponding to the request).
  20. +
  21. As a user/admin, if we use the search bar, we can search results by +his zip or his city.
  22. +
  23. As an admin, if I change the sequence of layers with the handle +button then the change are persisted in database.
  24. +
  25. As a user, if I change the sequence of layers with the handle button +then the change are not persisted in database. There are just the +changes in the display.
  26. +
  27. As an admin, if I change the domain of a layer with the filter +button then the change are persisted in database.
  28. +
  29. As a user, if I change the domain of a layer with the filter button +then the change are not persisted in database. There are just the +changes in the display.
  30. +
  31. As an admin, I have the possibility to edit the layer with its +corresponding button.
  32. +
  33. As a user/admin, I can open/close LayerPanel with its button.
  34. +
  35. As a user/admin, I can open/close RecordsPanel with its button.
  36. +
  37. As a user/admin, when I click on a record in RecordsPanel, a move is +made on the map to the selected record.
  38. +
  39. As a user/admin, when I click on a record in RecordsPanel, I can +also click on the left magnifying glass to zoom on the record.
  40. +
  41. As a user/admin, when I click on a record in RecordsPanel, I can +also click on the right magnifying glass to get the original zoom.
  42. +
  43. As a user/admin, I can use the search bar to search in the +RecordsPanel.
  44. +
  45. As an admin,If the geoengine view is in edit mode, I can create new +records by drawing them in the view.
  46. +
  47. As an admin, If the geoengine view is in edit mode, I can modify its +spatial representation.
  48. +
+
+
+

Geoengine Backend

+
    +
  1. As an admin, if I go into the configuration of the raster layers and +it has elements, I can click on one and see its information.
  2. +
  3. As an admin, if I want to create a new raster layer, I can click on +“NEW” and fill out the form. The required fields for OpenStreetMap +type are “Layer Name” and “Related View”. If we want to have a WMTS +(Web Map Tile Service) raster type. The required fields in addition +to the precedents are “Service URL”, “Matrix set”,”Format”, +“Projection” and “Resolutions”. If we take WMS (Web Map Service) +raster type, then the required fields are “Layer Name”, “Related +View”, “Service URL”, “Params”, “Server Type”.
  4. +
  5. As an admin,if I go into the configuration of the vector layers and +it has elements, I can click on one and see its information.
  6. +
  7. As an admin, if I want to create a new vector layer, I can click on +“NEW” and fill out the form. The required fields are “Layer Name”, +“Related View”, “Geo field” and “Representation mode”.
  8. +
+
+
+ +
+

Changelog

+
+

16.0.1.0.0 (2023-03-20)

+
    +
  • LayerSwitcher has been removed as it was not really practical. A +LayerPanel is now active.
  • +
  • The geo_search method is now deprecated and replaced by the standard +odoo search method.
  • +
  • The widget “geo_edit_map” attribute is no longer necessary as the +field is automatically detected by his type. We can also provide an +option attribute that allows us to pass an opacity and a color as +parameters.
  • +
+
+<form>
+    <notebook colspan="4">
+        <page string="Geometry">
+            <field name="the_geom" options="{'opacity': 0.8, 'color': '#0000FF' }" />
+        </page>
+    </notebook>
+</form>
+
+
    +
  • The method geo_search is now deprecated. We now need to use the +standard odoo search method.
  • +
+
+obj.search([("the_point","geo_intersect",{"dummy.zip.the_geom": [("id", "=", rec.id)]})])
+
+
    +
  • We can now pass to the geoengine view a template to display the +information we want to see when clicking on a feature.
  • +
+
+<geoengine>
+    <field name="name" />
+    <field name="city" />
+    <field name="total_sales" />
+    <field name="the_geom" />
+    <templates>
+        <t t-name="info_box">
+            <field name="city" widget="badge" />
+            <ul>
+                <li>ZIP : <field name="name" />
+                </li>
+                <li>Total Sales: <field name="total_sales" />
+                </li>
+            </ul>
+        </t>
+    </templates>
+</geoengine>
+
+
    +
  • We can now pass a model to use to a layer to display other +information on the map.
  • +
+
+<record id="geoengine_vector_layer_hs_retail_machines" model="geoengine.vector.layer">
+    <field name="model_id" ref="base_geoengine_demo.model_geoengine_demo_automatic_retailing_machine"/>
+    <field name="model_domain">[('state', '=', 'hs')]</field>
+    <field name="geo_field_id" ref="base_geoengine_demo.field_geoengine_demo_automatic_retailing_machine__the_point"/>
+    <field name="name">HS retail machines</field>
+    <field name="view_id" ref="ir_ui_view_resbetterzipgeoview0" />
+    <field name="geo_repr">basic</field>
+    <field name="attribute_field_id" ref="base_geoengine_demo.field_geoengine_demo_automatic_retailing_machine__name"/>
+    <field name="begin_color">#FF0000</field>
+    <field name="display_polygon_labels" eval="0" />
+    <field name="layer_opacity">0.8</field>
+</record>
+
+
    +
  • There is some new features in the LayerPanel.
  • +
+
    +
  1. If you are logged in as an admin, you have the possibility to edit +the layer by clicking on the edit button. This will open a dialog +box. Changes will appear in real time on the view.
  2. +
  3. If you are logged in as an admin, you can also change the domain of +the layer. If you are logged in as a user, changes will not be +persisted in the database. Changes will appear in real time on the +view.
  4. +
  5. If you are logged in as an admin, you can also change the sequence of +the layers by sliding them over each other. If you are logged in as a +user, changes will not be persisted in the database.
  6. +
+
    +
  • Widget domain is now implemented for geo field This means that the +geo-operators are also implemented and that there is the possibility +to add a sub-domain. If we want to add a domain that includes all the +records that are displayed in the geoengine view (active_ids). We can +use the two new operators : “in active_ids” and “not in active_ids”. +These will automatically replace the marker with ids. Note that the +widget will indicate that the domain is invalid because of the +marker.
  • +
  • Creation of the RecordsPanel. This panel allows you to retrieve all +active records. You can click on record to get the movement to the +selected record. Two magnifying glass are also available. You can +click on the left one to zoom on the record. You can click on the +right one to get the original zoom.
  • +
  • A search bar is also available. It allows you to perform a search +into the RecordsPanel.
  • +
  • A button to open/close the panels is also available.
  • +
  • The module has been translated in French.
  • +
  • Now you can now make the geoengine view editable. Simply add editable +attribute in the geoengine view.
  • +
+
+<geoengine editable="1">
+    <field name="name" />
+    <field name="city" />
+    <field name="total_sales" />
+    <field name="the_geom" />
+    <field name="display_name" />
+    <templates>
+      <t t-name="info_box">
+        <field name="city" widget="badge" />
+        <ul>
+          <li>ZIP : <field name="name" />
+          </li>
+          <li>Total Sales: <field name="total_sales" />
+          </li>
+        </ul>
+      </t>
+    </templates>
+  </geoengine>
+
+Thanks to that, you can create new records by drawing them directly in the geoengine view. You can also edit record in the same view.
+
+
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/geospatial project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/base_geoengine/static/img/map-marker.png b/base_geoengine/static/img/map-marker.png new file mode 100644 index 0000000000..0968935837 Binary files /dev/null and b/base_geoengine/static/img/map-marker.png differ diff --git a/base_geoengine/static/lib/chromajs-2.4.2/LICENSE b/base_geoengine/static/lib/chromajs-2.4.2/LICENSE new file mode 100644 index 0000000000..7c59371671 --- /dev/null +++ b/base_geoengine/static/lib/chromajs-2.4.2/LICENSE @@ -0,0 +1,28 @@ +chroma.js - JavaScript library for color conversions + +Copyright (c) 2011-2015, Gregor Aisch +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. The name Gregor Aisch may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/base_geoengine/static/lib/chromajs-2.4.2/chroma.js b/base_geoengine/static/lib/chromajs-2.4.2/chroma.js new file mode 100644 index 0000000000..bff9550928 --- /dev/null +++ b/base_geoengine/static/lib/chromajs-2.4.2/chroma.js @@ -0,0 +1,58 @@ +/** + * chroma.js - JavaScript library for color conversions + * + * Copyright (c) 2011-2019, Gregor Aisch + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name Gregor Aisch may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ------------------------------------------------------- + * + * chroma.js includes colors from colorbrewer2.org, which are released under + * the following license: + * + * Copyright (c) 2002 Cynthia Brewer, Mark Harrower, + * and The Pennsylvania State University. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + * + * ------------------------------------------------------ + * + * Named colors are taken from X11 Color Names. + * http://www.w3.org/TR/css3-color/#svg-color + * + * @preserve + */ + +!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).chroma=e()}(this,(function(){"use strict";for(var r=function(r,e,n){return void 0===e&&(e=0),void 0===n&&(n=1),rn?n:r},e=r,n={},t=0,a=["Boolean","Number","String","Function","Array","Date","RegExp","Undefined","Null"];t255)&&(r._clipped=!0),r[n]=e(r[n],0,255)):3===n&&(r[n]=e(r[n],0,1));return r},limit:r,type:o,unpack:function(r,e){return void 0===e&&(e=null),r.length>=3?Array.prototype.slice.call(r):"object"==u(r[0])&&e?e.split("").filter((function(e){return void 0!==r[0][e]})).map((function(e){return r[0][e]})):r[0]},last:function(r){if(r.length<2)return null;var e=r.length-1;return"string"==c(r[e])?r[e].toLowerCase():null},PI:i,TWOPI:2*i,PITHIRD:i/3,DEG2RAD:i/180,RAD2DEG:180/i},h={format:{},autodetect:[]},s=l.last,d=l.clip_rgb,b=l.type,p=h,g=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=this;if("object"===b(r[0])&&r[0].constructor&&r[0].constructor===this.constructor)return r[0];var t=s(r),a=!1;if(!t){a=!0,p.sorted||(p.autodetect=p.autodetect.sort((function(r,e){return e.p-r.p})),p.sorted=!0);for(var f=0,o=p.autodetect;f4?r[4]:1;return 1===f?[0,0,0,o]:[n>=1?0:255*(1-n)*(1-f),t>=1?0:255*(1-t)*(1-f),a>=1?0:255*(1-a)*(1-f),o]},x=y,A=v,E=h,F=l.unpack,P=l.type,O=M;A.prototype.cmyk=function(){return O(this._rgb)},x.cmyk=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(A,[null].concat(r,["cmyk"])))},E.format.cmyk=_,E.autodetect.push({p:2,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=F(r,"cmyk"),"array"===P(r)&&4===r.length)return"cmyk"}});var j=l.unpack,G=l.last,R=function(r){return Math.round(100*r)/100},q=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=j(r,"hsla"),t=G(r)||"lsa";return n[0]=R(n[0]||0),n[1]=R(100*n[1])+"%",n[2]=R(100*n[2])+"%","hsla"===t||n.length>3&&n[3]<1?(n[3]=n.length>3?n[3]:1,t="hsla"):n.length=3,t+"("+n.join(",")+")"},L=l.unpack,I=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=(r=L(r,"rgba"))[0],t=r[1],a=r[2];n/=255,t/=255,a/=255;var f,o,u=Math.min(n,t,a),c=Math.max(n,t,a),i=(c+u)/2;return c===u?(f=0,o=Number.NaN):f=i<.5?(c-u)/(c+u):(c-u)/(2-c-u),n==c?o=(t-a)/(c-u):t==c?o=2+(a-n)/(c-u):a==c&&(o=4+(n-t)/(c-u)),(o*=60)<0&&(o+=360),r.length>3&&void 0!==r[3]?[o,f,i,r[3]]:[o,f,i]},B=l.unpack,C=l.last,D=q,Y=I,S=Math.round,T=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=B(r,"rgba"),t=C(r)||"rgb";return"hsl"==t.substr(0,3)?D(Y(n),t):(n[0]=S(n[0]),n[1]=S(n[1]),n[2]=S(n[2]),("rgba"===t||n.length>3&&n[3]<1)&&(n[3]=n.length>3?n[3]:1,t="rgba"),t+"("+n.slice(0,"rgb"===t?3:4).join(",")+")")},$=l.unpack,z=Math.round,X=function(){for(var r,e=[],n=arguments.length;n--;)e[n]=arguments[n];var t,a,f,o=(e=$(e,"hsl"))[0],u=e[1],c=e[2];if(0===u)t=a=f=255*c;else{var i=[0,0,0],l=[0,0,0],h=c<.5?c*(1+u):c+u-c*u,s=2*c-h,d=o/360;i[0]=d+1/3,i[1]=d,i[2]=d-1/3;for(var b=0;b<3;b++)i[b]<0&&(i[b]+=1),i[b]>1&&(i[b]-=1),6*i[b]<1?l[b]=s+6*(h-s)*i[b]:2*i[b]<1?l[b]=h:3*i[b]<2?l[b]=s+(h-s)*(2/3-i[b])*6:l[b]=s;t=(r=[z(255*l[0]),z(255*l[1]),z(255*l[2])])[0],a=r[1],f=r[2]}return e.length>3?[t,a,f,e[3]]:[t,a,f,1]},U=X,V=h,W=/^rgb\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*\)$/,K=/^rgba\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*([01]|[01]?\.\d+)\)$/,Z=/^rgb\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,H=/^rgba\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,J=/^hsl\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,Q=/^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,rr=Math.round,er=function(r){var e;if(r=r.toLowerCase().trim(),V.format.named)try{return V.format.named(r)}catch(r){}if(e=r.match(W)){for(var n=e.slice(1,4),t=0;t<3;t++)n[t]=+n[t];return n[3]=1,n}if(e=r.match(K)){for(var a=e.slice(1,5),f=0;f<4;f++)a[f]=+a[f];return a}if(e=r.match(Z)){for(var o=e.slice(1,4),u=0;u<3;u++)o[u]=rr(2.55*o[u]);return o[3]=1,o}if(e=r.match(H)){for(var c=e.slice(1,5),i=0;i<3;i++)c[i]=rr(2.55*c[i]);return c[3]=+c[3],c}if(e=r.match(J)){var l=e.slice(1,4);l[1]*=.01,l[2]*=.01;var h=U(l);return h[3]=1,h}if(e=r.match(Q)){var s=e.slice(1,4);s[1]*=.01,s[2]*=.01;var d=U(s);return d[3]=+e[4],d}};er.test=function(r){return W.test(r)||K.test(r)||Z.test(r)||H.test(r)||J.test(r)||Q.test(r)};var nr=y,tr=v,ar=h,fr=l.type,or=T,ur=er;tr.prototype.css=function(r){return or(this._rgb,r)},nr.css=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(tr,[null].concat(r,["css"])))},ar.format.css=ur,ar.autodetect.push({p:5,test:function(r){for(var e=[],n=arguments.length-1;n-- >0;)e[n]=arguments[n+1];if(!e.length&&"string"===fr(r)&&ur.test(r))return"css"}});var cr=v,ir=y,lr=l.unpack;h.format.gl=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=lr(r,"rgba");return n[0]*=255,n[1]*=255,n[2]*=255,n},ir.gl=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(cr,[null].concat(r,["gl"])))},cr.prototype.gl=function(){var r=this._rgb;return[r[0]/255,r[1]/255,r[2]/255,r[3]]};var hr=l.unpack,sr=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n,t=hr(r,"rgb"),a=t[0],f=t[1],o=t[2],u=Math.min(a,f,o),c=Math.max(a,f,o),i=c-u,l=100*i/255,h=u/(255-i)*100;return 0===i?n=Number.NaN:(a===c&&(n=(f-o)/i),f===c&&(n=2+(o-a)/i),o===c&&(n=4+(a-f)/i),(n*=60)<0&&(n+=360)),[n,l,h]},dr=l.unpack,br=Math.floor,pr=function(){for(var r,e,n,t,a,f,o=[],u=arguments.length;u--;)o[u]=arguments[u];var c,i,l,h=(o=dr(o,"hcg"))[0],s=o[1],d=o[2];d*=255;var b=255*s;if(0===s)c=i=l=d;else{360===h&&(h=0),h>360&&(h-=360),h<0&&(h+=360);var p=br(h/=60),g=h-p,v=d*(1-s),m=v+b*(1-g),y=v+b*g,k=v+b;switch(p){case 0:c=(r=[k,y,v])[0],i=r[1],l=r[2];break;case 1:c=(e=[m,k,v])[0],i=e[1],l=e[2];break;case 2:c=(n=[v,k,y])[0],i=n[1],l=n[2];break;case 3:c=(t=[v,m,k])[0],i=t[1],l=t[2];break;case 4:c=(a=[y,v,k])[0],i=a[1],l=a[2];break;case 5:c=(f=[k,v,m])[0],i=f[1],l=f[2]}}return[c,i,l,o.length>3?o[3]:1]},gr=l.unpack,vr=l.type,mr=y,yr=v,kr=h,wr=sr;yr.prototype.hcg=function(){return wr(this._rgb)},mr.hcg=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(yr,[null].concat(r,["hcg"])))},kr.format.hcg=pr,kr.autodetect.push({p:1,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=gr(r,"hcg"),"array"===vr(r)&&3===r.length)return"hcg"}});var Mr=l.unpack,Nr=l.last,_r=Math.round,xr=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=Mr(r,"rgba"),t=n[0],a=n[1],f=n[2],o=n[3],u=Nr(r)||"auto";void 0===o&&(o=1),"auto"===u&&(u=o<1?"rgba":"rgb");var c=(t=_r(t))<<16|(a=_r(a))<<8|(f=_r(f)),i="000000"+c.toString(16);i=i.substr(i.length-6);var l="0"+_r(255*o).toString(16);switch(l=l.substr(l.length-2),u.toLowerCase()){case"rgba":return"#"+i+l;case"argb":return"#"+l+i;default:return"#"+i}},Ar=/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,Er=/^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/,Fr=function(r){if(r.match(Ar)){4!==r.length&&7!==r.length||(r=r.substr(1)),3===r.length&&(r=(r=r.split(""))[0]+r[0]+r[1]+r[1]+r[2]+r[2]);var e=parseInt(r,16);return[e>>16,e>>8&255,255&e,1]}if(r.match(Er)){5!==r.length&&9!==r.length||(r=r.substr(1)),4===r.length&&(r=(r=r.split(""))[0]+r[0]+r[1]+r[1]+r[2]+r[2]+r[3]+r[3]);var n=parseInt(r,16);return[n>>24&255,n>>16&255,n>>8&255,Math.round((255&n)/255*100)/100]}throw new Error("unknown hex color: "+r)},Pr=y,Or=v,jr=l.type,Gr=h,Rr=xr;Or.prototype.hex=function(r){return Rr(this._rgb,r)},Pr.hex=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(Or,[null].concat(r,["hex"])))},Gr.format.hex=Fr,Gr.autodetect.push({p:4,test:function(r){for(var e=[],n=arguments.length-1;n-- >0;)e[n]=arguments[n+1];if(!e.length&&"string"===jr(r)&&[3,4,5,6,7,8,9].indexOf(r.length)>=0)return"hex"}});var qr=l.unpack,Lr=l.TWOPI,Ir=Math.min,Br=Math.sqrt,Cr=Math.acos,Dr=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n,t=qr(r,"rgb"),a=t[0],f=t[1],o=t[2],u=Ir(a/=255,f/=255,o/=255),c=(a+f+o)/3,i=c>0?1-u/c:0;return 0===i?n=NaN:(n=(a-f+(a-o))/2,n/=Br((a-f)*(a-f)+(a-o)*(f-o)),n=Cr(n),o>f&&(n=Lr-n),n/=Lr),[360*n,i,c]},Yr=l.unpack,Sr=l.limit,Tr=l.TWOPI,$r=l.PITHIRD,zr=Math.cos,Xr=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n,t,a,f=(r=Yr(r,"hsi"))[0],o=r[1],u=r[2];return isNaN(f)&&(f=0),isNaN(o)&&(o=0),f>360&&(f-=360),f<0&&(f+=360),(f/=360)<1/3?t=1-((a=(1-o)/3)+(n=(1+o*zr(Tr*f)/zr($r-Tr*f))/3)):f<2/3?a=1-((n=(1-o)/3)+(t=(1+o*zr(Tr*(f-=1/3))/zr($r-Tr*f))/3)):n=1-((t=(1-o)/3)+(a=(1+o*zr(Tr*(f-=2/3))/zr($r-Tr*f))/3)),[255*(n=Sr(u*n*3)),255*(t=Sr(u*t*3)),255*(a=Sr(u*a*3)),r.length>3?r[3]:1]},Ur=l.unpack,Vr=l.type,Wr=y,Kr=v,Zr=h,Hr=Dr;Kr.prototype.hsi=function(){return Hr(this._rgb)},Wr.hsi=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(Kr,[null].concat(r,["hsi"])))},Zr.format.hsi=Xr,Zr.autodetect.push({p:2,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=Ur(r,"hsi"),"array"===Vr(r)&&3===r.length)return"hsi"}});var Jr=l.unpack,Qr=l.type,re=y,ee=v,ne=h,te=I;ee.prototype.hsl=function(){return te(this._rgb)},re.hsl=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(ee,[null].concat(r,["hsl"])))},ne.format.hsl=X,ne.autodetect.push({p:2,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=Jr(r,"hsl"),"array"===Qr(r)&&3===r.length)return"hsl"}});var ae=l.unpack,fe=Math.min,oe=Math.max,ue=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n,t,a,f=(r=ae(r,"rgb"))[0],o=r[1],u=r[2],c=fe(f,o,u),i=oe(f,o,u),l=i-c;return a=i/255,0===i?(n=Number.NaN,t=0):(t=l/i,f===i&&(n=(o-u)/l),o===i&&(n=2+(u-f)/l),u===i&&(n=4+(f-o)/l),(n*=60)<0&&(n+=360)),[n,t,a]},ce=l.unpack,ie=Math.floor,le=function(){for(var r,e,n,t,a,f,o=[],u=arguments.length;u--;)o[u]=arguments[u];var c,i,l,h=(o=ce(o,"hsv"))[0],s=o[1],d=o[2];if(d*=255,0===s)c=i=l=d;else{360===h&&(h=0),h>360&&(h-=360),h<0&&(h+=360);var b=ie(h/=60),p=h-b,g=d*(1-s),v=d*(1-s*p),m=d*(1-s*(1-p));switch(b){case 0:c=(r=[d,m,g])[0],i=r[1],l=r[2];break;case 1:c=(e=[v,d,g])[0],i=e[1],l=e[2];break;case 2:c=(n=[g,d,m])[0],i=n[1],l=n[2];break;case 3:c=(t=[g,v,d])[0],i=t[1],l=t[2];break;case 4:c=(a=[m,g,d])[0],i=a[1],l=a[2];break;case 5:c=(f=[d,g,v])[0],i=f[1],l=f[2]}}return[c,i,l,o.length>3?o[3]:1]},he=l.unpack,se=l.type,de=y,be=v,pe=h,ge=ue;be.prototype.hsv=function(){return ge(this._rgb)},de.hsv=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(be,[null].concat(r,["hsv"])))},pe.format.hsv=le,pe.autodetect.push({p:2,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=he(r,"hsv"),"array"===se(r)&&3===r.length)return"hsv"}});var ve={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},me=ve,ye=l.unpack,ke=Math.pow,we=function(r){return(r/=255)<=.04045?r/12.92:ke((r+.055)/1.055,2.4)},Me=function(r){return r>me.t3?ke(r,1/3):r/me.t2+me.t0},Ne=function(r,e,n){return r=we(r),e=we(e),n=we(n),[Me((.4124564*r+.3575761*e+.1804375*n)/me.Xn),Me((.2126729*r+.7151522*e+.072175*n)/me.Yn),Me((.0193339*r+.119192*e+.9503041*n)/me.Zn)]},_e=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=ye(r,"rgb"),t=n[0],a=n[1],f=n[2],o=Ne(t,a,f),u=o[0],c=o[1],i=o[2],l=116*c-16;return[l<0?0:l,500*(u-c),200*(c-i)]},xe=ve,Ae=l.unpack,Ee=Math.pow,Fe=function(r){return 255*(r<=.00304?12.92*r:1.055*Ee(r,1/2.4)-.055)},Pe=function(r){return r>xe.t1?r*r*r:xe.t2*(r-xe.t0)},Oe=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n,t,a,f=(r=Ae(r,"lab"))[0],o=r[1],u=r[2];return t=(f+16)/116,n=isNaN(o)?t:t+o/500,a=isNaN(u)?t:t-u/200,t=xe.Yn*Pe(t),n=xe.Xn*Pe(n),a=xe.Zn*Pe(a),[Fe(3.2404542*n-1.5371385*t-.4985314*a),Fe(-.969266*n+1.8760108*t+.041556*a),Fe(.0556434*n-.2040259*t+1.0572252*a),r.length>3?r[3]:1]},je=l.unpack,Ge=l.type,Re=y,qe=v,Le=h,Ie=_e;qe.prototype.lab=function(){return Ie(this._rgb)},Re.lab=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(qe,[null].concat(r,["lab"])))},Le.format.lab=Oe,Le.autodetect.push({p:2,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=je(r,"lab"),"array"===Ge(r)&&3===r.length)return"lab"}});var Be=l.unpack,Ce=l.RAD2DEG,De=Math.sqrt,Ye=Math.atan2,Se=Math.round,Te=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=Be(r,"lab"),t=n[0],a=n[1],f=n[2],o=De(a*a+f*f),u=(Ye(f,a)*Ce+360)%360;return 0===Se(1e4*o)&&(u=Number.NaN),[t,o,u]},$e=l.unpack,ze=_e,Xe=Te,Ue=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=$e(r,"rgb"),t=n[0],a=n[1],f=n[2],o=ze(t,a,f),u=o[0],c=o[1],i=o[2];return Xe(u,c,i)},Ve=l.unpack,We=l.DEG2RAD,Ke=Math.sin,Ze=Math.cos,He=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=Ve(r,"lch"),t=n[0],a=n[1],f=n[2];return isNaN(f)&&(f=0),[t,Ze(f*=We)*a,Ke(f)*a]},Je=l.unpack,Qe=He,rn=Oe,en=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=(r=Je(r,"lch"))[0],t=r[1],a=r[2],f=Qe(n,t,a),o=f[0],u=f[1],c=f[2],i=rn(o,u,c),l=i[0],h=i[1],s=i[2];return[l,h,s,r.length>3?r[3]:1]},nn=l.unpack,tn=en,an=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=nn(r,"hcl").reverse();return tn.apply(void 0,n)},fn=l.unpack,on=l.type,un=y,cn=v,ln=h,hn=Ue;cn.prototype.lch=function(){return hn(this._rgb)},cn.prototype.hcl=function(){return hn(this._rgb).reverse()},un.lch=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(cn,[null].concat(r,["lch"])))},un.hcl=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(cn,[null].concat(r,["hcl"])))},ln.format.lch=en,ln.format.hcl=an,["lch","hcl"].forEach((function(r){return ln.autodetect.push({p:2,test:function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];if(e=fn(e,r),"array"===on(e)&&3===e.length)return r}})}));var sn={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflower:"#6495ed",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",laserlemon:"#ffff54",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrod:"#fafad2",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",maroon2:"#7f0000",maroon3:"#b03060",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",purple2:"#7f007f",purple3:"#a020f0",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},dn=h,bn=l.type,pn=sn,gn=Fr,vn=xr;v.prototype.name=function(){for(var r=vn(this._rgb,"rgb"),e=0,n=Object.keys(pn);e0;)e[n]=arguments[n+1];if(!e.length&&"string"===bn(r)&&pn[r.toLowerCase()])return"named"}});var mn=l.unpack,yn=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=mn(r,"rgb"),t=n[0],a=n[1],f=n[2];return(t<<16)+(a<<8)+f},kn=l.type,wn=function(r){if("number"==kn(r)&&r>=0&&r<=16777215)return[r>>16,r>>8&255,255&r,1];throw new Error("unknown num color: "+r)},Mn=y,Nn=v,_n=h,xn=l.type,An=yn;Nn.prototype.num=function(){return An(this._rgb)},Mn.num=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(Nn,[null].concat(r,["num"])))},_n.format.num=wn,_n.autodetect.push({p:5,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(1===r.length&&"number"===xn(r[0])&&r[0]>=0&&r[0]<=16777215)return"num"}});var En=y,Fn=v,Pn=h,On=l.unpack,jn=l.type,Gn=Math.round;Fn.prototype.rgb=function(r){return void 0===r&&(r=!0),!1===r?this._rgb.slice(0,3):this._rgb.slice(0,3).map(Gn)},Fn.prototype.rgba=function(r){return void 0===r&&(r=!0),this._rgb.slice(0,4).map((function(e,n){return n<3?!1===r?e:Gn(e):e}))},En.rgb=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(Fn,[null].concat(r,["rgb"])))},Pn.format.rgb=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=On(r,"rgba");return void 0===n[3]&&(n[3]=1),n},Pn.autodetect.push({p:3,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=On(r,"rgba"),"array"===jn(r)&&(3===r.length||4===r.length&&"number"==jn(r[3])&&r[3]>=0&&r[3]<=1))return"rgb"}});var Rn=Math.log,qn=function(r){var e,n,t,a=r/100;return a<66?(e=255,n=a<6?0:-155.25485562709179-.44596950469579133*(n=a-2)+104.49216199393888*Rn(n),t=a<20?0:.8274096064007395*(t=a-10)-254.76935184120902+115.67994401066147*Rn(t)):(e=351.97690566805693+.114206453784165*(e=a-55)-40.25366309332127*Rn(e),n=325.4494125711974+.07943456536662342*(n=a-50)-28.0852963507957*Rn(n),t=255),[e,n,t,1]},Ln=qn,In=l.unpack,Bn=Math.round,Cn=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];for(var n,t=In(r,"rgb"),a=t[0],f=t[2],o=1e3,u=4e4,c=.4;u-o>c;){var i=Ln(n=.5*(u+o));i[2]/i[0]>=f/a?u=n:o=n}return Bn(n)},Dn=y,Yn=v,Sn=h,Tn=Cn;Yn.prototype.temp=Yn.prototype.kelvin=Yn.prototype.temperature=function(){return Tn(this._rgb)},Dn.temp=Dn.kelvin=Dn.temperature=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(Yn,[null].concat(r,["temp"])))},Sn.format.temp=Sn.format.kelvin=Sn.format.temperature=qn;var $n=l.unpack,zn=Math.cbrt,Xn=Math.pow,Un=Math.sign,Vn=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=$n(r,"rgb"),t=n[0],a=n[1],f=n[2],o=[Wn(t/255),Wn(a/255),Wn(f/255)],u=o[0],c=o[1],i=o[2],l=zn(.4122214708*u+.5363325363*c+.0514459929*i),h=zn(.2119034982*u+.6806995451*c+.1073969566*i),s=zn(.0883024619*u+.2817188376*c+.6299787005*i);return[.2104542553*l+.793617785*h-.0040720468*s,1.9779984951*l-2.428592205*h+.4505937099*s,.0259040371*l+.7827717662*h-.808675766*s]};function Wn(r){var e=Math.abs(r);return e<.04045?r/12.92:(Un(r)||1)*Xn((e+.055)/1.055,2.4)}var Kn=l.unpack,Zn=Math.pow,Hn=Math.sign,Jn=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=(r=Kn(r,"lab"))[0],t=r[1],a=r[2],f=Zn(n+.3963377774*t+.2158037573*a,3),o=Zn(n-.1055613458*t-.0638541728*a,3),u=Zn(n-.0894841775*t-1.291485548*a,3);return[255*Qn(4.0767416621*f-3.3077115913*o+.2309699292*u),255*Qn(-1.2684380046*f+2.6097574011*o-.3413193965*u),255*Qn(-.0041960863*f-.7034186147*o+1.707614701*u),r.length>3?r[3]:1]};function Qn(r){var e=Math.abs(r);return e>.0031308?(Hn(r)||1)*(1.055*Zn(e,1/2.4)-.055):12.92*r}var rt=l.unpack,et=l.type,nt=y,tt=v,at=h,ft=Vn;tt.prototype.oklab=function(){return ft(this._rgb)},nt.oklab=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(tt,[null].concat(r,["oklab"])))},at.format.oklab=Jn,at.autodetect.push({p:3,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=rt(r,"oklab"),"array"===et(r)&&3===r.length)return"oklab"}});var ot=l.unpack,ut=Vn,ct=Te,it=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=ot(r,"rgb"),t=n[0],a=n[1],f=n[2],o=ut(t,a,f),u=o[0],c=o[1],i=o[2];return ct(u,c,i)},lt=l.unpack,ht=He,st=Jn,dt=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];var n=(r=lt(r,"lch"))[0],t=r[1],a=r[2],f=ht(n,t,a),o=f[0],u=f[1],c=f[2],i=st(o,u,c),l=i[0],h=i[1],s=i[2];return[l,h,s,r.length>3?r[3]:1]},bt=l.unpack,pt=l.type,gt=y,vt=v,mt=h,yt=it;vt.prototype.oklch=function(){return yt(this._rgb)},gt.oklch=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];return new(Function.prototype.bind.apply(vt,[null].concat(r,["oklch"])))},mt.format.oklch=dt,mt.autodetect.push({p:3,test:function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];if(r=bt(r,"oklch"),"array"===pt(r)&&3===r.length)return"oklch"}});var kt=v,wt=l.type;kt.prototype.alpha=function(r,e){return void 0===e&&(e=!1),void 0!==r&&"number"===wt(r)?e?(this._rgb[3]=r,this):new kt([this._rgb[0],this._rgb[1],this._rgb[2],r],"rgb"):this._rgb[3]},v.prototype.clipped=function(){return this._rgb._clipped||!1};var Mt=v,Nt=ve;Mt.prototype.darken=function(r){void 0===r&&(r=1);var e=this.lab();return e[0]-=Nt.Kn*r,new Mt(e,"lab").alpha(this.alpha(),!0)},Mt.prototype.brighten=function(r){return void 0===r&&(r=1),this.darken(-r)},Mt.prototype.darker=Mt.prototype.darken,Mt.prototype.brighter=Mt.prototype.brighten,v.prototype.get=function(r){var e=r.split("."),n=e[0],t=e[1],a=this[n]();if(t){var f=n.indexOf(t)-("ok"===n.substr(0,2)?2:0);if(f>-1)return a[f];throw new Error("unknown channel "+t+" in mode "+n)}return a};var _t=v,xt=l.type,At=Math.pow;_t.prototype.luminance=function(r){if(void 0!==r&&"number"===xt(r)){if(0===r)return new _t([0,0,0,this._rgb[3]],"rgb");if(1===r)return new _t([255,255,255,this._rgb[3]],"rgb");var e=this.luminance(),n=20,t=function(e,a){var f=e.interpolate(a,.5,"rgb"),o=f.luminance();return Math.abs(r-o)<1e-7||!n--?f:o>r?t(e,f):t(f,a)},a=(e>r?t(new _t([0,0,0]),this):t(this,new _t([255,255,255]))).rgb();return new _t(a.concat([this._rgb[3]]))}return Et.apply(void 0,this._rgb.slice(0,3))};var Et=function(r,e,n){return.2126*(r=Ft(r))+.7152*(e=Ft(e))+.0722*(n=Ft(n))},Ft=function(r){return(r/=255)<=.03928?r/12.92:At((r+.055)/1.055,2.4)},Pt={},Ot=v,jt=l.type,Gt=Pt,Rt=function(r,e,n){void 0===n&&(n=.5);for(var t=[],a=arguments.length-3;a-- >0;)t[a]=arguments[a+3];var f=t[0]||"lrgb";if(Gt[f]||t.length||(f=Object.keys(Gt)[0]),!Gt[f])throw new Error("interpolation mode "+f+" is not defined");return"object"!==jt(r)&&(r=new Ot(r)),"object"!==jt(e)&&(e=new Ot(e)),Gt[f](r,e,n).alpha(r.alpha()+n*(e.alpha()-r.alpha()))},qt=v,Lt=Rt;qt.prototype.mix=qt.prototype.interpolate=function(r,e){void 0===e&&(e=.5);for(var n=[],t=arguments.length-2;t-- >0;)n[t]=arguments[t+2];return Lt.apply(void 0,[this,r,e].concat(n))};var It=v;It.prototype.premultiply=function(r){void 0===r&&(r=!1);var e=this._rgb,n=e[3];return r?(this._rgb=[e[0]*n,e[1]*n,e[2]*n,n],this):new It([e[0]*n,e[1]*n,e[2]*n,n],"rgb")};var Bt=v,Ct=ve;Bt.prototype.saturate=function(r){void 0===r&&(r=1);var e=this.lch();return e[1]+=Ct.Kn*r,e[1]<0&&(e[1]=0),new Bt(e,"lch").alpha(this.alpha(),!0)},Bt.prototype.desaturate=function(r){return void 0===r&&(r=1),this.saturate(-r)};var Dt=v,Yt=l.type;Dt.prototype.set=function(r,e,n){void 0===n&&(n=!1);var t=r.split("."),a=t[0],f=t[1],o=this[a]();if(f){var u=a.indexOf(f)-("ok"===a.substr(0,2)?2:0);if(u>-1){if("string"==Yt(e))switch(e.charAt(0)){case"+":case"-":o[u]+=+e;break;case"*":o[u]*=+e.substr(1);break;case"/":o[u]/=+e.substr(1);break;default:o[u]=+e}else{if("number"!==Yt(e))throw new Error("unsupported value for Color.set");o[u]=e}var c=new Dt(o,a);return n?(this._rgb=c._rgb,this):c}throw new Error("unknown channel "+f+" in mode "+a)}return o};var St=v;Pt.rgb=function(r,e,n){var t=r._rgb,a=e._rgb;return new St(t[0]+n*(a[0]-t[0]),t[1]+n*(a[1]-t[1]),t[2]+n*(a[2]-t[2]),"rgb")};var Tt=v,$t=Math.sqrt,zt=Math.pow;Pt.lrgb=function(r,e,n){var t=r._rgb,a=t[0],f=t[1],o=t[2],u=e._rgb,c=u[0],i=u[1],l=u[2];return new Tt($t(zt(a,2)*(1-n)+zt(c,2)*n),$t(zt(f,2)*(1-n)+zt(i,2)*n),$t(zt(o,2)*(1-n)+zt(l,2)*n),"rgb")};var Xt=v;Pt.lab=function(r,e,n){var t=r.lab(),a=e.lab();return new Xt(t[0]+n*(a[0]-t[0]),t[1]+n*(a[1]-t[1]),t[2]+n*(a[2]-t[2]),"lab")};var Ut=v,Vt=function(r,e,n,t){var a,f,o,u,c,i,l,h,s,d,b,p,g;return"hsl"===t?(o=r.hsl(),u=e.hsl()):"hsv"===t?(o=r.hsv(),u=e.hsv()):"hcg"===t?(o=r.hcg(),u=e.hcg()):"hsi"===t?(o=r.hsi(),u=e.hsi()):"lch"===t||"hcl"===t?(t="hcl",o=r.hcl(),u=e.hcl()):"oklch"===t&&(o=r.oklch().reverse(),u=e.oklch().reverse()),"h"!==t.substr(0,1)&&"oklch"!==t||(c=(a=o)[0],l=a[1],s=a[2],i=(f=u)[0],h=f[1],d=f[2]),isNaN(c)||isNaN(i)?isNaN(c)?isNaN(i)?p=Number.NaN:(p=i,1!=s&&0!=s||"hsv"==t||(b=h)):(p=c,1!=d&&0!=d||"hsv"==t||(b=l)):p=c+n*(i>c&&i-c>180?i-(c+360):i180?i+360-c:i-c),void 0===b&&(b=l+n*(h-l)),g=s+n*(d-s),new Ut("oklch"===t?[g,b,p]:[p,b,g],t)},Wt=Vt,Kt=function(r,e,n){return Wt(r,e,n,"lch")};Pt.lch=Kt,Pt.hcl=Kt;var Zt=v;Pt.num=function(r,e,n){var t=r.num(),a=e.num();return new Zt(t+n*(a-t),"num")};var Ht=Vt;Pt.hcg=function(r,e,n){return Ht(r,e,n,"hcg")};var Jt=Vt;Pt.hsi=function(r,e,n){return Jt(r,e,n,"hsi")};var Qt=Vt;Pt.hsl=function(r,e,n){return Qt(r,e,n,"hsl")};var ra=Vt;Pt.hsv=function(r,e,n){return ra(r,e,n,"hsv")};var ea=v;Pt.oklab=function(r,e,n){var t=r.oklab(),a=e.oklab();return new ea(t[0]+n*(a[0]-t[0]),t[1]+n*(a[1]-t[1]),t[2]+n*(a[2]-t[2]),"oklab")};var na=Vt;Pt.oklch=function(r,e,n){return na(r,e,n,"oklch")};var ta=v,aa=l.clip_rgb,fa=Math.pow,oa=Math.sqrt,ua=Math.PI,ca=Math.cos,ia=Math.sin,la=Math.atan2,ha=function(r,e){for(var n=r.length,t=[0,0,0,0],a=0;a.9999999&&(t[3]=1),new ta(aa(t))},sa=y,da=l.type,ba=Math.pow,pa=function(r){var e="rgb",n=sa("#ccc"),t=0,a=[0,1],f=[],o=[0,0],u=!1,c=[],i=!1,l=0,h=1,s=!1,d={},b=!0,p=1,g=function(r){if((r=r||["#fff","#000"])&&"string"===da(r)&&sa.brewer&&sa.brewer[r.toLowerCase()]&&(r=sa.brewer[r.toLowerCase()]),"array"===da(r)){1===r.length&&(r=[r[0],r[0]]),r=r.slice(0);for(var e=0;e2){var s=function(r){if(null!=u){for(var e=u.length-1,n=0;n=u[n];)n++;return n-1}return 0}(r);i=s/(u.length-2)}else i=h!==l?(r-l)/(h-l):1;i=m(i),t||(i=v(i)),1!==p&&(i=ba(i,p)),i=o[0]+i*(1-o[0]-o[1]),i=Math.min(1,Math.max(0,i));var g=Math.floor(1e4*i);if(b&&d[g])a=d[g];else{if("array"===da(c))for(var y=0;y=k&&y===f.length-1){a=c[y];break}if(i>k&&i2){var i=r.map((function(e,n){return n/(r.length-1)})),s=r.map((function(r){return(r-l)/(h-l)}));s.every((function(r,e){return i[e]===r}))||(m=function(r){if(r<=0||r>=1)return r;for(var e=0;r>=s[e+1];)e++;var n=(r-s[e])/(s[e+1]-s[e]);return i[e]+n*(i[e+1]-i[e])})}}return a=[l,h],w},w.mode=function(r){return arguments.length?(e=r,k(),w):e},w.range=function(r,e){return g(r),w},w.out=function(r){return i=r,w},w.spread=function(r){return arguments.length?(t=r,w):t},w.correctLightness=function(r){return null==r&&(r=!0),s=r,k(),v=s?function(r){for(var e=y(0,!0).lab()[0],n=y(1,!0).lab()[0],t=e>n,a=y(r,!0).lab()[0],f=e+(n-e)*r,o=a-f,u=0,c=1,i=20;Math.abs(o)>.01&&i-- >0;)t&&(o*=-1),o<0?(u=r,r+=.5*(c-r)):(c=r,r+=.5*(u-r)),a=y(r,!0).lab()[0],o=a-f;return r}:function(r){return r},w},w.padding=function(r){return null!=r?("number"===da(r)&&(r=[r,r]),o=r,w):o},w.colors=function(e,n){arguments.length<2&&(n="hex");var t=[];if(0===arguments.length)t=c.slice(0);else if(1===e)t=[w(.5)];else if(e>1){var f=a[0],o=a[1]-f;t=ga(0,e,!1).map((function(r){return w(f+r/(e-1)*o)}))}else{r=[];var i=[];if(u&&u.length>2)for(var l=1,h=u.length,s=1<=h;s?lh;s?l++:l--)i.push(.5*(u[l-1]+u[l]));else i=a;t=i.map((function(r){return w(r)}))}return sa[n]&&(t=t.map((function(r){return r[n]()}))),t},w.cache=function(r){return null!=r?(b=r,w):b},w.gamma=function(r){return null!=r?(p=r,w):p},w.nodata=function(r){return null!=r?(n=sa(r),w):n},w};function ga(r,e,n){for(var t=[],a=rf;a?o++:o--)t.push(o);return t}var va=v,ma=pa,ya=y,ka=function(r,e,n){if(!ka[n])throw new Error("unknown blend mode "+n);return ka[n](r,e)},wa=function(r){return function(e,n){var t=ya(n).rgb(),a=ya(e).rgb();return ya.rgb(r(t,a))}},Ma=function(r){return function(e,n){var t=[];return t[0]=r(e[0],n[0]),t[1]=r(e[1],n[1]),t[2]=r(e[2],n[2]),t}};ka.normal=wa(Ma((function(r){return r}))),ka.multiply=wa(Ma((function(r,e){return r*e/255}))),ka.screen=wa(Ma((function(r,e){return 255*(1-(1-r/255)*(1-e/255))}))),ka.overlay=wa(Ma((function(r,e){return e<128?2*r*e/255:255*(1-2*(1-r/255)*(1-e/255))}))),ka.darken=wa(Ma((function(r,e){return r>e?e:r}))),ka.lighten=wa(Ma((function(r,e){return r>e?r:e}))),ka.dodge=wa(Ma((function(r,e){return 255===r||(r=e/255*255/(1-r/255))>255?255:r}))),ka.burn=wa(Ma((function(r,e){return 255*(1-(1-e/255)/(r/255))})));for(var Na=ka,_a=l.type,xa=l.clip_rgb,Aa=l.TWOPI,Ea=Math.pow,Fa=Math.sin,Pa=Math.cos,Oa=y,ja=v,Ga=Math.floor,Ra=Math.random,qa=o,La=Math.log,Ia=Math.pow,Ba=Math.floor,Ca=Math.abs,Da=function(r,e){void 0===e&&(e=null);var n={min:Number.MAX_VALUE,max:-1*Number.MAX_VALUE,sum:0,values:[],count:0};return"object"===qa(r)&&(r=Object.values(r)),r.forEach((function(r){e&&"object"===qa(r)&&(r=r[e]),null==r||isNaN(r)||(n.values.push(r),n.sum+=r,rn.max&&(n.max=r),n.count+=1)})),n.domain=[n.min,n.max],n.limits=function(r,e){return Ya(n,r,e)},n},Ya=function(r,e,n){void 0===e&&(e="equal"),void 0===n&&(n=7),"array"==qa(r)&&(r=Da(r));var t=r.min,a=r.max,f=r.values.sort((function(r,e){return r-e}));if(1===n)return[t,a];var o=[];if("c"===e.substr(0,1)&&(o.push(t),o.push(a)),"e"===e.substr(0,1)){o.push(t);for(var u=1;u 0");var c=Math.LOG10E*La(t),i=Math.LOG10E*La(a);o.push(t);for(var l=1;l200&&(y=!1)}for(var L={},I=0;I=360;)b-=360;o[d]=b}else o[d]=o[d]/u[d];return s/=t,new ta(o,e).alpha(s>.99999?1:s,!0)},hf.bezier=function(r){var e=function(r){var e,n,t,a,f,o,u;if(2===(r=r.map((function(r){return new va(r)}))).length)e=r.map((function(r){return r.lab()})),f=e[0],o=e[1],a=function(r){var e=[0,1,2].map((function(e){return f[e]+r*(o[e]-f[e])}));return new va(e,"lab")};else if(3===r.length)n=r.map((function(r){return r.lab()})),f=n[0],o=n[1],u=n[2],a=function(r){var e=[0,1,2].map((function(e){return(1-r)*(1-r)*f[e]+2*(1-r)*r*o[e]+r*r*u[e]}));return new va(e,"lab")};else if(4===r.length){var c;t=r.map((function(r){return r.lab()})),f=t[0],o=t[1],u=t[2],c=t[3],a=function(r){var e=[0,1,2].map((function(e){return(1-r)*(1-r)*(1-r)*f[e]+3*(1-r)*(1-r)*r*o[e]+3*(1-r)*r*r*u[e]+r*r*r*c[e]}));return new va(e,"lab")}}else{if(!(r.length>=5))throw new RangeError("No point in running bezier with only one color.");var i,l,h;i=r.map((function(r){return r.lab()})),h=r.length-1,l=function(r){for(var e=[1,1],n=1;nt?(n+.05)/(t+.05):(t+.05)/(n+.05)},hf.deltaE=function(r,e,n,t,a){void 0===n&&(n=1),void 0===t&&(t=1),void 0===a&&(a=1);var f=function(r){return 360*r/(2*Qa)},o=function(r){return 2*Qa*r/360};r=new $a(r),e=new $a(e);var u=Array.from(r.lab()),c=u[0],i=u[1],l=u[2],h=Array.from(e.lab()),s=h[0],d=h[1],b=h[2],p=(c+s)/2,g=(za(Xa(i,2)+Xa(l,2))+za(Xa(d,2)+Xa(b,2)))/2,v=.5*(1-za(Xa(g,7)/(Xa(g,7)+Xa(25,7)))),m=i*(1+v),y=d*(1+v),k=za(Xa(m,2)+Xa(l,2)),w=za(Xa(y,2)+Xa(b,2)),M=(k+w)/2,N=f(Wa(l,m)),_=f(Wa(b,y)),x=N>=0?N:N+360,A=_>=0?_:_+360,E=Ka(x-A)>180?(x+A+360)/2:(x+A)/2,F=1-.17*Za(o(E-30))+.24*Za(o(2*E))+.32*Za(o(3*E+6))-.2*Za(o(4*E-63)),P=A-x;P=Ka(P)<=180?P:A<=x?P+360:P-360,P=2*za(k*w)*Ha(o(P)/2);var O=s-c,j=w-k,G=1+.015*Xa(p-50,2)/za(20+Xa(p-50,2)),R=1+.045*M,q=1+.015*M*F,L=30*Ja(-Xa((E-275)/25,2)),I=-(2*za(Xa(M,7)/(Xa(M,7)+Xa(25,7))))*Ha(2*o(L)),B=za(Xa(O/(n*G),2)+Xa(j/(t*R),2)+Xa(P/(a*q),2)+I*(j/(t*R))*(P/(a*q)));return Va(0,Ua(100,B))},hf.distance=function(r,e,n){void 0===n&&(n="lab"),r=new rf(r),e=new rf(e);var t=r.get(n),a=e.get(n),f=0;for(var o in t){var u=(t[o]||0)-(a[o]||0);f+=u*u}return Math.sqrt(f)},hf.limits=Sa.limits,hf.valid=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];try{return new(Function.prototype.bind.apply(ef,[null].concat(r))),!0}catch(r){return!1}},hf.scales=af,hf.colors=sn,hf.brewer=lf,hf})); diff --git a/base_geoengine/static/lib/geostats-2.0.0/geostats.css b/base_geoengine/static/lib/geostats-2.0.0/geostats.css new file mode 100644 index 0000000000..a1bad4e69f --- /dev/null +++ b/base_geoengine/static/lib/geostats-2.0.0/geostats.css @@ -0,0 +1,24 @@ +.geostats-legend div { + margin:3px 10px 5px 10px; + clear:left; +} + +.geostats-legend-title { + font-weight: bold; + margin-bottom: 4px; +} + +.geostats-legend-block { + border: 1px solid #555555; + display: block; + float: left; + height: 12px; + margin: 0 5px 0 20px; + width: 20px; +} + +.geostats-legend-counter { + font-size: 0.8em; + color:#666; + font-style: italic; +} diff --git a/base_geoengine/static/lib/geostats-2.0.0/geostats.js b/base_geoengine/static/lib/geostats-2.0.0/geostats.js new file mode 100755 index 0000000000..0a7f3a7c83 --- /dev/null +++ b/base_geoengine/static/lib/geostats-2.0.0/geostats.js @@ -0,0 +1,1407 @@ +/** +* geostats() is a tiny and standalone javascript library for classification +* Project page - https://github.com/simogeo/geostats +* Copyright (c) 2011 Simon Georget, http://www.intermezzo-coop.eu +* Licensed under the MIT license +*/ + + +(function (definition) { + // This file will function properly as a