Quote<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<osm version="0.6" generator="OsmPad">
<bounds minlat="53.909546117" minlon="10.8045011759" maxlat="53.9172999718" maxlon="10.8513003588" />
<node id="-1" lat="53.913960366529295" lon="10.804501175880432" version="1" action="modify">
<tag k="addr:housenumber" v="/1" />
</node>
<node id="-2" lat="53.91263013716634" lon="10.811887979507446" version="1" action="modify">
<tag k="addr:housenumber" v="24" />
</node>
<node id="-3" lat="53.912645935863466" lon="10.812376141548157" version="1" action="modify">
<tag k="addr:housenumber" v="50" />
</node>
<node id="-4" lat="53.91258906052584" lon="10.81305205821991" version="1" action="modify">
<tag k="addr:housenumber" v="99" />
</node>
....
</osm>
Quote<osm version="0.6" generator="OsmPad">
Quote<node id="-4" lat="53.91258906052584" lon="10.81305205821991" version="1" action="modify">
$line =~ s{wert="(\d+)"}{sprintf 'wert="%d"', function($1) }e;
QuoteVor allem, wenn die Tags wirklich pro Zeile vorliegen; denn dann kann man einfach zeilenweise einlesen lassen.
Quoteh zeilenweise einlesen lassen.
QuoteXML-Parser
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
my $string = "rue' version='4' changeset='6456424' lat='36.7256674' lon='-4.4539391' />"; sub modify_lat_lon { my $lat = shift; # lat='1.11' my $lon = shift; # lon='2.22' my $fill = shift; # whatever is between the stuff above $lat =~ s/-?[\d.,]+/new_lat/; $lon =~ s/-?[\d.,]+/new_lon/; # recombine the parts to one string return $lat . $fill . $lon; } # one way (lat .. lon) or the other (lon .. lat) $string =~ s/(lat='[^']+')(.*)(lon='[^']+')/modify_lat_lon($1,$3,$2)/e || $string =~ s/(lon='[^']+')(.*)(lat='[^']+')/modify_lat_lon($3,$1,$2)/e; print $string, $/;
rue' version='4' changeset='6456424' lat='new_lat' lon='new_lon' />
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# Auslesen der Koordinaten my ($lat_old) = $line =~ m/lat='(-?\d+\.\d+)/; my ($lon_old) = $line =~ m/lon='(-?\d+\.\d+)/; if (defined ($lat_old) && defined ($lon_old)){ print "lon old: ".$lon_old."\n"; print "lat old: ".$lat_old."\n\n"; #konvertierung in Bogenmass # hier werden einige Berechnungen ausgeführt print "lon new: ".$lon_new."\n"; print "lat new: ".$lat_new."\n"; print "-------------------------------------\n"; print "davor line: ".$line."\n"; print "lon new: ".$lon_new."\n"; print "lat new: ".$lat_new."\n"; $line =~ s/lon='(\d+\.\d+)/lon='$lon_new/; $line =~ s/lat='(\d+\.\d+)/lat='$lat_new/; print "danach line: ".$line."\n";
Quotelon old: -4.389817
lat old: 36.757238
lon new: -4.46019220086551
lat new: 36.7673760749574
-------------------------------------
davor line: <node id='-189' action='modify' visible='true' lat='36.757238' lon
='-4.389817' />
lon new: -4.46019220086551
lat new: 36.7673760749574
danach line: <node id='-189' action='modify' visible='true' lat='36.7673760749
574' lon='-4.389817' />
QuoteDas Problem ist das in den Austauschzeilen die lat-Werte getauscht werden! Der lon-Wert hingegeben bleibt unberücksichtigt. Besser gesagt der alte Wert bleibt erhalten!
1 2
$line =~ s/lon='(\d+\.\d+)/lon='$lon_new/; $line =~ s/lat='(\d+\.\d+)/lat='$lat_new/;
QuoteDeine Substitutionen matchen bei negativen Werten nicht.
$line =~ s/lon='(\d+\.\d+)/lon='$lon_new/;
$lat =~ s/-?[\d.,]+/$new_lat/;
$line =~ s/lon='(\d+\.\d+)/lon='$lon_new/;
$line =~ s/lon='(\d+\.\d+)/lon='$lon_new/;
QuoteWenn ich mir, mit meinem Verständnis die Zeile
Code (perl): (dl )$lat =~ s/-?[\d.,]+/$new_lat/;
ansehe, dann wird doch da ein Wert extrahiert. Richtig ??
1 2
$line =~ s/lon='(\d+\.\d+)/lon='$lon_new/; $line =~ s/lat='(\d+\.\d+)/lat='$lat_new/;
1 2
$line =~ s/lon='(-?\d+\.\d+)/lon='$lon_new/; $line =~ s/lat='(-?\d+\.\d+)/lat='$lat_new/;
Quote<node id='13838246' timestamp='2012-02-12T18:13:28Z' uid='55462' user='Lübeck' visible='true' version='9' changeset='10666125' lat='36.7146592540898' lon='-4.4524097' />
1
2
my ($lat_old) = $line =~ m/lat='(-?\d+\.\d+)/;
my ($lon_old) = $line =~ m/lon='(-?\d+\.\d+)/;
1
2
$line =~ s/lon='(-?\d+\.\d+)/lon='$lon_new/;
$line =~ s/lat='(-?\d+\.\d+)/lat='$lat_new/;
$line =~ s/upload='true'/upload='false'/;
Quote<osm version='0.6' generator='OsmPad'>
1
2
3
if ( ( '<osm' in Zeile enthalten ) && ( 'upload=' nicht in Zeile enthalten ) ) {
suche '>' und ersetze es durch ' upload="false">' ;
}