missing check for empty polylines

This commit is contained in:
Dennis Luxen 2011-06-28 09:28:19 +00:00
parent 5b621d8fe9
commit 4639187180

View File

@ -25,57 +25,59 @@ or see http://www.gnu.org/licenses/agpl.txt.
class PolylineCompressor { class PolylineCompressor {
private: private:
inline string encodeSignedNumber(int number) const { inline string encodeSignedNumber(int number) const {
int signedNumber = number << 1; int signedNumber = number << 1;
if (number < 0) { if (number < 0) {
signedNumber = ~(signedNumber); signedNumber = ~(signedNumber);
} }
return (encodeNumber(signedNumber)); return (encodeNumber(signedNumber));
} }
inline string encodeNumber(int numberToEncode) const { inline string encodeNumber(int numberToEncode) const {
ostringstream encodeString; ostringstream encodeString;
while (numberToEncode >= 0x20) { while (numberToEncode >= 0x20) {
int nextValue = (0x20 | (numberToEncode & 0x1f)) + 63; int nextValue = (0x20 | (numberToEncode & 0x1f)) + 63;
encodeString << (static_cast<char> (nextValue)); encodeString << (static_cast<char> (nextValue));
numberToEncode >>= 5; numberToEncode >>= 5;
} }
numberToEncode += 63; numberToEncode += 63;
encodeString << (static_cast<char> (numberToEncode)); encodeString << (static_cast<char> (numberToEncode));
return encodeString.str(); return encodeString.str();
} }
public: public:
inline void printEncodedString(vector<_Coordinate>& polyline, string &output) { inline void printEncodedString(vector<_Coordinate>& polyline, string &output) {
output += "\""; output += "\"";
output += encodeSignedNumber(polyline[0].lat); if(polyline.size() > 0) {
output += encodeSignedNumber(polyline[0].lon); output += encodeSignedNumber(polyline[0].lat);
for(unsigned i = 1; i < polyline.size(); i++) { output += encodeSignedNumber(polyline[0].lon);
output += encodeSignedNumber(polyline[i].lat - polyline[i-1].lat); }
output += encodeSignedNumber(polyline[i].lon - polyline[i-1].lon); for(unsigned i = 1; i < polyline.size(); i++) {
} output += encodeSignedNumber(polyline[i].lat - polyline[i-1].lat);
output += "\""; output += encodeSignedNumber(polyline[i].lon - polyline[i-1].lon);
} }
output += "\"";
}
inline void printUnencodedString(vector<_Coordinate> & polyline, string & output) { inline void printUnencodedString(vector<_Coordinate> & polyline, string & output) {
output += "["; output += "[";
string tmp; string tmp;
for(unsigned i = 0; i < polyline.size(); i++) { for(unsigned i = 0; i < polyline.size(); i++) {
convertLatLon(polyline[i].lat, tmp); convertLatLon(polyline[i].lat, tmp);
output += "["; output += "[";
output += tmp; output += tmp;
convertLatLon(polyline[i].lon, tmp); convertLatLon(polyline[i].lon, tmp);
output += ", "; output += ", ";
output += tmp; output += tmp;
output += "]"; output += "]";
if( i < polyline.size()-1 ) { if( i < polyline.size()-1 ) {
output += ","; output += ",";
} }
} }
output += "]"; output += "]";
} }
}; };
#endif /* POLYLINECOMPRESSOR_H_ */ #endif /* POLYLINECOMPRESSOR_H_ */