Exemple #1
0
    def setup_default_preset(self):
        """Setup the display of presets"""
        preset_folder = resources_path('map_preset')
        folders = os.listdir(preset_folder)

        for folder_name in folders:
            file_path = join(preset_folder, folder_name, folder_name + '.json')
            with open(file_path, encoding='utf8') as json_file:
                data = json.load(json_file, object_hook=as_enum)

            item = QListWidgetItem(self.dialog.list_default_mp)
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable
                          | Qt.ItemIsEnabled)
            self.dialog.list_default_mp.addItem(item)

            widget = QFrame()
            widget.setFrameStyle(QFrame.StyledPanel)
            widget.setStyleSheet('QFrame { margin: 3px; };')
            widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            hbox = QHBoxLayout()
            vbox = QVBoxLayout()
            picture = QLabel()
            icon_path = resources_path('map_preset', folder_name,
                                       folder_name + '_icon.png')
            if not os.path.isfile(icon_path):
                icon_path = resources_path('icons', 'QuickOSM.svg')
            icon = QPixmap(icon_path)
            icon.scaled(QSize(150, 250), Qt.KeepAspectRatio)
            picture.setPixmap(icon)
            picture.setStyleSheet(
                'max-height: 150px; max-width: 250px; margin-right: 50px;')
            hbox.addWidget(picture)
            title = QLabel(data['file_name'])
            title.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
            title.setStyleSheet('font: bold 20px; margin-bottom: 25px;')
            vbox.addWidget(title)
            for label in data['description']:
                if not label:
                    label = tr('No description')
                real_label = QLabel(label)
                real_label.setWordWrap(True)
                vbox.addWidget(real_label)
            hbox.addItem(vbox)
            widget.setLayout(hbox)

            item.setSizeHint(widget.minimumSizeHint())
            self.dialog.list_default_mp.setItemWidget(item, widget)
Exemple #2
0
    def prepare_run(self):
        """Prepare the data before running the process."""
        selection = self.dialog.list_default_mp.selectedIndexes()
        try:

            if selection:
                preset = self.dialog.list_default_mp.item(selection[0].row())
                preset_widget = self.dialog.list_default_mp.itemWidget(preset)
                preset_label = preset_widget.layout().itemAt(1).itemAt(
                    0).widget().text()
                preset_folder = resources_path('map_preset')
            else:
                selection = self.dialog.list_personal_preset_mp.selectedIndexes(
                )
                if not len(selection):
                    raise NoSelectedPreset

                preset = self.dialog.list_personal_preset_mp.item(
                    selection[0].row())
                preset_widget = self.dialog.list_personal_preset_mp.itemWidget(
                    preset)
                preset_label = preset_widget.layout().itemAt(0).itemAt(
                    0).widget().text()
                preset_folder = query_preset()
            LOGGER.debug('Preset chosen: {}'.format(preset_label))
            file_path = join(preset_folder, preset_label,
                             preset_label + '.json')
            with open(file_path, encoding='utf8') as json_file:
                data = json.load(json_file, object_hook=as_enum)

            data['folder'] = os.path.dirname(file_path)

            if not data['advanced']:
                properties = self.gather_spatial_values({})
                data['query_type'] = properties['query_type']
                data['distance'] = self.dialog.spin_place_mp.value()
                if data['query_type'] != QueryType.AroundArea:
                    data['distance'] = None
                if data['query_type'] in [
                        QueryType.InArea, QueryType.AroundArea
                ] and properties['place']:
                    for k, _area in enumerate(data['area']):
                        data['area'][k] = properties['place']
                elif data['query_type'] == QueryType.BBox and properties[
                        'bbox']:
                    for k, _bbox in enumerate(data['bbox']):
                        data['bbox'][k] = properties['bbox']

            self.run_saved_query(data)

        except QuickOsmException as error:
            self.dialog.display_quickosm_exception(error)
