source: subversion/applications/utils/gary68/mwMisc.pm @ 26424

Last change on this file since 26424 was 26405, checked in by gary68, 8 years ago

mapweaver new version; pagenumber bug solved

File size: 16.6 KB
Line 
1#
2# PERL mapweaver module by gary68
3#
4#
5#
6#
7# Copyright (C) 2011, Gerhard Schwanz
8#
9# 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
10# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
16#
17
18
19package mwMisc ; 
20
21use strict ;
22use warnings ;
23
24use Math::Trig;
25use Math::Polygon ;
26use List::Util qw[min max] ;
27
28use mwConfig ;
29use mwFile ;
30# use mwMap ;
31
32use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
33
34require Exporter ;
35
36@ISA = qw ( Exporter AutoLoader ) ;
37
38@EXPORT = qw (  getValue
39                createLabel
40                buildRings
41                angleMapgen
42                triangleNode
43                intersection
44                areaSize
45                isIn
46                processPageNumbers
47                processRectangles
48                sizePNG
49                sizeSVG
50                createDirPdf
51                getPointOfWay
52                nodes2Coordinates
53                 ) ;
54
55
56
57sub getValue {
58        my ($key, $aRef) = @_ ;
59        my $value = undef ;
60        foreach my $kv (@$aRef) {
61                if ($kv->[0] eq $key) { $value = $kv->[1]; }
62        }
63        return $value ;
64}
65
66sub createLabel {
67#
68# takes @tags and labelKey(s) from style file and creates labelTextTotal and array of labels for directory
69# takes more keys in one string - using a separator.
70#
71# § all listed keys will be searched for and values be concatenated
72# # first of found keys will be used to select value
73# "name§ref" will return all values if given
74# "name#ref" will return name, if given. if no name is given, ref will be used. none given, no text
75#
76        my ($ref1, $styleLabelText, $lon, $lat) = @_ ;
77        my @tags = @$ref1 ;
78        my @keys ;
79        my @labels = () ;
80        my $labelTextTotal = "" ; 
81
82        if (grep /!/, $styleLabelText) { # AND
83                @keys = split ( /!/, $styleLabelText) ;
84                # print "par found: $styleLabelText; @keys\n" ;
85                for (my $i=0; $i<=$#keys; $i++) {
86                        if ($keys[$i] eq "_lat") { push @labels, $lat ; } 
87                        if ($keys[$i] eq "_lon") { push @labels, $lon ; } 
88                        foreach my $tag (@tags) {
89                                if ($tag->[0] eq $keys[$i]) {
90                                        push @labels, $tag->[1] ;
91                                }
92                        }
93                }
94                $labelTextTotal = "" ;
95                foreach my $label (@labels) { $labelTextTotal .= $label . " " ; }
96        }
97        else { # PRIO
98                @keys = split ( /#/, $styleLabelText) ;
99                my $i = 0 ; my $found = 0 ;
100                while ( ($i<=$#keys) and ($found == 0) ) {
101                        if ($keys[$i] eq "_lat") { push @labels, $lat ; $found = 1 ; $labelTextTotal = $lat ; } 
102                        if ($keys[$i] eq "_lon") { push @labels, $lon ; $found = 1 ; $labelTextTotal = $lon ; } 
103                        foreach my $tag (@tags) {
104                                if ($tag->[0] eq $keys[$i]) {
105                                        push @labels, $tag->[1] ;
106                                        $labelTextTotal = $tag->[1] ;
107                                        $found = 1 ;
108                                }
109                        }
110                        $i++ ;
111                }               
112        }
113        return ( $labelTextTotal, \@labels) ;
114}
115
116sub buildRings {
117#
118# accepts ref to array of ways and option if unclosed rings shoulf be returned
119# closeOpt == 1 returns only closed rings
120#
121# returns two refs to arrays of arrays: ways and nodes
122#
123        my ($ref, $closeOpt) = @_ ;
124        my (@allWays) = @$ref ;
125        my @ringWays = () ;
126        my @ringNodes = () ;
127        my $ringCount = 0 ;
128
129        my ($memWayNodesRef, $memWayTagsRef) = mwFile::getWayPointers() ;
130
131        # print "build rings for @allWays\n" ;
132        if (cv('debug') eq "1" ) { print "BR: called.\n" ; }
133        while ( scalar @allWays > 0) {
134                # build new test ring
135                my (@currentWays) = () ; my (@currentNodes) = () ;
136                push @currentWays, $allWays[0] ;
137                if (cv('debug') eq "1" ) { print "BR: initial way for next ring id= $allWays[0]\n" ; }
138                push @currentNodes, @{$$memWayNodesRef{$allWays[0]}} ;
139                my $startNode = $currentNodes[0] ;
140                my $endNode = $currentNodes[-1] ;
141                if (cv('debug') eq "1" ) { print "BR: initial start and end node $startNode $endNode\n" ; }
142                my $closed = 0 ;
143                shift @allWays ; # remove first element
144                if ($startNode == $endNode) {   $closed = 1 ; }
145
146                my $success = 1 ;
147                while ( ($closed == 0) and ( (scalar @allWays) > 0) and ($success == 1) ) {
148                        # try to find new way
149                        if (cv('debug') eq "1" ) { print "TRY TO FIND NEW WAY\n" ; }
150                        $success = 0 ;
151                        if (cv('debug') eq "1" ) { print "BR: actual start and end node $startNode $endNode\n" ; }
152                        my $i = 0 ;
153                        while ( ($i < (scalar @allWays) ) and ($success == 0) ) {
154                                if (cv('debug') eq "1" ) { print "BR: testing way $i = $allWays[$i]\n" ; }
155                                if (cv('debug') eq "1" ) { print "BR:   rev in front?\n" ; }
156                                if ( $$memWayNodesRef{$allWays[$i]}[0] == $startNode ) { 
157                                        $success = 1 ;
158                                        # reverse in front
159                                        @currentWays = ($allWays[$i], @currentWays) ;
160                                        @currentNodes = (reverse (@{$$memWayNodesRef{$allWays[$i]}}), @currentNodes) ;
161                                        splice (@allWays, $i, 1) ;
162                                }
163                                if ($success ==0) {
164                                        if (cv('debug') eq "1" ) { print "BR:   app at end?\n" ; }
165                                        if ( $$memWayNodesRef{$allWays[$i]}[0] == $endNode)  { 
166                                                $success = 1 ;
167                                                # append at end
168                                                @currentWays = (@currentWays, $allWays[$i]) ;
169                                                @currentNodes = (@currentNodes, @{$$memWayNodesRef{$allWays[$i]}}) ;
170                                                splice (@allWays, $i, 1) ;
171                                        }
172                                }
173                                if ($success ==0) {
174                                        if (cv('debug') eq "1" ) { print "BR:   app in front?\n" ; }
175                                        if ( $$memWayNodesRef{$allWays[$i]}[-1] == $startNode) { 
176                                                $success = 1 ;
177                                                # append in front
178                                                @currentWays = ($allWays[$i], @currentWays) ;
179                                                @currentNodes = (@{$$memWayNodesRef{$allWays[$i]}}, @currentNodes) ;
180                                                splice (@allWays, $i, 1) ;
181                                        }
182                                }
183                                if ($success ==0) {
184                                        if (cv('debug') eq "1" ) { print "BR:   rev at end?\n" ; }
185                                        if ( $$memWayNodesRef{$allWays[$i]}[-1] == $endNode) { 
186                                                $success = 1 ;
187                                                # append reverse at the end
188                                                @currentWays = (@currentWays, $allWays[$i]) ;
189                                                @currentNodes = (@currentNodes, (reverse (@{$$memWayNodesRef{$allWays[$i]}}))) ;
190                                                splice (@allWays, $i, 1) ;
191                                        }
192                                }
193                                $i++ ;
194                        } # look for new way that fits
195
196                        $startNode = $currentNodes[0] ;
197                        $endNode = $currentNodes[-1] ;
198                        if ($startNode == $endNode) { 
199                                $closed = 1 ; 
200                                if (cv('debug') eq "1" ) { print "BR: ring now closed\n" ;} 
201                        }
202                } # new ring
203               
204                # examine ring and act
205                if ( ($closed == 1) or ($closeOpt == 0) ) {
206                        # eliminate double nodes in @currentNodes
207                        my $found = 1 ;
208                        while ($found) {
209                                $found = 0 ;
210                                LABCN: for (my $i=0; $i<$#currentNodes; $i++) {
211                                        if ($currentNodes[$i] == $currentNodes[$i+1]) {
212                                                $found = 1 ;
213                                                splice @currentNodes, $i, 1 ;
214                                                last LABCN ;
215                                        }
216                                }
217                        }
218                        # add data to return data
219                        @{$ringWays[$ringCount]} = @currentWays ;
220                        @{$ringNodes[$ringCount]} = @currentNodes ;
221                        $ringCount++ ;
222                }
223        } 
224        return (\@ringWays, \@ringNodes) ;
225}
226
227sub angleMapgen {
228#
229# angle between lines/segments
230#
231        my ($g1x1) = shift ;
232        my ($g1y1) = shift ;
233        my ($g1x2) = shift ;
234        my ($g1y2) = shift ;
235        my ($g2x1) = shift ;
236        my ($g2y1) = shift ;
237        my ($g2x2) = shift ;
238        my ($g2y2) = shift ;
239
240        my $g1m ;
241        if ( ($g1x2-$g1x1) != 0 )  {
242                $g1m = ($g1y2-$g1y1)/($g1x2-$g1x1) ; # steigungen
243        }
244        else {
245                $g1m = 999999999 ;
246        }
247
248        my $g2m ;
249        if ( ($g2x2-$g2x1) != 0 ) {
250                $g2m = ($g2y2-$g2y1)/($g2x2-$g2x1) ;
251        }
252        else {
253                $g2m = 999999999 ;
254        }
255
256        if ($g1m == $g2m) {   # parallel
257                return (0) ;
258        }
259        else {
260                my $t1 = $g1m -$g2m ;
261                my $t2 = 1 + $g1m * $g2m ;
262                if ($t2 == 0) {
263                        return 90 ;
264                }
265                else {
266                        my $a = atan (abs ($t1/$t2)) / 3.141592654 * 180 ;
267                        return $a ;
268                }
269        }
270} 
271
272sub triangleNode {
273#
274# get segment of segment as coordinates
275# from start or from end of segment
276#
277        # 0 = start
278        # 1 = end
279        my ($x1, $y1, $x2, $y2, $len, $startEnd) = @_ ;
280        my ($c) = sqrt ( ($x2-$x1)**2 + ($y2-$y1)**2) ;
281        my $percent = $len / $c ;
282
283        my ($x, $y) ;
284        if ($startEnd == 0 ) { 
285                $x = $x1 + ($x2-$x1)*$percent ;
286                $y = $y1 + ($y2-$y1)*$percent ;
287        }
288        else {
289                $x = $x2 - ($x2-$x1)*$percent ;
290                $y = $y2 - ($y2-$y1)*$percent ;
291        }
292        return ($x, $y) ;
293}
294
295sub intersection {
296#
297# returns intersection point of two lines, else (0,0)
298#
299        my ($g1x1) = shift ;
300        my ($g1y1) = shift ;
301        my ($g1x2) = shift ;
302        my ($g1y2) = shift ;
303       
304        my ($g2x1) = shift ;
305        my ($g2y1) = shift ;
306        my ($g2x2) = shift ;
307        my ($g2y2) = shift ;
308
309        if (($g1x1 == $g2x1) and ($g1y1 == $g2y1)) { # p1 = p1 ?
310                return ($g1x1, $g1y1) ;
311        }
312        if (($g1x1 == $g2x2) and ($g1y1 == $g2y2)) { # p1 = p2 ?
313                return ($g1x1, $g1y1) ;
314        }
315        if (($g1x2 == $g2x1) and ($g1y2 == $g2y1)) { # p2 = p1 ?
316                return ($g1x2, $g1y2) ;
317        }
318
319        if (($g1x2 == $g2x2) and ($g1y2 == $g2y2)) { # p2 = p1 ?
320                return ($g1x2, $g1y2) ;
321        }
322
323        my $g1m ;
324        if ( ($g1x2-$g1x1) != 0 )  {
325                $g1m = ($g1y2-$g1y1)/($g1x2-$g1x1) ; # steigungen
326        }
327        else {
328                $g1m = 999999 ;
329        }
330
331        my $g2m ;
332        if ( ($g2x2-$g2x1) != 0 ) {
333                $g2m = ($g2y2-$g2y1)/($g2x2-$g2x1) ;
334        }
335        else {
336                $g2m = 999999 ;
337        }
338
339        if ($g1m == $g2m) {   # parallel
340                return (0, 0) ;
341        }
342
343        my ($g1b) = $g1y1 - $g1m * $g1x1 ; # abschnitte
344        my ($g2b) = $g2y1 - $g2m * $g2x1 ;
345
346        my ($sx) = ($g2b-$g1b) / ($g1m-$g2m) ;             # schnittpunkt
347        my ($sy) = ($g1m*$g2b - $g2m*$g1b) / ($g1m-$g2m);
348
349        my ($g1xmax) = max ($g1x1, $g1x2) ;
350        my ($g1xmin) = min ($g1x1, $g1x2) ;     
351        my ($g1ymax) = max ($g1y1, $g1y2) ;     
352        my ($g1ymin) = min ($g1y1, $g1y2) ;     
353
354        my ($g2xmax) = max ($g2x1, $g2x2) ;
355        my ($g2xmin) = min ($g2x1, $g2x2) ;     
356        my ($g2ymax) = max ($g2y1, $g2y2) ;     
357        my ($g2ymin) = min ($g2y1, $g2y2) ;     
358
359        if      (($sx >= $g1xmin) and
360                ($sx >= $g2xmin) and
361                ($sx <= $g1xmax) and
362                ($sx <= $g2xmax) and
363                ($sy >= $g1ymin) and
364                ($sy >= $g2ymin) and
365                ($sy <= $g1ymax) and
366                ($sy <= $g2ymax)) {
367                return ($sx, $sy) ;
368        }
369        else {
370                return (0, 0) ;
371        }
372} 
373
374
375sub areaSize {
376        my $ref = shift ; # nodes
377        my @nodes = @$ref ;
378
379        my ($lonRef, $latRef) = mwFile::getNodePointers() ;
380
381        my @poly = () ;
382        foreach my $node ( @nodes ) {
383                my ($x, $y) = mwMap::convert ($$lonRef{$node}, $$latRef{$node}) ;
384                push @poly, [$x, $y] ;
385        }
386        my ($p) = Math::Polygon->new(@poly) ;
387        my $size = $p->area ;
388
389        return $size ;
390}
391
392sub isIn {
393# checks two polygons
394# return 0 = neither
395# 1 = p1 is in p2
396# 2 = p2 is in p1
397        my ($p1, $p2) = @_ ;
398
399        my ($p1In2) = 1 ;
400        my ($p2In1) = 1 ;
401
402        # p1 in p2 ?
403        foreach my $pt1 ($p1->points) {
404                if ($p2->contains ($pt1) ) {
405                        # good
406                }
407                else {
408                        $p1In2 = 0 ;
409                }
410        }
411
412        # p2 in p1 ?
413        foreach my $pt2 ($p2->points) {
414                if ($p1->contains ($pt2) ) {
415                        # good
416                }
417                else {
418                        $p2In1 = 0 ;
419                }
420        }
421
422        if ($p1In2 == 1) {
423                return 1 ;
424        }
425        elsif ($p2In1 == 1) {
426                return 2 ;
427        }
428        else {
429                return 0 ;
430        }
431}
432
433# -------------------------------------------------------------------------------
434
435sub processPageNumbers {
436        if ( cv('pageNumbers') ne "") {
437                my $pnSize ; my $pnColor ;
438                my @a = split /,/, cv('pageNumbers') ;
439                if (scalar @a >= 3) {
440                        $pnSize = $a[0] ;
441                        $pnColor = $a[1] ;
442                        my $pnNumber = $a[2] ;
443
444                        if ($pnNumber != 0) {
445                                drawPageNumber ($pnSize, $pnColor, $pnNumber) ;
446                        }
447                }
448                if (scalar @a == 7) {
449                        # draw 4 other positions if ne 0!!!
450                        if ($a[3] != 0) { # left
451                                drawPageNumberLeft ($pnSize, $pnColor, $a[3]) ;
452                        }
453                        if ($a[4] != 0) { # bottom
454                                drawPageNumberBottom ($pnSize, $pnColor, $a[4]) ;
455                        }
456                        if ($a[5] != 0) { # right
457                                drawPageNumberRight ($pnSize, $pnColor, $a[5]) ;
458                        }
459                        if ($a[6] != 0) { # top
460                                drawPageNumberTop ($pnSize, $pnColor, $a[6]) ;
461                        }
462                }
463        }
464}
465
466sub drawPageNumber {
467        my ($size, $col, $num) = @_ ;
468        my ($sizeX, $sizeY) = mwMap::getDimensions() ;
469        my $x = $sizeX - 2 * $size ;
470        my $y = $sizeY - 2 * $size ;
471        my $svgString = "fill=\"$col\" font-size=\"$size\" " ;
472        mwMap::drawText ($x, $y, 0, $num, $svgString, "text")
473}
474
475sub drawPageNumberLeft {
476        my ($size, $col, $num) = @_ ;
477        my ($sizeX, $sizeY) = mwMap::getDimensions() ;
478        my $x = 2 * $size ;
479        my $y = $sizeY / 2 ;
480        my $svgString = "fill=\"$col\" font-size=\"$size\" " ;
481        mwMap::drawText ($x, $y, 0, $num, $svgString, "text")
482}
483
484sub drawPageNumberBottom {
485        my ($size, $col, $num) = @_ ;
486        my ($sizeX, $sizeY) = mwMap::getDimensions() ;
487        my $x = $sizeX / 2 ;
488        my $y = $sizeY - 2 * $size ;
489        my $svgString = "fill=\"$col\" font-size=\"$size\" " ;
490        mwMap::drawText ($x, $y, 0, $num, $svgString, "text")
491}
492
493sub drawPageNumberRight {
494        my ($size, $col, $num) = @_ ;
495        my ($sizeX, $sizeY) = mwMap::getDimensions() ;
496        my $x = $sizeX - 2 * $size ;
497        my $y = $sizeY / 2 ;
498        my $svgString = "fill=\"$col\" font-size=\"$size\" " ;
499        mwMap::drawText ($x, $y, 0, $num, $svgString, "text")
500}
501
502sub drawPageNumberTop {
503        my ($size, $col, $num) = @_ ;
504        my ($sizeX, $sizeY) = mwMap::getDimensions() ;
505        my $x = $sizeX / 2 ;
506        my $y = 2 * $size ;
507        my $svgString = "fill=\"$col\" font-size=\"$size\" " ;
508        mwMap::drawText ($x, $y, 0, $num, $svgString, "text")
509}
510
511# ---------------------------------------------------------------------
512
513sub processRectangles {
514        my $no = 0 ;
515
516        if ( cv('rectangles') ne "") {
517                my @rects ;
518                @rects = split /#/, cv('rectangles') ;
519                foreach my $r (@rects) {
520                        $no++ ;
521                        my @coords ;
522                        @coords = split /,/, $r ;
523
524                        my $left = $coords[0] ;
525                        my $bottom = $coords[1] ;
526                        my $right = $coords[2] ;
527                        my $top = $coords[3] ;
528
529                        my @nodes ;
530                        push @nodes, convert ($left, $bottom) ;
531                        push @nodes, convert ($right, $bottom) ;
532                        push @nodes, convert ($right, $top) ;
533                        push @nodes, convert ($left, $top) ;
534                        push @nodes, convert ($left, $bottom) ;
535       
536                        # drawWay (10, "black", 5, "none", @nodes) ;
537                        my $svgString = "fill=\"none\" stroke=\"black\" stroke-width=\"7\" " ;
538                        drawWay (\@nodes, 0, $svgString, "rectangles", undef) ;
539                        # drawRect ($left, $bottom, $right, $top, 1, $svgString, "rectangles") ;
540
541                        if ( cv('pagenumbers') ne "") {
542                                my $x = ($right + $left) / 2 ;
543                                my $y = ($bottom + $top) / 2 ;
544                                my $xp ; my $yp ;
545                                ($xp, $yp) = convert ($x, $y) ;
546                                # drawTextPixGrid ($xp, $yp, $no, $pnColor, scalePoints ( scaleBase ($pnSize) ) ) ;
547                                my $svgString = "fill=\"black\" font-size=\"60\" " ;
548                                drawText ($xp, $yp, 0, $no, $svgString, "rectangles") ;
549                        }
550
551                }
552        }
553}
554
555# --------------------------------------------------------------------
556
557sub sizePNG {
558#
559# evaluates size of png graphics
560#
561        my $fileName = shift ;
562
563        my ($x, $y) ;
564        my $file ;
565        my $result = open ($file, "<", $fileName) ;
566        if ($result) {
567                my $pic = newFromPng GD::Image($file) ;
568                ($x, $y) = $pic->getBounds ;
569                close ($file) ;
570        }
571        else {
572                ($x, $y) = (0, 0) ;
573        }
574        return ($x, $y) ;
575}
576
577sub sizeSVG {
578#
579# evaluates size of svg graphics
580#
581        my $fileName = shift ;
582        my $file ;
583        my ($x, $y) ; undef $x ; undef $y ;
584
585        my $result = open ($file, "<", $fileName) ;
586        if ($result) {
587                my $line ;
588                while ($line = <$file>) {
589                        my ($x1) = ( $line =~ /^.*width=\"([\d]+)px\"/ ) ; 
590                        my ($y1) = ( $line =~ /^.*height=\"([\d]+)px\"/ ) ;
591                        if (!defined $x1) {
592                                ($x1) = ( $line =~ /^\s*width=\"([\d]+)\"/ ) ; 
593
594                        } 
595                        if (!defined $y1) {
596                                ($y1) = ( $line =~ /^\s*height=\"([\d]+)\"/ ) ; 
597                        } 
598                        if (defined $x1) { $x = $x1 ; }
599                        if (defined $y1) { $y = $y1 ; }
600                }
601                close ($file) ;
602        }
603
604        if ( (!defined $x) or (!defined $y) ) { 
605                $x = 0 ; $y = 0 ; 
606                print "WARNING: size of file $fileName could not be determined.\n" ;
607        } 
608        return ($x, $y) ;
609}
610
611# ------------------------------------------------------------------------
612
613
614sub createDirPdf {
615        if ((cv('dir') eq "1") or (cv('poi') eq "1")) {
616                if (cv('grid') >0) {
617                        my $dirPdfName = cv('out') ;
618                        $dirPdfName =~ s/.svg/_dir.pdf/ ;
619                        my $sName = "none" ;
620                        my $pName = "none" ;
621
622                       
623
624                        if (cv('dir') eq "1") { $sName = cv('directoryname') ; }
625                        if (cv('poi') eq "1") { $pName = cv('poiname') ; }
626                        my $dirColNum = cv ('dircolnum') ;
627                        my $dirTitle = cv ('dirtitle') ;
628                        print "\ncalling perl dir.pl $sName $pName $dirTitle $dirPdfName $dirColNum\n\n" ;
629                        `perl dir.pl $sName $pName \"$dirTitle\" $dirPdfName $dirColNum > out.txt` ;
630                }
631                else {
632                        print "WARNING: directory PDF will not be created because -grid was not specified\n" ;
633                }
634               
635        }
636        else {
637                print "WARNING: directory PDF will not be created because neither -dir nor -poi was specified\n" ;
638        }
639}
640
641# -----------------------------------------------------------------------------
642
643sub getPointOfWay {
644        #
645        # returns point of way at distance/position
646        # coordinates and units are pixels
647
648        my ($ref, $position) = @_ ;
649        my @points = @$ref ;
650
651        my @double = () ;
652        while (scalar @points > 0) {
653                my $x = shift @points ;
654                my $y = shift @points ;
655                push @double, [$x, $y] ;
656        }
657
658        my $i = 0 ; my $actLen = 0 ;
659        while ($actLen < $position) {
660                $actLen += sqrt ( ($double[$i]->[0]-$double[$i+1]->[0])**2 + ($double[$i]->[1]-$double[$i+1]->[1])**2 ) ;
661                $i++ ;
662        }
663
664        my $x = int (($double[$i]->[0] +  $double[$i-1]->[0]) / 2) ;
665        my $y = int (($double[$i]->[1] +  $double[$i-1]->[1]) / 2) ;
666
667        # print "POW: $x, $y\n" ;
668
669        return ($x, $y) ;
670}
671
672# ----------------------------------------------------------------
673
674sub nodes2Coordinates {
675#
676# transform list of nodeIds to list of x/y
677# straight array in and out
678#
679        my @nodes = @_ ;
680        my $i ;
681        my @result = () ;
682
683        my ($lonRef, $latRef) = mwFile::getNodePointers() ;
684
685        foreach my $n (@nodes) {
686                my ($x, $y) = mwMap::convert ( $$lonRef{$n}, $$latRef{$n}) ;
687                push @result, $x, $y ;
688        }
689
690        return @result ;
691}
692
693
694
695
6961 ;
697
698
Note: See TracBrowser for help on using the repository browser.