source: subversion/applications/rendering/wms/class.wireframe.php @ 34399

Last change on this file since 34399 was 9330, checked in by isortega, 11 years ago

WMS now features basic osmarender support (only z17), as well as more bugs.

File size: 4.8 KB
Line 
1<?php
2
3/// @author Iván Sánchez Ortega <ivan@sanchezortega.es>
4
5/**
6    OSM WMS ("OpenStreetMap Web Map Service")
7    Copyright (C) 2008, Iván Sánchez Ortega
8
9    This program is free software: you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation, either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.
21*/   
22
23/// Wireframe class
24/// Lots of TODOs here - at some time, this will be a full-blown WMS conformant server.
25/// TODO: reproject the queried area into EPSG:4236
26/// TODO: reproject the data from OSM API into the queried coordinate system.
27/// TODO: rely the data parsing/downloading to some backend class
28/// TODO: fix for near-180 longitudes
29/// TODO: error messages
30
31
32
33class wireframe /* extends layer */
34{
35
36static public function GetCapabilities()
37{
38// return "
39//       <Layer queryable='0' opaque='0'>
40//         <Name>wireframe</Name>
41//         <Title>OSM Wireframe</Title>
42//         <EX_GeographicBoundingBox>
43//           <westBoundLongitude>-180</westBoundLongitude>
44//           <eastBoundLongitude>180</eastBoundLongitude>
45//           <southBoundLatitude>-90</southBoundLatitude>
46//           <northBoundLatitude>90</northBoundLatitude>
47//         </EX_GeographicBoundingBox>
48//         <Style>
49//           <Name>Default</Name>
50//           <Title>Default</Title>
51//         </Style>
52//       </Layer>
53// ";
54
55// Capabilities for WMS 1.1.0
56return "
57      <Layer queryable='0' opaque='0'>
58        <Name>wireframe</Name>
59        <Title>OSM Wireframe</Title>
60        <Style>
61          <Name>Default</Name>
62          <Title>Default</Title>
63        </Style>
64      </Layer>
65";
66
67
68//      <BoundingBox SRS='EPSG:4326' minx='-180' miny='-90' maxx='180' maxy='90' />
69//      <BoundingBox SRS='EPSG:32630' minx='-1050000' miny='3000000' maxx='1150000' maxy='5000000' />
70
71
72}
73
74
75static public function GetMap($bbox,$crs,$height,$width,$format)
76{
77        // Backend class should be able to return PHP arrays (nodes/ways), string, URL.
78//      list($left,$bottom,$right,$top) = explode(',',$bbox);
79       
80//      backend_api::get_parsed_data($bbox,$nodes,$ways);
81//      backend_osmxapi::get_parsed_data($bbox,$nodes,$ways);
82//      $backend = new backend_osmxapi;
83//      $backend->get_parsed_data($bbox,$nodes,$ways);
84
85        datafactory::get_parsed_data($bbox,$crs,$nodes,$ways,$relations);
86       
87        /// Convert the node's coordinates into X-Y, related to (0,0) and the final image size
88       
89        list($left,$bottom,$right,$top) = explode(',',$bbox);   // Numbers are OK if the backend hasn't thrown an error yet.
90       
91        $x_factor = $width  / ($right - $left)  ;
92        $y_factor = $height / ($top   - $bottom);
93
94        foreach($nodes as &$node)
95        {
96                // Lat
97                $node[0] = $height - ($node[0]-$bottom) * $y_factor;
98               
99                // Lon
100                $node[1] = ($node[1]-$left) * $x_factor;
101        }
102       
103//      foreach($nodes as $id=>$node)
104//      {
105//              echo "$id: {$node[0]},{$node[1]}\n";
106//      }
107//      print_r($nodes);
108       
109//      echo "x-f: $x_factor; y-f: $y_factor; bbox: $bbox\n\n";
110       
111       
112        /// Prepare GD stuff for the image
113       
114        $im = imagecreate ( $width , $height );
115       
116        if (isset($_REQUEST['BGCOLOR']))
117        {
118                sscanf ($_REQUEST['BGCOLOR'],"0x%02X%02X%02X",$red,$green,$blue);
119                $backgroundcolor = imagecolorallocate ( $im , $red,$green,$blue );
120        }
121        else
122        {
123                $backgroundcolor = imagecolorallocate ( $im , 0 , 0 , 0 );      // Black
124        }
125       
126        if ($_REQUEST['TRANSPARENT'])
127                imagecolortransparent( $im , $backgroundcolor );
128       
129        $nodecolor = imagecolorallocate ( $im , 255 , 0 , 0 );  // Red
130        $waycolor  = imagecolorallocate ( $im , 0 , 0 , 255 );  // Blue
131       
132       
133        foreach($ways as $way)
134        {
135                $first = true;
136                foreach($way['nodes'] as $node_ref)
137                {
138                        list ($y,$x) = $nodes[$node_ref];
139                        if ($first)
140                                $first = false;
141                        else
142                                imageline( $im , $oldx , $oldy , $x , $y , $waycolor );
143                        $oldx = $x; $oldy = $y;
144                }
145        }
146       
147        foreach($nodes as $node)
148        {
149                list ($y,$x,$ts) = $node;
150//              if (!empty($ts))
151                        imagerectangle( $im , $x-1 , $y-1 , $x+1 , $y+1 , $nodecolor );
152//              else
153//              {
154//                      imagerectangle( $im , $x-1 , $y-1 , $x+1 , $y+1 , $nodecolor );
155//                      imagerectangle( $im , $x-3 , $y-3 , $x+3 , $y+3 , $nodecolor );
156//              }
157        }
158       
159       
160        // imagepng($im,'output.png');
161        if ($_REQUEST['FORMAT'] == 'image/png')
162        {
163                header('Content-type: image/png');
164                imagepng($im);
165        }
166        if ($_REQUEST['FORMAT'] == 'image/jpeg')
167        {
168                header('Content-type: image/jpeg');
169                imagejpeg($im);
170        }
171        if ($_REQUEST['FORMAT'] == 'image/gif')
172        {
173                header('Content-type: image/gif');
174                imagegif($im);
175        }
176       
177}
178
179}
Note: See TracBrowser for help on using the repository browser.