Exemple #3
0
    def setup_panel(self):
        super().setup_panel()
        self.dialog.combo_query_type_q.addItem(tr('Canvas Extent'), 'canvas')
        self.dialog.combo_query_type_q.addItem(tr('Layer Extent'), 'layer')
        self.dialog.combo_query_type_q.currentIndexChanged.connect(
            self.query_type_updated)
        self.dialog.combo_extent_layer_q.layerChanged.connect(
            self.query_type_updated)

        self.highlighter = QueryHighlighter(self.dialog.text_query.document())
        self.dialog.text_query.cursorPositionChanged.connect(
            self.highlighter.rehighlight)
        self.dialog.text_query.cursorPositionChanged.connect(
            self.allow_nominatim_or_extent)

        self.dialog.button_overpass_turbo.setIcon(
            QIcon(resources_path('icons', 'turbo.png')))
        self.dialog.button_overpass_turbo.clicked.connect(open_overpass_turbo)

        # Setup menu for documentation
        popup_menu = QMenu()
        map_features_action = QAction('Map Features',
                                      self.dialog.button_documentation)
        # noinspection PyUnresolvedReferences
        map_features_action.triggered.connect(open_plugin_documentation)
        popup_menu.addAction(map_features_action)
        overpass_action = QAction('Overpass', self.dialog.button_documentation)
        # noinspection PyUnresolvedReferences
        overpass_action.triggered.connect(open_doc_overpass)
        popup_menu.addAction(overpass_action)
        self.dialog.button_documentation.setMenu(popup_menu)

        self.dialog.button_generate_query.setMenu(QMenu())

        self.dialog.action_oql_q.triggered.connect(self.query_language_oql)
        self.dialog.action_xml_q.triggered.connect(self.query_language_xml)
        self.dialog.button_generate_query.menu().addAction(
            self.dialog.action_oql_q)
        self.dialog.button_generate_query.menu().addAction(
            self.dialog.action_xml_q)

        self.dialog.run_buttons[self.panel].clicked.connect(self.run)
        self.dialog.button_generate_query.clicked.connect(
            self.query_language_check)
        self.dialog.button_box_q.button(
            QDialogButtonBox.Reset).clicked.connect(self.dialog.reset_form)

        self.allow_nominatim_or_extent()
        self.query_type_updated()
Exemple #4
0
    def setup_preset(self):
        """Set up the preset"""
        parser = PresetsParser()
        self.preset_data = parser.parser()
        keys_preset = list(self.preset_data.elements.keys())
        keys_preset.append('')
        keys_preset.sort()
        keys_preset_completer = DiacriticFreeCompleter()
        completer_model = DiactricFreeStringListModel()
        keys_preset_completer.setModel(completer_model)
        keys_preset_completer.setCompletionRole(
            completer_model.diactricFreeRole())
        completer_model.setStringList(keys_preset)
        self.preset.addItems(keys_preset)
        self.preset.addItem(keys_preset.pop(0))
        if not os.getenv(
                'CI') and self.panel and self.panel == Panels.QuickQuery:
            for k, key in enumerate(keys_preset):
                icon_path = self.preset_data.elements[key].icon
                widget_item = QListWidgetItem(key)
                if icon_path:
                    icon_path = resources_path('icons', "josm", icon_path)
                    if os.path.exists(icon_path):
                        icon = QPixmap(icon_path)
                        widget_item.setData(
                            Qt.DecorationRole,
                            icon.scaled(20, 20, Qt.KeepAspectRatio))
                        self.preset.setItemData(
                            k + 1, icon.scaled(20, 20, Qt.KeepAspectRatio),
                            Qt.DecorationRole)
                self.preset_items.append(widget_item)
        self.preset.setCompleter(keys_preset_completer)
        self.preset.completer().setCompletionMode(QCompleter.PopupCompletion)
        self.preset.completer().setFilterMode(Qt.MatchContains)
        self.preset.completer().setCaseSensitivity(Qt.CaseInsensitive)

        self.preset.activated.connect(self.choice_preset)
        self.preset.lineEdit().setPlaceholderText(
            tr('Not mandatory. Ex: bakery'))

        osm_keys = parser.osm_keys_values()
        self.set_couple(osm_keys)
