source: subversion/applications/lib/libosm/osmshp.cpp @ 34693

Last change on this file since 34693 was 11683, checked in by nienhueser, 11 years ago

Start making accessors const
Encapsulate the previously public id member in the Object class
Replace some duplicated constructors with default arguments
Use initialization lists in constructors

File size: 3.6 KB
Line 
1#include "osmshp.h"
2#include <shapefil.h>
3#include "Node.h"
4#include "Components.h"
5#include "Parser.h"
6#include "Way.h"
7#include "osmshp.h"
8#include <vector>
9#include <fstream>
10
11using std::cerr;
12using std::endl;
13
14namespace OSM
15{
16
17bool makeShp(OSM::Components *comp, const char* nodes, const char* ways)
18{
19        if (makeNodeShp(comp,nodes))
20        {
21                if(makeWayShp(comp,ways))
22                {
23                        return true;
24                }
25        }
26        return false;
27}
28
29bool makeNodeShp(OSM::Components *comp, const char* shpname)
30{
31                SHPHandle shp = SHPCreate(shpname,SHPT_POINT);
32                if(shp)
33                {
34                        DBFHandle dbf = DBFCreate(shpname);
35                        if(dbf)
36                        {
37                                std::map<int,std::string> fields;
38                                std::set<std::string> nodeTags = comp->getNodeTags();
39                                for(std::set<std::string>::iterator i=nodeTags.begin();
40                                        i!=nodeTags.end(); i++)
41                                {
42                                        fields[DBFAddField(dbf,i->c_str(),FTString,255,0)] = *i;
43                                }
44
45                                double lon, lat;
46
47                                comp->rewindNodes();
48                                while(comp->hasMoreNodes())
49                                {
50                                        OSM::Node *node = comp->nextNode();
51
52                                        // We're only interested in nodes with tags
53                                        if(node && node->hasTags())
54                                        {
55                                                lon = node->getLon();
56                                                lat=node->getLat();
57                                                SHPObject *object = SHPCreateSimpleObject
58                                                        (SHPT_POINT,1,&lon,&lat,NULL);
59
60                                                int objid = SHPWriteObject(shp, -1, object);
61
62                                                SHPDestroyObject(object);
63
64                                                for(std::map<int,std::string>::iterator j=
65                                                                fields.begin(); j!=fields.end(); j++)
66                                                {
67                                                        DBFWriteStringAttribute
68                                                                (dbf,objid,j->first,
69                                                                        node->getTag(j->second).c_str());
70                                                }
71                                        }
72                                }
73
74                                DBFClose(dbf);
75                        }
76                        else
77                        {
78                                cerr << "could not open node dbf" << endl;
79                                return false;
80                        }
81                        SHPClose(shp);
82                }
83                else
84                {
85                        cerr << "could not open node shp" << endl;
86                        return false;
87                }
88
89        return true;
90}
91
92bool makeWayShp(OSM::Components *comp, const char* shpname)
93{
94                SHPHandle shp = SHPCreate(shpname,SHPT_ARC); // ARC means polyline!
95                if(shp)
96                {
97                        DBFHandle dbf = DBFCreate(shpname);
98                        if(dbf)
99                        {
100                                std::map<int,std::string> fields;
101                                std::set<std::string> wayTags = comp->getWayTags();
102                                for(std::set<std::string>::iterator i=wayTags.begin();
103                                        i!=wayTags.end(); i++)
104                                {
105                                        fields[DBFAddField(dbf,i->c_str(),FTString,255,0)] = *i;
106                                }
107
108                                comp->rewindWays();
109                                std::vector<double> wayCoords, longs, lats;
110
111                                while(comp->hasMoreWays())
112                                {
113                                        OSM::Way *way = comp->nextWay();
114                                        if(way)
115                                        {
116                                                wayCoords = comp->getWayCoords(way->id());
117                                                if(wayCoords.size())
118                                                {
119                                                        longs = getLongs(wayCoords);
120                                                        lats = getLats(wayCoords);
121
122                                                        SHPObject *object = SHPCreateSimpleObject
123                                                                (SHPT_ARC,wayCoords.size()/2,
124                                                                        &(longs[0]),&(lats[0]),NULL);
125
126                                                        int objid = SHPWriteObject(shp, -1, object);
127
128                                                        SHPDestroyObject(object);
129
130                                                        for(std::map<int,std::string>::iterator j=
131                                                                fields.begin(); j!=fields.end(); j++)
132                                                        {
133                                                                DBFWriteStringAttribute
134                                                                (dbf,objid,j->first,
135                                                                        way->getTag(j->second).c_str());
136                                                        }
137                                                }
138                                        }
139                                }
140
141                                DBFClose(dbf);
142                        }
143                        else
144                        {
145                                cerr << "could not open way dbf" << endl;
146                                return false;
147                        }
148                        SHPClose(shp);
149                }
150                else
151                {
152                        cerr << "could not open way shp" << endl;
153                        return false;
154                }
155
156        return true;
157}
158
159std::vector<double> getLongs(const std::vector<double>& wayCoords)
160{
161        std::vector<double> longs;
162        for(unsigned int count=0; count<wayCoords.size(); count+=2)
163        {
164                longs.push_back(wayCoords[count]);
165        }
166        return longs;
167}
168
169std::vector<double> getLats(const std::vector<double>& wayCoords)
170{
171        std::vector<double> lats;
172        for(unsigned int count=1; count<wayCoords.size(); count+=2)
173        {
174                lats.push_back(wayCoords[count]);
175        }
176        return lats;
177}
178
179}
Note: See TracBrowser for help on using the repository browser.