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

Cedric Viou cedricdumezviou at gmail.com
Mer 9 Nov 20:43:46 UTC 2011


Merci pour le code, ce sera bien utile pour l'interaction avec josm.

Je vais commencer par recoder le traitement sur un polygone nu dans son 
.osm et je tacherai ensuite de l'insérer dans JOSM (j'ai souvenir que 
les gros-gros polygones mettait JOSM à genou sur ma machine).

Cordialement,

Cedric

Le 09/11/2011 18:41, Jo a écrit :
> 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
>>
>
> _______________________________________________
> 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