Exemple #5
0
    def setup_panel(self):
        self.dialog.radio_osm_conf.setChecked(False)
        self.dialog.osm_conf.setEnabled(False)
        # TODO self.edit_file_prefix_f.setDisabled(True)

        self.dialog.osm_file.setDialogTitle(tr('Select an OSM/PBF file'))
        self.dialog.osm_file.setFilter('OSM file (*.osm *.pbf)')

        default_osm_conf = resources_path('ogr', 'to_be_modified_osmconf.ini')
        if not isfile(default_osm_conf):
            default_osm_conf = ''
        self.dialog.osm_conf.setDialogTitle(tr('Select OSM conf file'))
        self.dialog.osm_conf.setFilter('OSM conf (*.ini)')
        self.dialog.osm_conf.lineEdit().setPlaceholderText(default_osm_conf)

        self.dialog.osm_conf.fileChanged.connect(self.disable_run_file_button)
        self.dialog.radio_osm_conf.toggled.connect(
            self.disable_run_file_button)
        # TODO
        #  self.output_directory.fileChanged.connect(self.disable_prefix_file)
        self.dialog.run_buttons[self.panel].clicked.connect(self.run)

        self.disable_run_file_button()
Exemple #6
0
    def osm_keys_values(self) -> dict:
        """ Retrieval of key/value couple """
        couple = {}
        items = self.items.copy()

        old_couple_file = resources_path('json', 'map_features.json')
        with open(old_couple_file, encoding='utf8') as json_file:
            data = json.load(json_file)

        if not os.getenv('CI'):
            items['old_file'] = data

        key = []
        for item in items:
            for k in list(items[item].keys()):
                value = items[item][k]
                if k in key:
                    if isinstance(value, list):
                        for val in value:
                            if val not in couple[k]:
                                couple[k].append(val)
                    elif value not in couple[k]:
                        couple[k].append(value)
                elif isinstance(value, str):
                    key.append(k)
                    couple[k] = [value]
                elif isinstance(value, list):
                    key.append(k)
                    if value:
                        couple[k] = [value[0]]
                        for val in value[1:]:
                            couple[k].append(val)
                    else:
                        couple[k] = ['']

        return couple
