mapweaver/mwMisc.pm

574 lines
17 KiB
Perl
Raw Normal View History

2022-07-28 05:06:48 -04:00
#
# PERL mapweaver module by gary68
#
#
#
#
2022-07-28 06:32:59 -04:00
# Copyright(C)2011, Gerhard Schwanz
2022-07-28 05:06:48 -04:00
#
# This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
2022-07-28 06:32:59 -04:00
# Free Software Foundation; either version 3 of the License, or(at your option)any later version.
2022-07-28 05:06:48 -04:00
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
#
2022-07-28 06:32:59 -04:00
package mwMisc;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
use strict;
use warnings;
2022-07-28 05:06:48 -04:00
use Math::Trig;
2022-07-28 06:32:59 -04:00
use Math::Polygon;
use List::Util qw[min max];
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
use mwConfig;
use mwFile;
# use mwMap;
2022-07-28 05:06:48 -04:00
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
2022-07-28 06:32:59 -04:00
require Exporter;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
@ISA = qw(Exporter AutoLoader);
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
@EXPORT = qw(getValue
2022-07-28 05:06:48 -04:00
createLabel
buildRings
angleMapgen
triangleNode
intersection
areaSize
isIn
processPageNumbers
processRectangles
sizePNG
sizeSVG
createDirPdf
getPointOfWay
nodes2Coordinates
areaCenter
createTextSVG
wayVisible
labelTransform
2022-07-28 06:32:59 -04:00
);
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
sub getValue{ my($key, $aRef)= @_;
my $value = undef;
foreach my $kv(@$aRef){ if($kv->[0] eq $key){$value = $kv->[1];}} return $value;
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
sub createLabel{#
# takes @tags and labelKey(s)from style file and creates labelTextTotal and array of labels for directory
2022-07-28 05:06:48 -04:00
# takes more keys in one string - using a separator.
#
# § all listed keys will be searched for and values be concatenated
# # first of found keys will be used to select value
# "name§ref" will return all values if given
# "name#ref" will return name, if given. if no name is given, ref will be used. none given, no text
#
2022-07-28 06:32:59 -04:00
my($ref1, $styleLabelText, $lon, $lat)= @_;
my @tags = @$ref1;
my @keys;
my @labels =();
my $labelTextTotal = "";
if(grep /!/, $styleLabelText){# AND
@keys = split(/!/, $styleLabelText);
# print "par found: $styleLabelText; @keys\n";
for(my $i=0; $i<=$#keys; $i++){ if($keys[$i] eq "_lat"){push @labels, $lat;}
if($keys[$i] eq "_lon"){push @labels, $lon;}
foreach my $tag(@tags){ if($tag->[0] eq $keys[$i]){ push @labels, $tag->[1];
} } } $labelTextTotal = "";
foreach my $label(@labels){$labelTextTotal .= $label . " ";}} else{# PRIO
@keys = split(/#/, $styleLabelText);
my $i = 0; my $found = 0;
while(($i<=$#keys)and($found == 0)){ if($keys[$i] eq "_lat"){push @labels, $lat; $found = 1; $labelTextTotal = $lat;}
if($keys[$i] eq "_lon"){push @labels, $lon; $found = 1; $labelTextTotal = $lon;}
foreach my $tag(@tags){ if($tag->[0] eq $keys[$i]){ push @labels, $tag->[1];
$labelTextTotal = $tag->[1];
$found = 1;
} } $i++;
}
} return($labelTextTotal, \@labels);
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
sub buildRings{#
2022-07-28 05:06:48 -04:00
# accepts ref to array of ways and option if unclosed rings shoulf be returned
# closeOpt == 1 returns only closed rings
#
# returns two refs to arrays of arrays: ways and nodes
#
2022-07-28 06:32:59 -04:00
my($ref, $closeOpt)= @_;
my(@allWays)= @$ref;
my @ringWays =();
my @ringNodes =();
my $ringCount = 0;
my($memWayNodesRef, $memWayTagsRef)= mwFile::getWayPointers();
# print "build rings for @allWays\n";
if(cv('debug')eq "1"){print "BR: called.\n";} while(scalar @allWays > 0){ # build new test ring
my(@currentWays)=(); my(@currentNodes)=();
push @currentWays, $allWays[0];
if(cv('debug')eq "1"){print "BR: initial way for next ring id= $allWays[0]\n";} push @currentNodes, @{$$memWayNodesRef{$allWays[0]}};
my $startNode = $currentNodes[0];
my $endNode = $currentNodes[-1];
if(cv('debug')eq "1"){print "BR: initial start and end node $startNode $endNode\n";} my $closed = 0;
shift @allWays; # remove first element
if($startNode == $endNode){$closed = 1;}
my $success = 1;
while(($closed == 0)and((scalar @allWays)> 0)and($success == 1)){ # try to find new way
if(cv('debug')eq "1"){print "TRY TO FIND NEW WAY\n";} $success = 0;
if(cv('debug')eq "1"){print "BR: actual start and end node $startNode $endNode\n";} my $i = 0;
while(($i <(scalar @allWays))and($success == 0)){ if(cv('debug')eq "1"){print "BR: testing way $i = $allWays[$i]\n";} if(cv('debug')eq "1"){print "BR: rev in front?\n";} if($$memWayNodesRef{$allWays[$i]}[0] == $startNode){
$success = 1;
2022-07-28 05:06:48 -04:00
# reverse in front
2022-07-28 06:32:59 -04:00
@currentWays =($allWays[$i], @currentWays);
@currentNodes =(reverse(@{$$memWayNodesRef{$allWays[$i]}}), @currentNodes);
splice(@allWays, $i, 1);
} if($success ==0){ if(cv('debug')eq "1"){print "BR: app at end?\n";} if($$memWayNodesRef{$allWays[$i]}[0] == $endNode){
$success = 1;
2022-07-28 05:06:48 -04:00
# append at end
2022-07-28 06:32:59 -04:00
@currentWays =(@currentWays, $allWays[$i]);
@currentNodes =(@currentNodes, @{$$memWayNodesRef{$allWays[$i]}});
splice(@allWays, $i, 1);
} } if($success ==0){ if(cv('debug')eq "1"){print "BR: app in front?\n";} if($$memWayNodesRef{$allWays[$i]}[-1] == $startNode){
$success = 1;
2022-07-28 05:06:48 -04:00
# append in front
2022-07-28 06:32:59 -04:00
@currentWays =($allWays[$i], @currentWays);
@currentNodes =(@{$$memWayNodesRef{$allWays[$i]}}, @currentNodes);
splice(@allWays, $i, 1);
} } if($success ==0){ if(cv('debug')eq "1"){print "BR: rev at end?\n";} if($$memWayNodesRef{$allWays[$i]}[-1] == $endNode){
$success = 1;
2022-07-28 05:06:48 -04:00
# append reverse at the end
2022-07-28 06:32:59 -04:00
@currentWays =(@currentWays, $allWays[$i]);
@currentNodes =(@currentNodes,(reverse(@{$$memWayNodesRef{$allWays[$i]}})));
splice(@allWays, $i, 1);
} } $i++;
}# look for new way that fits
$startNode = $currentNodes[0];
$endNode = $currentNodes[-1];
if($startNode == $endNode){
$closed = 1;
if(cv('debug')eq "1"){print "BR: ring now closed\n";}
} }# new ring
2022-07-28 05:06:48 -04:00
# examine ring and act
2022-07-28 06:32:59 -04:00
if(($closed == 1)or($closeOpt == 0)){ # eliminate double nodes in @currentNodes
my $found = 1;
while($found){ $found = 0;
LABCN: for(my $i=0; $i<$#currentNodes; $i++){ if($currentNodes[$i] == $currentNodes[$i+1]){ $found = 1;
splice @currentNodes, $i, 1;
last LABCN;
} } } # add data to return data
@{$ringWays[$ringCount]}= @currentWays;
@{$ringNodes[$ringCount]}= @currentNodes;
$ringCount++;
}}
return(\@ringWays, \@ringNodes);
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
sub angleMapgen{#
2022-07-28 05:06:48 -04:00
# angle between lines/segments
#
2022-07-28 06:32:59 -04:00
my($g1x1)= shift;
my($g1y1)= shift;
my($g1x2)= shift;
my($g1y2)= shift;
my($g2x1)= shift;
my($g2y1)= shift;
my($g2x2)= shift;
my($g2y2)= shift;
my $g1m;
if(($g1x2-$g1x1)!= 0){ $g1m =($g1y2-$g1y1)/($g1x2-$g1x1); # steigungen
} else{ $g1m = 999999999;
}
my $g2m;
if(($g2x2-$g2x1)!= 0){ $g2m =($g2y2-$g2y1)/($g2x2-$g2x1);
} else{ $g2m = 999999999;
}
if($g1m == $g2m){ # parallel
return(0);
} else{ my $t1 = $g1m -$g2m;
my $t2 = 1 + $g1m * $g2m;
if($t2 == 0){ return 90;
} else{ my $a = atan(abs($t1/$t2))/ 3.141592654 * 180;
return $a;
}}}
sub triangleNode{#
2022-07-28 05:06:48 -04:00
# get segment of segment as coordinates
# from start or from end of segment
#
# 0 = start
# 1 = end
2022-07-28 06:32:59 -04:00
my($x1, $y1, $x2, $y2, $len, $startEnd)= @_;
my($c)= sqrt(($x2-$x1)**2 +($y2-$y1)**2);
my $percent = $len / $c;
my($x, $y);
if($startEnd == 0){
$x = $x1 +($x2-$x1)*$percent;
$y = $y1 +($y2-$y1)*$percent;
} else{ $x = $x2 -($x2-$x1)*$percent;
$y = $y2 -($y2-$y1)*$percent;
} return($x, $y);
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
sub intersection{#
# returns intersection point of two lines, else(0,0)#
my($g1x1)= shift;
my($g1y1)= shift;
my($g1x2)= shift;
my($g1y2)= shift;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my($g2x1)= shift;
my($g2y1)= shift;
my($g2x2)= shift;
my($g2y2)= shift;
if(($g1x1 == $g2x1)and($g1y1 == $g2y1)){# p1 = p1 ?
return($g1x1, $g1y1);
} if(($g1x1 == $g2x2)and($g1y1 == $g2y2)){# p1 = p2 ?
return($g1x1, $g1y1);
} if(($g1x2 == $g2x1)and($g1y2 == $g2y1)){# p2 = p1 ?
return($g1x2, $g1y2);
}
if(($g1x2 == $g2x2)and($g1y2 == $g2y2)){# p2 = p1 ?
return($g1x2, $g1y2);
}
my $g1m;
if(($g1x2-$g1x1)!= 0){ $g1m =($g1y2-$g1y1)/($g1x2-$g1x1); # steigungen
} else{ $g1m = 999999;
}
my $g2m;
if(($g2x2-$g2x1)!= 0){ $g2m =($g2y2-$g2y1)/($g2x2-$g2x1);
} else{ $g2m = 999999;
}
if($g1m == $g2m){ # parallel
return(0, 0);
}
my($g1b)= $g1y1 - $g1m * $g1x1; # abschnitte
my($g2b)= $g2y1 - $g2m * $g2x1;
my($sx)=($g2b-$g1b)/($g1m-$g2m); # schnittpunkt
my($sy)=($g1m*$g2b - $g2m*$g1b)/($g1m-$g2m);
my($g1xmax)= max($g1x1, $g1x2);
my($g1xmin)= min($g1x1, $g1x2);
my($g1ymax)= max($g1y1, $g1y2);
my($g1ymin)= min($g1y1, $g1y2);
my($g2xmax)= max($g2x1, $g2x2);
my($g2xmin)= min($g2x1, $g2x2);
my($g2ymax)= max($g2y1, $g2y2);
my($g2ymin)= min($g2y1, $g2y2);
if(($sx >= $g1xmin)and
($sx >= $g2xmin)and
($sx <= $g1xmax)and
($sx <= $g2xmax)and
($sy >= $g1ymin)and
($sy >= $g2ymin)and
($sy <= $g1ymax)and
($sy <= $g2ymax)){ return($sx, $sy);
} else{ return(0, 0);
}}
sub isIn{# checks two polygons
2022-07-28 05:06:48 -04:00
# return 0 = neither
# 1 = p1 is in p2
# 2 = p2 is in p1
2022-07-28 06:32:59 -04:00
my($p1, $p2)= @_;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my($p1In2)= 1;
my($p2In1)= 1;
2022-07-28 05:06:48 -04:00
# p1 in p2 ?
2022-07-28 06:32:59 -04:00
foreach my $pt1($p1->points){ if($p2->contains($pt1)){ # good
} else{ $p1In2 = 0;
}}
2022-07-28 05:06:48 -04:00
# p2 in p1 ?
2022-07-28 06:32:59 -04:00
foreach my $pt2($p2->points){ if($p1->contains($pt2)){ # good
} else{ $p2In1 = 0;
}}
if($p1In2 == 1){ return 1;
} elsif($p2In1 == 1){ return 2;
} else{ return 0;
}}
2022-07-28 05:06:48 -04:00
# -------------------------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub processPageNumbers{ if(cv('pageNumbers')ne ""){ my $pnSize; my $pnColor;
my @a = split /,/, cv('pageNumbers');
if(scalar @a >= 3){ $pnSize = $a[0];
$pnColor = $a[1];
my $pnNumber = $a[2];
if($pnNumber != 0){ drawPageNumber($pnSize, $pnColor, $pnNumber);
} } if(scalar @a == 7){ # draw 4 other positions if ne 0!!!
if($a[3] != 0){# left
drawPageNumberLeft($pnSize, $pnColor, $a[3]);
} if($a[4] != 0){# bottom
drawPageNumberBottom($pnSize, $pnColor, $a[4]);
} if($a[5] != 0){# right
drawPageNumberRight($pnSize, $pnColor, $a[5]);
} if($a[6] != 0){# top
drawPageNumberTop($pnSize, $pnColor, $a[6]);
} }}}
sub drawPageNumber{ my($size, $col, $num)= @_;
my($sizeX, $sizeY)= mwMap::getDimensions();
my $x = $sizeX - 2 * $size;
my $y = $sizeY - 2 * $size;
my $svgString = "fill=\"$col\" font-size=\"$size\" ";
mwMap::drawText($x, $y, 0, $num, $svgString, "text")}
sub drawPageNumberLeft{ my($size, $col, $num)= @_;
my($sizeX, $sizeY)= mwMap::getDimensions();
my $x = 2 * $size;
my $y = $sizeY / 2;
my $svgString = "fill=\"$col\" font-size=\"$size\" ";
mwMap::drawText($x, $y, 0, $num, $svgString, "text")}
sub drawPageNumberBottom{ my($size, $col, $num)= @_;
my($sizeX, $sizeY)= mwMap::getDimensions();
my $x = $sizeX / 2;
my $y = $sizeY - 2 * $size;
my $svgString = "fill=\"$col\" font-size=\"$size\" ";
mwMap::drawText($x, $y, 0, $num, $svgString, "text")}
sub drawPageNumberRight{ my($size, $col, $num)= @_;
my($sizeX, $sizeY)= mwMap::getDimensions();
my $x = $sizeX - 2 * $size;
my $y = $sizeY / 2;
my $svgString = "fill=\"$col\" font-size=\"$size\" ";
mwMap::drawText($x, $y, 0, $num, $svgString, "text")}
sub drawPageNumberTop{ my($size, $col, $num)= @_;
my($sizeX, $sizeY)= mwMap::getDimensions();
my $x = $sizeX / 2;
my $y = 2 * $size;
my $svgString = "fill=\"$col\" font-size=\"$size\" ";
mwMap::drawText($x, $y, 0, $num, $svgString, "text")}
2022-07-28 05:06:48 -04:00
# ---------------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub processRectangles{ my $no = 0;
if(cv('rectangles')ne ""){ my @rects;
@rects = split /#/, cv('rectangles');
foreach my $r(@rects){ $no++;
my @coords;
@coords = split /,/, $r;
my $left = $coords[0];
my $bottom = $coords[1];
my $right = $coords[2];
my $top = $coords[3];
my @nodes;
push @nodes, convert($left, $bottom);
push @nodes, convert($right, $bottom);
push @nodes, convert($right, $top);
push @nodes, convert($left, $top);
push @nodes, convert($left, $bottom);
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
# drawWay(10, "black", 5, "none", @nodes);
my $svgString = "fill=\"none\" stroke=\"black\" stroke-width=\"7\" ";
drawWay(\@nodes, 0, $svgString, "rectangles", undef);
# drawRect($left, $bottom, $right, $top, 1, $svgString, "rectangles");
if(cv('pagenumbers')ne ""){ my $x =($right + $left)/ 2;
my $y =($bottom + $top)/ 2;
my $xp; my $yp;
($xp, $yp)= convert($x, $y);
# drawTextPixGrid($xp, $yp, $no, $pnColor, scalePoints(scaleBase($pnSize)));
my $svgString = "fill=\"black\" font-size=\"60\" ";
drawText($xp, $yp, 0, $no, $svgString, "rectangles");
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
}}}
2022-07-28 05:06:48 -04:00
# --------------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub sizePNG{#
2022-07-28 05:06:48 -04:00
# evaluates size of png graphics
#
2022-07-28 06:32:59 -04:00
my $fileName = shift;
my($x, $y);
my $file;
my $result = open($file, "<", $fileName);
if($result){ my $pic = newFromPng GD::Image($file);
($x, $y)= $pic->getBounds;
close($file);
} else{($x, $y)=(0, 0);
} return($x, $y);
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
sub sizeSVG{#
2022-07-28 05:06:48 -04:00
# evaluates size of svg graphics
#
2022-07-28 06:32:59 -04:00
my $fileName = shift;
my $file;
my($x, $y); undef $x; undef $y;
my $result = open($file, "<", $fileName);
if($result){ my $line;
while($line = <$file>){ my($x1)=($line =~ /^.*width=\"([\d]+)px\"/);
my($y1)=($line =~ /^.*height=\"([\d]+)px\"/);
if(!defined $x1){ ($x1)=($line =~ /^\s*width=\"([\d]+)\"/);
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
if(!defined $y1){ ($y1)=($line =~ /^\s*height=\"([\d]+)\"/);
}
if(defined $x1){$x = $x1;} if(defined $y1){$y = $y1;} } close($file);
}
if((!defined $x)or(!defined $y)){
$x = 0; $y = 0;
print "WARNING: size of file $fileName could not be determined.\n";
}
return($x, $y);
2022-07-28 05:06:48 -04:00
}
# ------------------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub createDirPdf{ if((cv('dir')eq "1")or(cv('poi')eq "1")){ if(cv('grid')> 0){ my $dirPdfName = cv('out');
$dirPdfName =~ s/.svg/_dir.pdf/;
my $sName = "none";
my $pName = "none";
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my $prg = cv('dirprg');
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
if(cv('dir')eq "1"){$sName = cv('directoryname');} if(cv('poi')eq "1"){$pName = cv('poiname');} my $dirColNum = cv('dircolnum');
my $dirTitle = cv('dirtitle');
print "\ncalling perl $prg $sName $pName $dirTitle $dirPdfName $dirColNum\n\n";
`perl $prg $sName $pName \"$dirTitle\" $dirPdfName $dirColNum > out.txt`;
} else{ print "WARNING: directory PDF will not be created because -grid was not specified\n";
}
} else{ print "WARNING: directory PDF will not be created because neither -dir nor -poi was specified\n";
}}
2022-07-28 05:06:48 -04:00
# -----------------------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub getPointOfWay{ #
2022-07-28 05:06:48 -04:00
# returns point of way at distance/position
# coordinates and units are pixels
2022-07-28 06:32:59 -04:00
my($ref, $position)= @_;
my @points = @$ref;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my @double =();
while(scalar @points > 0){ my $x = shift @points;
my $y = shift @points;
push @double, [$x, $y];
}
my $i = 0; my $actLen = 0;
while($actLen < $position){ $actLen += sqrt(($double[$i]->[0]-$double[$i+1]->[0])**2 +($double[$i]->[1]-$double[$i+1]->[1])**2);
$i++;
}
my $x = int(($double[$i]->[0] + $double[$i-1]->[0])/ 2);
my $y = int(($double[$i]->[1] + $double[$i-1]->[1])/ 2);
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
# print "POW: $x, $y\n";
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
return($x, $y);
2022-07-28 05:06:48 -04:00
}
# ----------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub nodes2Coordinates{#
2022-07-28 05:06:48 -04:00
# transform list of nodeIds to list of x/y
# straight array in and out
#
2022-07-28 06:32:59 -04:00
my @nodes = @_;
my $i;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my @result =();
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my($lonRef, $latRef)= mwFile::getNodePointers();
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
foreach my $n(@nodes){ my($x, $y)= mwMap::convert($$lonRef{$n}, $$latRef{$n});
push @result, $x, $y;
}
return @result;
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
sub areaCenter{#
2022-07-28 05:06:48 -04:00
# calculate center of area by averageing lons/lats. could be smarter because result could be outside of area! TODO
#
2022-07-28 06:32:59 -04:00
my $ref = shift;
my @nodes = @$ref;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
# print "CENTER: @nodes\n";
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my $x = 0;
my $y = 0;
my $num = 0;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my($lonRef, $latRef)= getNodePointers();
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
foreach my $n(@nodes){ $x += $$lonRef{$n};
$y += $$latRef{$n};
$num++;
} $x = $x / $num;
$y = $y / $num;
return($x, $y);
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
sub areaSize{ my $ref = shift; # nodes
my @nodes = @$ref;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
# print "SIZE: @nodes\n";
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my($lonRef, $latRef)= mwFile::getNodePointers();
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my @poly =();
foreach my $node(@nodes){ my($x, $y)= mwMap::convert($$lonRef{$node}, $$latRef{$node});
push @poly, [$x, $y];
} my($p)= Math::Polygon->new(@poly);
my $size = $p->area;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
return $size;
2022-07-28 05:06:48 -04:00
}
# ---------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub createTextSVG{ my($fontFamily, $font, $bold, $italic, $size, $color, $strokeWidth, $strokeColor)= @_;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my $svg = "";
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
if((defined $font)and($font ne "")){ $svg .= "font=\"$font\" ";
} if((defined $fontFamily)and($fontFamily ne "")){ $svg .= "font-family=\"$fontFamily\" ";
}
if((defined $bold)and(lc($bold)eq "yes")){ $svg .= "font-weight=\"bold\" ";
} if((defined $italic)and(lc($italic)eq "yes")){ $svg .= "font-style=\"italic\" ";
}
if((defined $size)and($size ne "")){ $svg .= "font-size=\"$size\" ";
} if((defined $color)and($color ne "")){ $svg .= "fill=\"$color\" ";
}
if((defined $strokeColor)and($strokeColor ne "")){ $svg .= "stroke=\"$strokeColor\" ";
} if((defined $strokeWidth)and($strokeWidth ne "")){ $svg .= "stroke-width=\"$strokeWidth\" ";
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
return $svg;
}
2022-07-28 05:06:48 -04:00
# --------------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub wayVisible{ my $ref = shift;
my @points = @$ref;
my($sizeX, $sizeY)= mwMap::getDimensions();
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
my $result = 0;
2022-07-28 05:06:48 -04:00
2022-07-28 06:32:59 -04:00
for(my $i = 0; $i < $#points; $i += 2){ my $x = $points[$i];
my $y = $points[$i+1];
if(($x >= 0)and($y >= 0)and($x <= $sizeX)and($y <= $sizeY)){ $result = 1;
}} return $result;
2022-07-28 05:06:48 -04:00
}
# --------------------------------------------------------------------
2022-07-28 06:32:59 -04:00
sub labelTransform{ my($label, $cmd)= @_;
if($cmd ne ""){ eval $cmd;
if($@){print "ERROR processing label '$label' with command: '$cmd'\nERROR: $@\n";}} return $label;
2022-07-28 05:06:48 -04:00
}
2022-07-28 06:32:59 -04:00
1;
2022-07-28 05:06:48 -04:00