source: subversion/applications/utils/import/gml2osm/gml2osm_funcs.php @ 5763

Last change on this file since 5763 was 3721, checked in by isortega, 13 years ago

Added gml2osm import utility - use it when importing data from GML format.
It's able to reuse nodes/segments, and translates a subset of the EGM data dictionary into OSM map features.

File size: 3.3 KB
Line 
1<?php
2
3/// Auxiliary functions for the gml2osm script. These manage querying and inserting data into internal data structures, like the node list and the segment list.
4/// These do *not* manage the metadata (tags) for the nodes and ways; that's the work of the main script.
5/// Also, this doesn't manage writing out the OSM XML to the output file. Again, main script's work.
6
7
8
9
10// Global vars
11$entity_id = 0;
12$node_list = array();
13$segment_list = array();
14$way_list = array();
15
16$node_coords = array();
17
18
19
20/// @param gml A SimpleXML instance of gml:Point, containing the node coordinates
21function point2node($gml)
22{
23        $gml_attrs = $gml->attributes();
24        $source_srs = $gml_atrts['srsName'];
25        $point_attrs = $gml->coordinates->attributes();
26        $cs      = $point_attrs['cs'];  // Coordinate separator
27        $decimal = $point_attrs['decimal'];     // Decimal point separator.
28        list($lon,$lat) = explode($cs,$gml->coordinates);
29       
30        // coordinate transformation
31        if ($source_srs)
32                list($lat,$lon) = cs2cs($lat,$lon,$source_srs);
33       
34       
35        global $node_list;
36        if (isset($node_list[$lat][$lon]))
37        {
38                return $node_list[$lat][$lon]; // Node already exists, return its ID.
39                // This, happening in point2node, might be problematic.
40                /// FIXME: throw a warning.
41        }
42        else
43        {
44                global $entity_id, $node_coords;
45                $entity_id--;
46                $node_coords[$entity_id] = array($lat,$lon);
47                return $node_list[$lat][$lon] = $entity_id;
48        }
49       
50}
51
52
53
54
55
56/// @param gml A SimpleXML instance of gml:lineString, containing the way coordinates
57function linestring2way($gml)
58{
59        $gml_attrs  = $gml->attributes();
60        $source_srs = $gml_atrts['srsName'];
61        $line_attrs = $gml->coordinates->attributes();
62        $cs      = $line_attrs['cs'];   // Coordinate separator
63        $decimal = $line_attrs['decimal'];      // Decimal point separator
64        $ts      = $line_attrs['ts'];   // Tuple separator
65       
66        $points = explode($ts,$gml->coordinates);
67       
68        /// TODO: refactor code: lots in common with point2node!
69        global $node_list,$segment_list,$way_list;
70        global $entity_id, $node_coords, $node_tags;
71        $mynodes = array();
72        $mysegments = array();
73        $lastnode = null;
74        foreach($points as $point)
75        {
76                list($lon,$lat) = explode($cs,$point);
77       
78                // coordinate transformation
79                if ($source_srs)
80                        list($lat,$lon) = cs2cs($lat,$lon,$source_srs);
81               
82               
83                if (isset($node_list[$lat][$lon]))
84                {
85                        $nodeid = $node_list[$lat][$lon]; // Node already exists, return its ID.
86                }
87                else
88                {
89                        $entity_id--;
90                        echo $entity_id . "            ($lat,$lon)\n";
91                        $node_coords[$entity_id] = array($lat,$lon);
92                        $nodeid = $node_list[$lat][$lon] = $entity_id;
93                        $node_tags[$nodeid] = array();  // The main script needs $node_tags to iterate over.
94                }
95                $mynodes[] = $node_list[$lat][$lon] = $nodeid;
96               
97               
98                // Build a new segment
99                if ($lastnode)
100                {
101                        if (isset($segment_list[$lastnode][$nodeid]))   // Segment already exists
102                        {
103                                $mysegments[] = $segment_list[$lastnode][$nodeid];
104                        }
105                        else if (isset($segment_list[$nodeid][$lastnode]))      // Segment exists, but in the opposite direction
106                        {
107                                $mysegments[] = $segment_list[$nodeid][$lastnode];
108                        }
109                        else
110                        {
111                                $entity_id--;
112                                echo $entity_id . "       (seg) \n";
113                                $mysegments[] = $segment_list[$lastnode][$nodeid] = $entity_id;
114                        }
115                }
116                $lastnode = $nodeid;
117               
118        }
119       
120        $entity_id--;
121        echo $entity_id . " (way) \n";
122        $way_list[$entity_id] = $mysegments;
123       
124        return $entity_id;
125       
126}
127
128
129
130
131
132
133
134
135
136
Note: See TracBrowser for help on using the repository browser.