[josm-dev] Scripting plugin
Jo
winfixit at gmail.com
Thu Apr 14 19:45:50 BST 2011
I will add it myself, but I'm still working on it, that's why I didn't do it
yet.
Cheers,
Polyglot
2011/4/14 Karl Guggisberg <karl.guggisberg at guggis.ch>
> A russian user created another script in JavaScript and announced it on the
> OSM blog. I've added a link to the ScriptingPlugin page,
> http://wiki.openstreetmap.org/wiki/JOSM/Plugins/Scripting. I'd like to add
> yours too, please let me know about an URL, if you publish it somewhere. Of
> course, you can add it to the Wiki yourself, if you want to.
>
> Regards
> Karl
>
>
> 2011/4/14 Paul Hartmann <phaaurlt at googlemail.com>
>
>> Jo wrote:
>>
>>> I'm back on track with the scripting plugin. I created a Jython script
>>> that
>>> helps to find probable spelling errors in street names. It's quite
>>> specific
>>> in that it supports the bilingual status of Brussels.
>>>
>>> #!/bin/jython
>>>
>>>> #
>>>> # Spell checking.py - Helps to locate probable spell errors
>>>> #
>>>> 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.TagCollection as TagCollection
>>>> import org.openstreetmap.josm.data.osm.DataSet as DataSet
>>>>
>>>> corrections = {'fr': [('Dr. ', 'Docteur '),('R. ', 'Rue '), ('Av. ',
>>>> 'Avenue '), ('Bd. ', 'Boulevard '),
>>>> ('Sq.', 'Square'), ('Pl.', 'Place'),
>>>> (' De ', ' de '), (' Le ', ' le '), (' La ', ' la
>>>> '),
>>>> (' Du ', ' du '), (' Des ', ' des '), (' Les ', ' les '),
>>>> (' Au ', ' au '),(' Aux ', ' aux '),('À', 'à'),('
>>>> Den
>>>> ',' den '), (" Sur ", " sur "),
>>>> (" D'"," d'"), (" L'"," l'"), ("' ","'"),
>>>> ("Ecole ","École "), ("Eglise", "Église"),
>>>> ("Chateau", "Château"), ("Cable", "Câble"), ("General", "Général")],
>>>> 'nl': [(" Voor ", " voor "), (" Op ", " op "), (" Pour ",
>>>> "
>>>> pour "), (" Naar ", " naar "), (" Ter ", " ter "), (" En ", " en "), ("
>>>> Van
>>>> ", " van "),
>>>> ("'T ", "'t "), ("'S ", "'s "), ("-Ter-", "-ter-"),
>>>> (" Het ", " het "),
>>>> (" Straat", "straat"), (" Weg", "weg"), (" Laan",
>>>> "laan"), (" Steenweg", "steenweg"),
>>>> (" Baan", "baan"), ("Oudebaan", "Oude Baan"),
>>>> ("Grotebaan", "Grote Baan"),
>>>> ("de Lijn", "De Lijn")]}
>>>>
>>>> commandsList = []
>>>> streetnames = {}
>>>>
>>>> def getMapView():
>>>> if Main.main and Main.main.map:
>>>> return Main.main.map.mapView
>>>> else:
>>>> return None
>>>>
>>>> def myOwnCapitalize(word):
>>>> # JOptionPane.showMessageDialog(Main.parent, word.decode('utf-8'))
>>>> if word:
>>>> return word[0].upper() + word[1:]
>>>> else:
>>>> return u""
>>>>
>>>> mv = getMapView()
>>>>
>>>> if mv and mv.editLayer and mv.editLayer.data:
>>>> selectedNodes = mv.editLayer.data.getSelectedNodes()
>>>> selectedWays = mv.editLayer.data.getWays()
>>>> selectedRelations = mv.editLayer.data.getSelectedRelations()
>>>>
>>>> if not(selectedNodes or selectedWays or selectedRelations):
>>>> JOptionPane.showMessageDialog(Main.parent, "Please select
>>>> something")
>>>> else:
>>>> for way in selectedWays:
>>>> for isoLang in ['nl', 'fr', '']:
>>>> correctedName = result = u''
>>>> if isoLang:
>>>> nameColonIso = 'name:' + isoLang
>>>> else:
>>>> nameColonIso = 'name'
>>>> if way.hasKey(nameColonIso):
>>>> name=str(way.get(nameColonIso).encode('utf-8'))
>>>> if name in streetnames:
>>>> if streetnames[name] == 'ignore':
>>>> continue
>>>> else:
>>>> correctedName = streetnames[name]
>>>> else:
>>>> Main.main.getCurrentDataSet().setSelected(way)
>>>> # dummy = mv.editLayer.data.getSelected()
>>>> #
>>>> mv.zoomTo(Main.main.getEditLayer().data.getSelected())
>>>> # JOptionPane.showMessageDialog(Main.parent,
>>>> name.decode('utf-8'))
>>>> for subname in name.split(";"):
>>>> for word in subname.split(" "):
>>>> if word:
>>>> if "-" in word and len(word)>1:
>>>> dashes = word.split("-")
>>>>
>>>> correctedName +=
>>>> myOwnCapitalize(dashes[0])
>>>> for dash in dashes[1:]:
>>>> # if dash[0] == ' ':
>>>> # correctedName += u"-" +
>>>> myOwnCapitalize(dash[1:])
>>>> # else:
>>>> correctedName += u"-" +
>>>> myOwnCapitalize(dash.strip())
>>>> elif "'" in word and not("." in
>>>> word):
>>>> apo=word.split("'")
>>>> if apo[0]: correctedName +=
>>>> myOwnCapitalize(apo[0])
>>>> correctedName += "'"
>>>> if apo[1]: correctedName +=
>>>> myOwnCapitalize(apo[1])
>>>> elif "." in word or len(word)>1 and
>>>> word[1]==word[1].upper() or len(word)>2 and word[2]==word[2].upper():
>>>> correctedName += word
>>>> else:
>>>> correctedName +=
>>>> myOwnCapitalize(word)
>>>> correctedName += ' '
>>>> correctedName = correctedName.strip() + ';'
>>>> if correctedName and correctedName[-1] == ';':
>>>> correctedName = correctedName[0:-1]
>>>> for lang in corrections:
>>>> if isoLang and isoLang != lang:
>>>> continue
>>>> elif not(isoLang) and way.hasKey('name:fr')
>>>> and
>>>> way.hasKey('name:nl'):
>>>> correctedName =
>>>> str(way.get('name:fr').encode('utf-8')) + ' - ' +
>>>> str(way.get('name:nl').encode('utf-8'))
>>>> else:
>>>> for wrongspelling, correction in
>>>> corrections[lang]:
>>>> correctedName =
>>>> correctedName.replace(wrongspelling, correction)
>>>> correctedName = correctedName.strip()
>>>> if name != correctedName:
>>>> try:
>>>> result =
>>>> JOptionPane.showInputDialog(Main.parent,
>>>> "Previous name: " +
>>>> name.decode('utf-8'),
>>>> 'Change spelling?',
>>>> JOptionPane.QUESTION_MESSAGE,
>>>> None,
>>>> None,
>>>> correctedName.decode('utf-8'))
>>>> except UnicodeDecodeError:
>>>> pass
>>>> if result: result = result.strip(' -')
>>>> print
>>>> print nameColonIso
>>>> print name
>>>> print result
>>>> if not(result):
>>>> streetnames[name] = 'ignore'
>>>> elif result.lower() == u'stop':
>>>> break
>>>> else:
>>>> streetnames[name] = result
>>>> newWay = Way(way)
>>>> newWay.put(nameColonIso, result)
>>>>
>>>> commandsList.append(Command.ChangeCommand(way,
>>>> newWay))
>>>> if commandsList:
>>>>
>>>> Main.main.undoRedo.add(Command.SequenceCommand("Spelling " +
>>>> nameColonIso +
>>>> ' ' + result, commandsList))
>>>> commandsList = []
>>>> if result and result.lower() == u'stop':
>>>> break
>>>>
>>>>
>>> What is important to note is that we found how to find (selected)
>>> elements,
>>> select elements and we also found a way to modify their tags and most
>>> importantly how to add the modifications to the undoRedo buffer.
>>>
>>
>> Great work! Maybe you can host it somewhere, so we can link it from the
>> wiki page of the Scripting plugin [1]. (Or simply put it in the wiki.) Also
>> consider adding a license note, so others can use or build on your script.
>>
>>
>> What I need to do now is to have a different type of dialog box, with
>>> custom
>>> buttons and edit fields. I want to be able to display name tags and all
>>> their translations at once.
>>>
>>
>> I suppose you have to use swing, like you already did with JOptionPane.
>> Personally, I would do a prototype in Java and then port it to jython. In
>> JOSM, we have a class ExtendedDialog that adds a little more functionality
>> to JDialog, but it shouldn't be problem with standard swing classes.
>>
>>
>> What I also would need, is a way to determine if a way is within a given
>>> closedway/multipolygon. This is necessary, because within Brussels the
>>> names
>>> are supposed to be bilingual, whereas in Flanders they are supposed to be
>>> in
>>> Dutch, occasionally accompanied by a name:fr tag.
>>>
>>> Is it possible to do that in JOSM?
>>>
>>
>> This ticket [2] may be interesting, I'd simply use
>> java.awt.geom.GeneralPath.contains(..).
>>
>> [1] http://wiki.openstreetmap.org/wiki/JOSM/Plugins/Scripting
>> [2] http://josm.openstreetmap.de/ticket/5694
>>
>> Paul
>>
>>
>> _______________________________________________
>> josm-dev mailing list
>> josm-dev at openstreetmap.org
>> http://lists.openstreetmap.org/listinfo/josm-dev
>>
>
>
More information about the josm-dev
mailing list