On Sat, 5 Jul 2008 17:56:18 +0000 (UTC) Sven Geggus <[EMAIL PROTECTED]> wrote:
> Hallo zusammen,
>
> so, jetzt kann ich endlich teilweise das anbieten, was ich eigentlich
> schon länger haben wollte aber bisher mangels xslt Kenntnisse nicht
> realisieren konnte.
>
> Prinzipiell bin ich zwar auch kein Perl Hacker sondern meine
> Scriptsprachen sind eher Python und Tcl, aber trotzdem liegt
> mir die prozedurale Welt wohl doch besser als xslt.
>
> Langer Rede kurzer Sinn! Ich hab trotzdem für orp einen patch gebaut,
> der die Breite von Flüssen berücksichtig, wenn ein with=X Tag an den
> Weg angehängt ist. X ist die Breite des Flusses in Meter.
Wir muessen zwei Breitenangaben beruecksichtigen 'width' und
'est_width' und ich empfehle die Verwendung von
'est_width' bei geschaetzter Breite.
Ich hab dein Patch etwas modifiziert (Anhang 'orp-river-width.diff').
> Ich möchte das ganze jedoch erst ins svn einchecken wenn es jemand
> ausprobiert und für funktioniell befunden hat.
>
Fuer's Erste sollte es tun (ich werde mal noch 'ne Landschaft rendern
in der ich mehr Breitenangaben habe).
Grusz
Christian
Index: orp-drawing.pm
===================================================================
--- orp-drawing.pm (revision 8751)
+++ orp-drawing.pm (working copy)
@@ -78,15 +78,54 @@
{
my ($linenode, $layer, $way, $class) = @_;
+ # explicit way specific style
+ my $style="";
+
# convenience variables
my $id = $way->{"id"};
my $nodes = $way->{"nodes"};
return unless(scalar(@$nodes));
+ # this is a special case for ways (rivers) where we honor a
+ # with=something tag.
+ # It is used to generate rivers of different width.
+ # This is done by an explicit specification of a
+ # style="stroke-width:..px" tag in the generated SVG output
+
+ my($way_width) = grep { defined }
+ map $way->{'tags'}->{$_} => qw( width est_width );
+
+ if( defined($way_width) and $way_width =~ /^ \d+\.?\d* m? $/x)
+ { # width an integer number w/ optional unit (meters)
+
+ $way_width =~ s/m$//;
+
+ # get all classes where width should be honored
+ my @honorWidth = split ' ' => get_variable("honorWidth","waterway-river-core waterway-river-casing");
+
+ # check if the list of honored classes contains the current class
+ my %currentClass = map { $_ => 1 } split(/ /,$class);
+
+ if(grep $currentClass{$_} => @honorWidth)
+ {
+ my $meter2PixelFactor = get_variable("meter2px","0.1375");
+
+ $way_width *= $meter2PixelFactor;
+
+ my $minLineWidth = get_variable("minLineWidth", "1");
+ my $maxLineWidth = get_variable("maxLineWidth", "100");
+
+ $way_width = $minLineWidth if $way_width < $minLineWidth;
+ $way_width = $maxLineWidth if $way_width > $maxLineWidth;
+
+ $style = "stroke-width:${way_width}px";
+ }
+ }
+
# first draw middle segment if we have more than 2 nodes
draw_path($linenode, "way_mid_$id",
- "osmarender-stroke-linecap-butt osmarender-no-marker-start osmarender-no-marker-end")
+ "osmarender-stroke-linecap-butt osmarender-no-marker-start osmarender-no-marker-end", $style)
if (scalar(@$nodes)>2);
# count connectors on first and last node
@@ -116,32 +155,32 @@
if ($first_node_connection_count == 1)
{
- draw_path($linenode, "way_start_$id", "osmarender-no-marker-end");
+ draw_path($linenode, "way_start_$id", "osmarender-no-marker-end", $style);
}
elsif ($first_node_lower_layer_connection_count > 0)
{
draw_path($linenode, "way_start_$id",
- "osmarender-stroke-linecap-butt osmarender-no-marker-end");
+ "osmarender-stroke-linecap-butt osmarender-no-marker-end", $style);
}
else
{
draw_path($linenode, "way_start_$id",
- "osmarender-stroke-linecap-round osmarender-no-marker-end");
+ "osmarender-stroke-linecap-round osmarender-no-marker-end", $style);
}
if ($last_node_connection_count == 1)
{
- draw_path($linenode, "way_end_$id", "osmarender-no-marker-start");
+ draw_path($linenode, "way_end_$id", "osmarender-no-marker-start", $style);
}
elsif ($last_node_lower_layer_connection_count > 0)
{
draw_path($linenode, "way_end_$id",
- "osmarender-stroke-linecap-butt osmarender-no-marker-start");
+ "osmarender-stroke-linecap-butt osmarender-no-marker-start", $style);
}
else
{
draw_path($linenode, "way_end_$id",
- "osmarender-stroke-linecap-round osmarender-no-marker-start");
+ "osmarender-stroke-linecap-round osmarender-no-marker-start", $style);
}
}
@@ -719,17 +758,18 @@
}
# -------------------------------------------------------------------
-# sub draw_path($rulenode, $path_id, $class)
+# sub draw_path($rulenode, $path_id, $class, $style)
#
# draws an SVG path with the given path reference and style.
# -------------------------------------------------------------------
sub draw_path
{
- my ($rulenode, $path_id, $addclass) = @_;
+ my ($rulenode, $path_id, $addclass, $style) = @_;
my $mask_class = $rulenode->getAttribute("mask-class");
my $class = $rulenode->getAttribute("class");
my $extra_attr = [];
+
if ($mask_class ne "")
{
my $mask_id = "mask_".$path_id;
@@ -752,11 +792,17 @@
$writer->endTag("mask");
$extra_attr = [ "mask" => "url(#".$mask_id.")" ];
}
-
- $writer->emptyTag("use",
- "xlink:href" => "#$path_id",
- @$extra_attr,
- "class" => defined($addclass) ? "$class $addclass" : $class);
+ if (defined($style) and $style ne "") {
+ $writer->emptyTag("use",
+ "xlink:href" => "#$path_id", "style" => "$style",
+ @$extra_attr,
+ "class" => defined($addclass) ? "$class $addclass" : $class);
+ } else {
+ $writer->emptyTag("use",
+ "xlink:href" => "#$path_id",
+ @$extra_attr,
+ "class" => defined($addclass) ? "$class $addclass" : $class);
+ }
}
1;
signature.asc
Description: PGP signature
_______________________________________________ Talk-de mailing list [email protected] http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/talk-de