Exemple #7
0
    def __init__(self, iface=None, parent=None):
        """Constructor."""
        QDialog.__init__(self, parent)
        self.setupUi(self)
        self._iface = iface

        self.query_menu_index = 2
        self.preset_menu_index = 0

        # Table mapping

        # Explaining quickly, these letters are referring to the panel
        # in the UI:
        # mp : Map preset
        # qq : Quick Query
        # q : Query
        # f : file
        self.external_panels = {
            Panels.MapPreset: MapPresetPanel(self),
            Panels.QuickQuery: QuickQueryPanel(self),
            Panels.Query: QueryPanel(self),
            Panels.File: OsmFilePanel(self),
            Panels.Configuration: ConfigurationPanel(self),
        }
        self.places_edits = {
            Panels.MapPreset: self.line_place_mp,
            Panels.QuickQuery: self.line_place_qq,
            Panels.Query: self.line_place_q,
        }
        self.query_type_buttons = {
            Panels.MapPreset: self.combo_query_type_mp,
            Panels.QuickQuery: self.combo_query_type_qq,
            Panels.Query: self.combo_query_type_q,
        }
        self.layers_buttons = {
            Panels.MapPreset: self.combo_extent_layer_mp,
            Panels.QuickQuery: self.combo_extent_layer_qq,
            Panels.Query: self.combo_extent_layer_q,
        }
        self.selection_features = {
            Panels.MapPreset: self.checkbox_selection_mp,
            Panels.QuickQuery: self.checkbox_selection_qq,
            Panels.Query: self.checkbox_selection_q,
        }
        self.run_buttons = {
            Panels.MapPreset: self.button_run_query_mp,
            Panels.QuickQuery: self.button_run_query_qq,
            Panels.Query: self.button_run_query_q,
            Panels.File: self.button_run_file,
        }
        self.cancel_buttons = {
            Panels.MapPreset: self.button_cancel_query_mp,
            Panels.QuickQuery: self.button_cancel_query_qq,
            Panels.Query: self.button_cancel_query_q,
            Panels.File: self.button_cancel_file,
        }
        self.execute_buttons = {
            Panels.MapPreset: self.stacked_execute_query_mp,
            Panels.QuickQuery: self.stacked_execute_query_qq,
            Panels.Query: self.stacked_execute_query_q,
            Panels.File: self.stacked_execute_file,
        }
        self.output_buttons = {
            Panels.MapPreset: [],
            Panels.QuickQuery: [
                self.checkbox_points_qq, self.checkbox_lines_qq,
                self.checkbox_multilinestrings_qq,
                self.checkbox_multipolygons_qq
            ],
            Panels.Query: [
                self.checkbox_points_q,
                self.checkbox_lines_q,
                self.checkbox_multilinestrings_q,
                self.checkbox_multipolygons_q,
            ],
            Panels.File: [
                self.checkbox_points_f,
                self.checkbox_lines_f,
                self.checkbox_multilinestrings_f,
                self.checkbox_multipolygons_f,
            ]
        }
        self.output_directories = {
            Panels.MapPreset: None,
            Panels.QuickQuery: self.output_directory_qq,
            Panels.Query: self.output_directory_q,
            Panels.File: self.output_directory_f
        }
        self.output_format = {
            Panels.MapPreset: None,
            Panels.QuickQuery: self.combo_format_qq,
            Panels.Query: self.combo_format_q,
            Panels.File: self.combo_format_f
        }
        self.prefix_edits = {
            Panels.MapPreset: None,
            Panels.QuickQuery: self.line_file_prefix_qq,
            Panels.Query: self.line_file_prefix_q,
            Panels.File: self.line_file_prefix_file,
        }
        self.advanced_panels = {
            Panels.MapPreset: None,
            Panels.QuickQuery: self.advanced_qq,
            Panels.Query: self.advanced_q,
        }
        self.query_language = {
            Panels.MapPreset: None,
            Panels.QuickQuery: QueryLanguage.OQL,
            Panels.Query: QueryLanguage.OQL,
        }
        self.action_oql_qq = QAction('OQL')
        self.action_oql_q = QAction('OQL')
        self.action_oql = {
            Panels.QuickQuery: self.action_oql_qq,
            Panels.Query: self.action_oql_q,
        }
        self.action_xml_qq = QAction('XML')
        self.action_xml_q = QAction('XML')
        self.action_xml = {
            Panels.QuickQuery: self.action_xml_qq,
            Panels.Query: self.action_xml_q,
        }

        icon = QIcon(resources_path('icons', 'QuickOSM.svg'))
        self.reload_action = QAction(icon,
                                     tr("Reload the query in a new file"),
                                     self.iface)
        actions = Actions(self)
        reloader = partial(actions.pre_run_reload)
        self.reload_action.triggered.connect(reloader)
        self.iface.addCustomActionForLayerType(self.reload_action, "",
                                               QgsMapLayer.VectorLayer, False)

        self.feedback_process = QgsFeedback()

        item = self.menu_widget.item(0)
        item.setIcon(QIcon(resources_path('icons', 'map_tools.svg')))
        item = self.menu_widget.item(1)
        item.setIcon(QIcon(resources_path('icons', 'quick.png')))
        item = self.menu_widget.item(2)
        item.setIcon(QIcon(resources_path('icons', 'edit.png')))
        item = self.menu_widget.item(3)
        item.setIcon(QIcon(resources_path('icons', 'open.png')))
        item = self.menu_widget.item(4)
        item.setIcon(QIcon(resources_path('icons', 'general.svg')))
        item = self.menu_widget.item(5)
        item.setIcon(QIcon(resources_path('icons', 'info.png')))
        self.label_gnu.setPixmap(QPixmap(resources_path('icons', 'gnu.png')))

        # Set minimum width for the menu
        self.menu_widget.setMinimumWidth(
            self.menu_widget.sizeHintForColumn(0) + 10)

        self.progress_text.setText('')

        self.menu_widget.currentRowChanged['int'].connect(
            self.stacked_panels_widget.setCurrentIndex)

        for panel in self.external_panels.values():
            panel.setup_panel()
        self.menu_widget.setCurrentRow(1)
