source: subversion/sites/other/freemap-npe/freemap.php @ 31161

Last change on this file since 31161 was 1540, checked in by nick, 14 years ago

Freemap-NPE: initial version

File size: 8.4 KB
Line 
1<?php
2################################################################################
3# This file forms part of the Freemap source code.                             #
4# (c) 2004-06 Nick Whitelegg (Hogweed Software)                                #
5# Licenced under the Lesser GNU General Public Licence; see COPYING            #
6# for details.                                                                 #
7################################################################################
8
9// WMS compliant (ish) Freemap renderer
10// 010906 This now deals with all of Landsat, SRTM, OSM polygons (areas) and
11// regular OSM ways. This allows us to layer it all in the correct order, e.g.
12// areas first, then SRTM, then OSM data. Areas could be moved into a separate
13// script, and then everything composited with OpenLayers, but the problem
14// with that is that it would be inefficient (we would have to grab data from
15// the database twice from two scripts, rather than just once from one script)
16
17require_once('osmxml.php');
18require_once('latlong.php');
19require_once('defines.php');
20require_once('rules.php');
21require_once('Map.php');
22require_once('functions.php');
23require_once('Painter.php');
24
25
26// 070406 changed ['name'] to ['tags']['name'] for nodes, segments and ways
27// 070406 changed ['type'] to ['tags']['class'] for nodes
28
29///////////////////// CLASS DEFINITIONS /////////////////////////
30
31
32class Image
33{
34        var $im, 
35                $map, 
36                $backcol; 
37
38        var $debug;
39
40        var $mapdata;
41        var $datasrc, $location;
42        var $npe, $osm;
43
44        function Image ($w, $s, $e, $n, $width, $height, $stylexml, $layers,
45                                        $dsrc="db", $loc="http://www.openstreetmap.org/api/0.3/map",                                     $dbg=0)
46        {
47                $this->map = new Map ($w,$s,$e,$n, $width, $height);
48                $this->painter = new GDPainter();
49
50                $this->datasrc = $dsrc;
51                $this->location = $loc;
52                $this->npe = in_array('npe',$layers);
53                $this->osm = in_array('osm',$layers);
54
55                # 14/11/04 changed ImageCreate() to ImageCreateTrueColor();
56                # in GD2, when copying images (as we do for the icons), both source
57                # and destination image must be either paletted or true colour.
58                # (The icons are s)
59                $this->backcol = 
60                        $this->painter->createImage($this->map->width*
61                                (2*$this->extensionFactor()+1),
62                                                                        $this->map->height*
63                                (2*$this->extensionFactor()+1), 220, 220, 220);
64
65                $bottomleft_ll = gr_to_wgs84_ll(array("e"=>$w, "n"=>$s));
66                $topright_ll = gr_to_wgs84_ll(array("e"=>$e, "n"=>$n));
67
68                if($this->osm)
69                {
70                        $this->mapdata=grabOSM($bottomleft_ll['long'],
71                                                           $bottomleft_ll['lat'],
72                                                           $topright_ll['long'],
73                                                           $topright_ll['lat'],
74                                                           $this->datasrc, null, $this->location);
75                }
76
77                $this->styleRules = readStyleRules($stylexml);
78
79                $this->is_valid = true;
80                $this->debug = $dbg;
81        }
82
83        function draw()
84        {
85       
86                if($this->npe)
87                {
88                        $this->grabNpeMap($this->map->bottomleft['e'],
89                                                        $this->map->bottomleft['n']);
90                }
91
92                if($this->osm)
93                        $this->draw_ways();
94
95                $this->painter->crop(
96                                $this->map->width*$this->extensionFactor(),
97                                $this->map->height*$this->extensionFactor(),
98                                $this->map->width,
99                                $this->map->height
100                                                        );
101
102                $this->painter->renderImage();
103        }
104       
105        function draw_ways()
106        {
107                # Only attempt to draw the line if at least one of the points
108                # is within the map
109                $ids = array_keys($this->mapdata["ways"]);
110                foreach ($ids as $id)
111                {
112                        $curStyle = getStyle($this->styleRules,
113                                                        $this->mapdata["ways"][$id]["tags"]);
114                        // Not areas
115                        if($curStyle && $curStyle["render"]!="area")
116                        {
117                                $width = $curStyle["width"];
118
119                                foreach($this->mapdata["ways"][$id]["segs"] as $segid)
120                                {
121                                        if(isset($this->mapdata["segments"][$segid]))
122                                        {
123                                                // specify the segment's parent way
124                                                $this->mapdata["segments"][$segid]["way"] = $id;
125                                                $seg = $this->mapdata["segments"][$segid];
126
127                                                // TODO: LL_TO_GR
128                                                $from_gr = wgs84_ll_to_gr
129                                                        ($this->mapdata["nodes"][$seg['from']]);
130                                                $to_gr = wgs84_ll_to_gr
131                                                        ($this->mapdata["nodes"][$seg['to']]);
132                                                $p[0] = $this->map->get_point ($from_gr);
133                                                $p[1] = $this->map->get_point ($to_gr);
134                                               
135
136                                                if ( (isset($this->mapdata["nodes"] [$seg['to']]) 
137                                                        && isset($this->mapdata["nodes"] [$seg['from']]) ) 
138                                                        && $width>0     
139                                                        )
140
141                                                {
142                                                        $rgb=explode(",", $curStyle["colour"]);
143
144                                                        if(count($rgb)==3)
145                                                        {
146                                                                $colour = $this->painter->getColour
147                                                                ($rgb[0],$rgb[1],$rgb[2]);
148
149                                                                // 07/06/05 Changed this to reflect the new way
150                                                                // that dashed lines are stored in the database.
151                                                                if(isset ($curStyle["dash"]))
152                                                                {
153                                                                        $this->painter->drawDashedLine 
154                                                                        ($this->cnvX($p[0]['x']),
155                                                                         $this->cnvY($p[0]['y']),
156                                                                         $this->cnvX($p[1]['x']),
157                                                                         $this->cnvY($p[1]['y']),
158                                                                     $curStyle["dash"], 
159                                                                         $colour,
160                                                                         $width);
161                                                                }
162
163                                                                else
164                                                                {
165                                                                        //090406 outlines now done in their own
166                                                                        // function
167                                                                        $this->painter->drawLine       
168                                                                        ($this->cnvX($p[0]['x']),
169                                                                         $this->cnvY($p[0]['y']),
170                                                                         $this->cnvX($p[1]['x']),
171                                                                         $this->cnvY($p[1]['y']),
172                                                                         $colour,
173                                                                         $width);
174                                                                }
175                                                        }
176                                                }
177                                        }
178                                }
179                        }
180                }       
181        }
182
183        function cnvX($x)
184        {
185                return $x+$this->map->width*$this->extensionFactor();
186        }
187
188        function cnvY($y)
189        {
190                return $y+$this->map->height*$this->extensionFactor();
191        }
192
193        function extensionFactor()
194        {
195                return 0.5; 
196        }       
197
198        function grabNpeMap($easting, $northing)
199        {
200                if($this->map->npeSuitable())
201                {
202                        $e1 = floor($easting/1000);
203                        $n1 = floor($northing/1000);
204                        $z = $this->map->get_top_right();
205                        $e2 = floor($z["e"]/1000);
206                        $n2 = floor($z["n"]/1000);
207                        $efactor = 125 * ($this->map->escale/0.125);
208                        $nfactor = 125 * ($this->map->nscale/0.125);
209
210                        $dstx = -($this->map->escale*($easting%1000));
211                       
212                        for($ecount=$e1; $ecount<=$e2; $ecount++)
213                        {
214                                /*
215                                if($ecount==$e1)
216                                {
217                                        $srcx = (0.125*($easting%1000));
218                                        $srcw = 125-$srcx;
219                                        $dstw = 125-$srcx;
220                                }
221                                elseif($ecount==$e2)
222                                {
223                                        $srcx = 0;
224                                        $srcw = 0.125*($z["e"]%1000);
225                                        $dstw = 0.125*($z["e"]%1000);
226                                }
227                                else
228                                {
229                                        $srcx = 0;
230                                        $srcw = 125;
231                                        $dstw = 125;
232                                }
233                                */
234
235
236                                        $dsty = -($nfactor - $this->map->nscale*($z["n"]%1000));
237                                for($ncount=$n2; $ncount>=$n1; $ncount--)
238                                {
239                                        /*
240                                        if($ncount==$n1)
241                                        {
242                                                $srcy = 0;
243                                                $srch = 125- (0.125*($northing%1000));
244                                                $dsth = 125-(0.125*($northing%1000));
245                                        }
246                                        elseif($ncount==$n2)
247                                        {
248                                                $srcy = 125-(0.125*($z["n"]%1000));
249                                                $srch = 125-$srcy;
250                                                $dsth = 125-$srcy;
251                                        }
252                                        else
253                                        {
254                                                $srcy = 0;
255                                                $srch = 125;
256                                                $dsth = 125;
257                                        }
258                                        */
259                                        $srcw=125;
260                                        $srch=125;
261                                        if($srcw>0 && $srch>0)
262                                        {
263                                        //$url="http://ustile.npemap.org.uk/scaled1/".
264                                        $url="/home/dsheldon/npetiles/scaled1/".
265                                                        "$ecount/$ncount.jpg";
266
267                                        $img = ImageCreateFromJPEG ($url);
268
269                                        //echo "$ecount $ncount $dstx $dsty<br/>";
270                                        /*
271                                        ImageCopyResized($this->painter->im,$img,
272                                        $this->cnvX($dstx),$this->cnvY($dsty),$srcx,$srcy,
273                                                $dstw,$dsth, $srcw,$srch);
274                                                */
275                                        ImageCopyResized($this->painter->im,$img,
276                                        $this->cnvX($dstx),$this->cnvY($dsty),0,0,
277                                                $efactor,$nfactor,125,125);
278                                        }
279
280                                        //$dsty += ($ncount==$n1) ? $dsth : 125;
281                                        $dsty +=  $nfactor;
282                                }
283
284                                //$dstx += ($ecount==$e1) ? $dstw : 125;
285                                $dstx+=$efactor;
286                        }
287                }
288        }
289}
290
291function zIndexCmp($a,$b)
292{
293        return ($a["style"]["z-index"] > $b["style"]["z-index"]) ? 1:-1;
294}
295
296////////////////// SCRIPT BEGINS HERE /////////////////////
297
298$defaults = array("width" => 400, 
299                        "height" => 400,
300                        "debug" => 0,
301                        "datasrc" => "db", 
302                        "location" => "http://www.openstreetmap.org/api/0.3/map",
303                        "layers" => "npe,osm",
304                        "bbox" => "487000,126000,491000,130000" );
305
306$inp=array();
307
308foreach ($defaults as $field=>$default)
309{
310        if(valid_input($field,$_GET[$field]))
311                $inp[$field] = $_GET[$field];
312        elseif(valid_input($field,$_GET[strtoupper($field)]))
313                $inp[$field] = $_GET[strtoupper($field)];
314        else
315                $inp[$field] = $default;
316}
317
318$bbox = explode(",",$inp['bbox']);
319$stylexml = "freemap.xml";
320
321
322$image = new Image($bbox[0], $bbox[1], $bbox[2], $bbox[3],
323                                                $inp["width"],$inp["height"],$stylexml,
324                                                explode(",",$inp['layers']),
325                                                $inp["datasrc"], $inp["location"],$inp["debug"]);
326
327if(isset($error))
328{
329        echo "<html><head><title>Error!</title></head><body>$error</body></html>";
330}
331else
332{
333        if (!isset($_GET['debug']))
334                header('Content-type: image/png'); 
335       
336        $image->draw();
337}
338
339function valid_input($field,$value)
340{
341        if($field=="width" || $field=="height")
342        {
343                return wholly_numeric($value);
344        }
345        return $value;
346}
347?>
Note: See TracBrowser for help on using the repository browser.