[OSM-talk-fr] Gros polygone CLCF cassé

Jo winfixit at gmail.com
Mer 9 Nov 17:41:03 UTC 2011


Je ne sais pas si cela t'aide ou non, mais il y a moyen d'utiliser
Python/Jython comme langage de scripting en JOSM. J'ai fait un peu des
efforts de pionnier:

https://josm.openstreetmap.de/wiki/Help/Plugin/Scripting

En bas de la page il y a des liens vers plus d'exemples.

Et mon oeuvre:  :-)
https://josm.openstreetmap.de/wiki/Help/Plugin/Scripting/Python/RCN_Route_Validator

Hier j'ai créé un script qui facilite transférer le addr:housenumber
d'un batiment vers un node sur le contour:

Il faut juste sélectionner le(s) noeud(s)

#!/bin/jython
'''
HouseNumber.jy
- Take addr:housenumber from parent closed way and assign it to this
node, also set entrance=main and remove building=entrance for node
- make this node part of associatedStreet relation instead of closed way
- set source=bing2011 and change building=yes to building=house for
parent closed way

This code is released under the GNU General
Public License v2 or later.

The GPL v3 is accessible here:
http://www.gnu.org/licenses/gpl.html

The GPL v2 is accessible here:
http://www.gnu.org/licenses/old-licenses/gpl-2.0.html

It comes with no warranty whatsoever.

This code illustrates how to use Jython (Python in the scripting
plugin of JOSM) to:
* find out whether the member is a node, a way or a relation
* add/change properties of a relation
* remove properties of a relation
* add members to a relation
* remove members from a relation

* How to set an element selected

'''
from javax.swing import JOptionPane
from org.openstreetmap.josm import Main
import org.openstreetmap.josm.command as Command
import org.openstreetmap.josm.data.osm.Node as Node
import org.openstreetmap.josm.data.osm.Way as Way
import org.openstreetmap.josm.data.osm.Relation as Relation
import org.openstreetmap.josm.data.osm.TagCollection as TagCollection
import org.openstreetmap.josm.data.osm.DataSet as DataSet
import org.openstreetmap.josm.data.osm.RelationMember as RelationMember
import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask
as DownloadRelationMemberTask
import org.openstreetmap.josm.actions.DownloadReferrersAction as
DownloadReferrersAction
import org.openstreetmap.josm.actions.AutoScaleAction as AutoScaleAction
import re, time

def getMapView():
    if Main.main and Main.main.map:
        return Main.main.map.mapView
    else:
        return None

dummy_way = Way()
dummy_relation = Relation()

mv = getMapView()
if mv and mv.editLayer and mv.editLayer.data:
    selectedNodes = mv.editLayer.data.getSelectedNodes()

    if not(selectedNodes):
        JOptionPane.showMessageDialog(Main.parent, "Please select (a)
node(s), which will become the main entrance of a building and inherit
its housenumber")
    else:
        for node in selectedNodes:
            commandsList = []; hnOnBuilding = None
            newNode = Node(node)
            relationChanged = nodeChanged = buildingChanged = False
            for referrer in node.getReferrers():
                if referrer.getType() == dummy_way.getType() and
referrer.isClosed() and (referrer.get('building') or
referrer.get('amenity')):
                    building = Way(referrer)
                    hnOnNode = node.get('addr:housenumber')
                    hnOnBuilding = building.get('addr:housenumber')
                    if hnOnNode:
                        if hnOnBuilding:
                            if hnOnNode != hnOnBuilding:
                                hnOnBuilding =
JOptionPane.showInputDialog(Main.parent,
                                "Which is the correct house number? ",
                                'Change spelling?',
                                JOptionPane.QUESTION_MESSAGE,
                                None,
                                None,
                                hnOnNode + ';' + hnOnBuilding)
                        else:
                            hnOnBuilding = hnOnNode
                    source = building.get('source')
                    if source:
                        if source == 'bing':
                            building.put('source', 'bing2011')
                        else:
                            building.put('source', source + ';bing2011')
                    else:
                        building.put('source', 'bing2011')
                    building.put('building', 'house')
                    building.remove('addr:housenumber')
                    if building.get('amenity') == 'shelter':
building.remove('amenity')
                    building.remove('shelter_type')
                    buildingChanged = True

                    for buildingreferrer in referrer.getReferrers():
                        print buildingreferrer
                        if buildingreferrer.getType() ==
dummy_relation.getType() and buildingreferrer.get('type') ==
'associatedStreet':

                            aSRel = Relation(buildingreferrer)
                            pos = 0
                            for member in buildingreferrer.getMembers():
                                if member.getMember() == referrer:
                                    break
                                pos += 1
                            print pos
                            aSRel.removeMembersFor(referrer)
                            newMember = RelationMember('house', node)
                            aSRel.addMember(pos, newMember)
                            relationChanged = True

                if hnOnBuilding:
                    newNode.put('addr:housenumber', hnOnBuilding)
                newNode.put('entrance', 'main')
                if node.get('building') == 'entrance':
newNode.remove('building')
                nodeChanged = True

            if nodeChanged:
                commandsList.append(Command.ChangeCommand(node, newNode))
            if buildingChanged:
                commandsList.append(Command.ChangeCommand(referrer, building))
            if relationChanged:

commandsList.append(Command.ChangeCommand(buildingreferrer, aSRel))

            if commandsList:
                if not(hnOnBuilding): hnOnBuilding = ''

Main.main.undoRedo.add(Command.SequenceCommand("Reassigning house
number " + hnOnBuilding, commandsList))



Jo


2011/11/9 Cedric Viou <cedricdumezviou at gmail.com>:
>> Le script reste néanmoins très intéressant. Je ne souviens plus si tu
>> souhaitais publier ton script. Ca pourrait toujours servir ailleurs
>> pour d'autres poly CLC ou d'autres imports, pas seulement en France.
>> Et il pourrait être amélioré par d'autres pour travailler directement
>> avec des données OSM.
>
> Il est discrètement dispo (http://cedric.dumez-viou.fr/scripts_m_V1.zip)
> mais c'est du script matlab (que vous pouvez librement réutiliser).
> J'avais commencé à le réécrire en python mais il n'y avait plus de gros CLC
> à importer: j'ai laissé tombé.
>
> Puisque le découpage de gros polygones existants semble utile, je peux
> continuer le portage et faire une doc.
>
> J'ai essayé de récupérer le polygone sur
> http://clc.openstreetmap.fr/cgi-bin/index.py mais je ne vois plus les
> info-bulles.  C'est moi?
>
> Cedric
>
> _______________________________________________
> Talk-fr mailing list
> Talk-fr at openstreetmap.org
> http://lists.openstreetmap.org/listinfo/talk-fr
>




Plus d'informations sur la liste de diffusion Talk-fr