Exemple #8
0
    def setup_panel(self):
        super().setup_panel()
        """Setup the UI for the QuickQuery."""
        # Query type
        self.dialog.combo_query_type_qq.addItem(tr('In'), 'in')
        self.dialog.combo_query_type_qq.addItem(tr('Around'), 'around')
        self.dialog.combo_query_type_qq.addItem(tr('Canvas Extent'), 'canvas')
        self.dialog.combo_query_type_qq.addItem(tr('Layer Extent'), 'layer')
        self.dialog.combo_query_type_qq.addItem(tr('Not Spatial'),
                                                'attributes')

        # self.cb_query_type_qq.setItemIcon(
        #   0, QIcon(resources_path('in.svg')))
        # self.cb_query_type_qq.setItemIcon(
        #   1, QIcon(resources_path('around.svg')))
        # self.cb_query_type_qq.setItemIcon(
        #   2, QIcon(resources_path('map_canvas.svg')))
        # self.cb_query_type_qq.setItemIcon(
        #   3, QIcon(resources_path('extent.svg')))
        # self.cb_query_type_qq.setItemIcon(
        #   4, QIcon(resources_path('mIconTableLayer.svg')))

        self.dialog.combo_query_type_qq.currentIndexChanged.connect(
            self.query_type_updated)

        self.dialog.line_file_prefix_qq.setDisabled(True)

        self.dialog.button_run_query_qq.clicked.connect(self.run)
        self.dialog.button_show_query.clicked.connect(self.show_query)
        self.dialog.combo_key.editTextChanged.connect(self.key_edited)
        self.dialog.button_map_features.clicked.connect(open_map_features)
        self.dialog.button_box_qq.button(
            QDialogButtonBox.Reset).clicked.connect(self.dialog.reset_form)

        # setup callbacks for friendly-label-update only
        self.dialog.combo_value.editTextChanged.connect(self.update_friendly)
        self.dialog.line_place_qq.textChanged.connect(self.update_friendly)
        self.dialog.spin_place_qq.valueChanged.connect(self.update_friendly)
        self.dialog.combo_extent_layer_qq.layerChanged.connect(
            self.update_friendly)

        # Setup auto completion
        map_features_json_file = resources_path('json', 'map_features.json')
        if isfile(map_features_json_file):
            with open(map_features_json_file) as f:
                self.osm_keys = load(f)
                keys = list(self.osm_keys.keys())
                keys.append('')  # All keys request #118
                keys.sort()
                keys_completer = QCompleter(keys)
                self.dialog.combo_key.addItems(keys)
                self.dialog.combo_key.setCompleter(keys_completer)
                self.dialog.combo_key.completer().setCompletionMode(
                    QCompleter.PopupCompletion)

        self.dialog.combo_key.lineEdit().setPlaceholderText(
            tr('Query on all keys'))
        self.dialog.combo_value.lineEdit().setPlaceholderText(
            tr('Query on all values'))
        self.key_edited()
        self.query_type_updated()
        self.init_nominatim_autofill()
        self.update_friendly()
Exemple #9
0
def add_actions(layer, keys):
    """Add actions on layer.

    :param layer: The layer.
    :type layer: QgsVectorLayer

    :param keys: The list of keys in the layer.
    :type keys: list
    """
    actions = layer.actions()

    title = tr('OpenStreetMap Browser')
    osm_browser = QgsAction(
        QgsAction.OpenUrl,
        title,
        'http://www.openstreetmap.org/browse/[% "osm_type" %]/[% "osm_id" %]',
        '',
        False,
        title,
        ACTIONS_VISIBILITY,
        ''
    )
    actions.addAction(osm_browser)

    title = 'Mapillary'
    mapillary = QgsAction(
        QgsAction.GenericPython,
        title,
        ACTIONS_PATH + 'Actions.run("mapillary","[% "mapillary" %]")',
        resources_path('icons', 'mapillary_logo.svg'),
        False,
        title,
        ACTIONS_VISIBILITY,
        ''
    )
    actions.addAction(mapillary)

    title = 'JOSM'
    josm = QgsAction(
        QgsAction.GenericPython,
        title,
        ACTIONS_PATH + 'Actions.run("josm","[% "full_id" %]")',
        resources_path('icons', 'josm_icon.svg'),
        False,
        title,
        ACTIONS_VISIBILITY,
        ''
    )
    actions.addAction(josm)

    title = tr('User default editor')
    default_editor = QgsAction(
        QgsAction.OpenUrl,
        title,
        'http://www.openstreetmap.org/edit?[% "osm_type" %]=[% "osm_id" %]',
        '',
        False,
        title,
        ACTIONS_VISIBILITY,
        ''
    )
    actions.addAction(default_editor)

    for link in ['url', 'website', 'wikipedia', 'wikidata', 'ref:UAI']:
        if link in keys:

            # Add an image to the action if available
            image = ''
            if link == 'wikipedia':
                image = resources_path('icons', 'wikipedia.png')
            elif link == 'wikidata':
                image = resources_path('icons', 'wikidata.png')
            elif link in ['url', 'website']:
                image = resources_path('icons', 'external_link.png')

            link = link.replace(":", "_")
            generic = QgsAction(
                QgsAction.GenericPython,
                link,
                (ACTIONS_PATH
                 + 'Actions.run("{link}","[% "{link}" %]")'.format(link=link)),
                image,
                False,
                link,
                ACTIONS_VISIBILITY,
                ''
            )
            actions.addAction(generic)

    if 'network' in keys and 'ref' in keys:
        sketch_line = QgsAction(
            QgsAction.GenericPython,
            tr('Sketchline'),
            (
                ACTIONS_PATH +
                'Actions.run_sketch_line("[% "network" %]","[% "ref" %]")'
            ),
            '',
            False,
            '',
            ACTIONS_VISIBILITY,
            ''
        )
        actions.addAction(sketch_line)
Exemple #10
0
import collections as col
import json
import logging
import os
import re
import xml.dom.minidom as xml

from QuickOSM.qgis_plugin_tools.tools.i18n import setup_translation
from QuickOSM.qgis_plugin_tools.tools.resources import resources_path

__copyright__ = 'Copyright 2021, 3Liz'
__license__ = 'GPL version 3'
__email__ = '*****@*****.**'

PRESET_PATH = resources_path('JOSM_preset', 'josm_preset.xml')
LOGGER = logging.getLogger('QuickOSM')


class PresetsParser:
    """Management of the presets file."""
    def __init__(self):

        self.file = xml.parse(PRESET_PATH)
        locale, translate_path = setup_translation(file_pattern="preset_{}.po")
        if translate_path:
            # LOGGER.info('Translation of presets to {}'.format(file_path))
            self.translate = self.preset_translate(translate_path)
        else:
            # LOGGER.info('Translation of presets not found: {}'.format(locale))
            self.translate = {}
Exemple #11
0
 def icon(self):
     """Return the icon."""
     return QIcon(resources_path('icons', 'QuickOSM.svg'))
Exemple #12
0
 def svgIconPath(self) -> str:
     """Return the icon path."""
     return resources_path('icons', 'QuickOSM.svg')
Exemple #13
0
 def svgIconPath(self):
     return resources_path('icons', 'QuickOSM.svg')
Exemple #14
0
 def icon(self):
     return QIcon(resources_path('icons', 'QuickOSM.svg'))