This page hosts a formal specification of Shapefile main file using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
All parsing code for C++98/STL generated by Kaitai Struct depends on the C++/STL runtime library. You have to install it before you can parse data.
For C++, the easiest way is to clone the runtime library sources and build them along with your project.
Using Kaitai Struct in C++/STL usually consists of 3 steps.
std::istream
). One can open local file for that, or use existing std::string
or char*
buffer.
#include <fstream>
std::ifstream is("path/to/local/file.shp", std::ifstream::binary);
#include <sstream>
std::istringstream is(str);
#include <sstream>
const char buf[] = { ... };
std::string str(buf, sizeof buf);
std::istringstream is(str);
#include "kaitai/kaitaistream.h"
kaitai::kstream ks(&is);
shapefile_main_t data(&ks);
After that, one can get various attributes from the structure by invoking getter methods like:
data.records() // => the size of this section of the file in bytes must equal (header.file_length * 2) - 100
#ifndef SHAPEFILE_MAIN_H_
#define SHAPEFILE_MAIN_H_
// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
#include "kaitai/kaitaistruct.h"
#include <stdint.h>
#include <vector>
#if KAITAI_STRUCT_VERSION < 9000L
#error "Incompatible Kaitai Struct C++/STL API: version 0.9 or later is required"
#endif
class shapefile_main_t : public kaitai::kstruct {
public:
class multi_point_m_t;
class bounding_box_x_y_z_m_t;
class point_t;
class polygon_t;
class bounds_min_max_t;
class poly_line_t;
class multi_point_z_t;
class poly_line_z_t;
class polygon_z_t;
class bounding_box_x_y_t;
class point_m_t;
class polygon_m_t;
class record_header_t;
class multi_point_t;
class file_header_t;
class point_z_t;
class record_t;
class record_contents_t;
class multi_patch_t;
class poly_line_m_t;
enum shape_type_t {
SHAPE_TYPE_NULL_SHAPE = 0,
SHAPE_TYPE_POINT = 1,
SHAPE_TYPE_POLY_LINE = 3,
SHAPE_TYPE_POLYGON = 5,
SHAPE_TYPE_MULTI_POINT = 8,
SHAPE_TYPE_POINT_Z = 11,
SHAPE_TYPE_POLY_LINE_Z = 13,
SHAPE_TYPE_POLYGON_Z = 15,
SHAPE_TYPE_MULTI_POINT_Z = 18,
SHAPE_TYPE_POINT_M = 21,
SHAPE_TYPE_POLY_LINE_M = 23,
SHAPE_TYPE_POLYGON_M = 25,
SHAPE_TYPE_MULTI_POINT_M = 28,
SHAPE_TYPE_MULTI_PATCH = 31
};
enum part_type_t {
PART_TYPE_TRIANGLE_STRIP = 0,
PART_TYPE_TRIANGLE_FAN = 1,
PART_TYPE_OUTER_RING = 2,
PART_TYPE_INNER_RING = 3,
PART_TYPE_FIRST_RING = 4,
PART_TYPE_RING = 5
};
shapefile_main_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~shapefile_main_t();
class multi_point_m_t : public kaitai::kstruct {
public:
multi_point_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~multi_point_m_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_points;
std::vector<point_t*>* m_points;
bounds_min_max_t* m_m_range;
std::vector<double>* m_m_values;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<point_t*>* points() const { return m_points; }
bounds_min_max_t* m_range() const { return m_m_range; }
std::vector<double>* m_values() const { return m_m_values; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class bounding_box_x_y_z_m_t : public kaitai::kstruct {
public:
bounding_box_x_y_z_m_t(kaitai::kstream* p__io, shapefile_main_t::file_header_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~bounding_box_x_y_z_m_t();
private:
bounds_min_max_t* m_x;
bounds_min_max_t* m_y;
bounds_min_max_t* m_z;
bounds_min_max_t* m_m;
shapefile_main_t* m__root;
shapefile_main_t::file_header_t* m__parent;
public:
bounds_min_max_t* x() const { return m_x; }
bounds_min_max_t* y() const { return m_y; }
bounds_min_max_t* z() const { return m_z; }
bounds_min_max_t* m() const { return m_m; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::file_header_t* _parent() const { return m__parent; }
};
class point_t : public kaitai::kstruct {
public:
point_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~point_t();
private:
double m_x;
double m_y;
shapefile_main_t* m__root;
kaitai::kstruct* m__parent;
public:
double x() const { return m_x; }
double y() const { return m_y; }
shapefile_main_t* _root() const { return m__root; }
kaitai::kstruct* _parent() const { return m__parent; }
};
class polygon_t : public kaitai::kstruct {
public:
polygon_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~polygon_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_parts;
int32_t m_number_of_points;
std::vector<int32_t>* m_parts;
std::vector<point_t*>* m_points;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_parts() const { return m_number_of_parts; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<int32_t>* parts() const { return m_parts; }
std::vector<point_t*>* points() const { return m_points; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class bounds_min_max_t : public kaitai::kstruct {
public:
bounds_min_max_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~bounds_min_max_t();
private:
double m_min;
double m_max;
shapefile_main_t* m__root;
kaitai::kstruct* m__parent;
public:
double min() const { return m_min; }
double max() const { return m_max; }
shapefile_main_t* _root() const { return m__root; }
kaitai::kstruct* _parent() const { return m__parent; }
};
class poly_line_t : public kaitai::kstruct {
public:
poly_line_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~poly_line_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_parts;
int32_t m_number_of_points;
std::vector<int32_t>* m_parts;
std::vector<point_t*>* m_points;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_parts() const { return m_number_of_parts; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<int32_t>* parts() const { return m_parts; }
std::vector<point_t*>* points() const { return m_points; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class multi_point_z_t : public kaitai::kstruct {
public:
multi_point_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~multi_point_z_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_points;
std::vector<point_t*>* m_points;
bounds_min_max_t* m_z_range;
std::vector<double>* m_z_values;
bounds_min_max_t* m_m_range;
std::vector<double>* m_m_values;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<point_t*>* points() const { return m_points; }
bounds_min_max_t* z_range() const { return m_z_range; }
std::vector<double>* z_values() const { return m_z_values; }
bounds_min_max_t* m_range() const { return m_m_range; }
std::vector<double>* m_values() const { return m_m_values; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class poly_line_z_t : public kaitai::kstruct {
public:
poly_line_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~poly_line_z_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_parts;
int32_t m_number_of_points;
std::vector<int32_t>* m_parts;
std::vector<point_t*>* m_points;
bounds_min_max_t* m_z_range;
std::vector<double>* m_z_values;
bounds_min_max_t* m_m_range;
std::vector<double>* m_m_values;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_parts() const { return m_number_of_parts; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<int32_t>* parts() const { return m_parts; }
std::vector<point_t*>* points() const { return m_points; }
bounds_min_max_t* z_range() const { return m_z_range; }
std::vector<double>* z_values() const { return m_z_values; }
bounds_min_max_t* m_range() const { return m_m_range; }
std::vector<double>* m_values() const { return m_m_values; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class polygon_z_t : public kaitai::kstruct {
public:
polygon_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~polygon_z_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_parts;
int32_t m_number_of_points;
std::vector<int32_t>* m_parts;
std::vector<point_t*>* m_points;
bounds_min_max_t* m_z_range;
std::vector<double>* m_z_values;
bounds_min_max_t* m_m_range;
std::vector<double>* m_m_values;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_parts() const { return m_number_of_parts; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<int32_t>* parts() const { return m_parts; }
std::vector<point_t*>* points() const { return m_points; }
bounds_min_max_t* z_range() const { return m_z_range; }
std::vector<double>* z_values() const { return m_z_values; }
bounds_min_max_t* m_range() const { return m_m_range; }
std::vector<double>* m_values() const { return m_m_values; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class bounding_box_x_y_t : public kaitai::kstruct {
public:
bounding_box_x_y_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~bounding_box_x_y_t();
private:
bounds_min_max_t* m_x;
bounds_min_max_t* m_y;
shapefile_main_t* m__root;
kaitai::kstruct* m__parent;
public:
bounds_min_max_t* x() const { return m_x; }
bounds_min_max_t* y() const { return m_y; }
shapefile_main_t* _root() const { return m__root; }
kaitai::kstruct* _parent() const { return m__parent; }
};
class point_m_t : public kaitai::kstruct {
public:
point_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~point_m_t();
private:
double m_x;
double m_y;
double m_m;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
double x() const { return m_x; }
double y() const { return m_y; }
double m() const { return m_m; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class polygon_m_t : public kaitai::kstruct {
public:
polygon_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~polygon_m_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_parts;
int32_t m_number_of_points;
std::vector<int32_t>* m_parts;
std::vector<point_t*>* m_points;
bounds_min_max_t* m_m_range;
std::vector<double>* m_m_values;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_parts() const { return m_number_of_parts; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<int32_t>* parts() const { return m_parts; }
std::vector<point_t*>* points() const { return m_points; }
bounds_min_max_t* m_range() const { return m_m_range; }
std::vector<double>* m_values() const { return m_m_values; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class record_header_t : public kaitai::kstruct {
public:
record_header_t(kaitai::kstream* p__io, shapefile_main_t::record_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~record_header_t();
private:
int32_t m_record_number;
int32_t m_content_length;
shapefile_main_t* m__root;
shapefile_main_t::record_t* m__parent;
public:
int32_t record_number() const { return m_record_number; }
int32_t content_length() const { return m_content_length; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_t* _parent() const { return m__parent; }
};
class multi_point_t : public kaitai::kstruct {
public:
multi_point_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~multi_point_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_points;
std::vector<point_t*>* m_points;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<point_t*>* points() const { return m_points; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class file_header_t : public kaitai::kstruct {
public:
file_header_t(kaitai::kstream* p__io, shapefile_main_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~file_header_t();
private:
std::string m_file_code;
std::string m_unused_field_1;
std::string m_unused_field_2;
std::string m_unused_field_3;
std::string m_unused_field_4;
std::string m_unused_field_5;
int32_t m_file_length;
std::string m_version;
shape_type_t m_shape_type;
bounding_box_x_y_z_m_t* m_bounding_box;
shapefile_main_t* m__root;
shapefile_main_t* m__parent;
public:
/**
* corresponds to s4be value of 9994
*/
std::string file_code() const { return m_file_code; }
std::string unused_field_1() const { return m_unused_field_1; }
std::string unused_field_2() const { return m_unused_field_2; }
std::string unused_field_3() const { return m_unused_field_3; }
std::string unused_field_4() const { return m_unused_field_4; }
std::string unused_field_5() const { return m_unused_field_5; }
int32_t file_length() const { return m_file_length; }
/**
* corresponds to s4le value of 1000
*/
std::string version() const { return m_version; }
shape_type_t shape_type() const { return m_shape_type; }
bounding_box_x_y_z_m_t* bounding_box() const { return m_bounding_box; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t* _parent() const { return m__parent; }
};
class point_z_t : public kaitai::kstruct {
public:
point_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~point_z_t();
private:
double m_x;
double m_y;
double m_z;
double m_m;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
double x() const { return m_x; }
double y() const { return m_y; }
double z() const { return m_z; }
double m() const { return m_m; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class record_t : public kaitai::kstruct {
public:
record_t(kaitai::kstream* p__io, shapefile_main_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~record_t();
private:
record_header_t* m_header;
record_contents_t* m_contents;
shapefile_main_t* m__root;
shapefile_main_t* m__parent;
public:
record_header_t* header() const { return m_header; }
/**
* the size of this contents section in bytes must equal header.content_length * 2
*/
record_contents_t* contents() const { return m_contents; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t* _parent() const { return m__parent; }
};
class record_contents_t : public kaitai::kstruct {
public:
record_contents_t(kaitai::kstream* p__io, shapefile_main_t::record_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~record_contents_t();
private:
shape_type_t m_shape_type;
kaitai::kstruct* m_shape_parameters;
bool n_shape_parameters;
public:
bool _is_null_shape_parameters() { shape_parameters(); return n_shape_parameters; };
private:
shapefile_main_t* m__root;
shapefile_main_t::record_t* m__parent;
public:
shape_type_t shape_type() const { return m_shape_type; }
kaitai::kstruct* shape_parameters() const { return m_shape_parameters; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_t* _parent() const { return m__parent; }
};
class multi_patch_t : public kaitai::kstruct {
public:
multi_patch_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~multi_patch_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_parts;
int32_t m_number_of_points;
std::vector<int32_t>* m_parts;
std::vector<part_type_t>* m_part_types;
std::vector<point_t*>* m_points;
bounds_min_max_t* m_z_range;
std::vector<double>* m_z_values;
bounds_min_max_t* m_m_range;
std::vector<double>* m_m_values;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_parts() const { return m_number_of_parts; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<int32_t>* parts() const { return m_parts; }
std::vector<part_type_t>* part_types() const { return m_part_types; }
std::vector<point_t*>* points() const { return m_points; }
bounds_min_max_t* z_range() const { return m_z_range; }
std::vector<double>* z_values() const { return m_z_values; }
bounds_min_max_t* m_range() const { return m_m_range; }
std::vector<double>* m_values() const { return m_m_values; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
class poly_line_m_t : public kaitai::kstruct {
public:
poly_line_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent = 0, shapefile_main_t* p__root = 0);
private:
void _read();
void _clean_up();
public:
~poly_line_m_t();
private:
bounding_box_x_y_t* m_bounding_box;
int32_t m_number_of_parts;
int32_t m_number_of_points;
std::vector<int32_t>* m_parts;
std::vector<point_t*>* m_points;
bounds_min_max_t* m_m_range;
std::vector<double>* m_m_values;
shapefile_main_t* m__root;
shapefile_main_t::record_contents_t* m__parent;
public:
bounding_box_x_y_t* bounding_box() const { return m_bounding_box; }
int32_t number_of_parts() const { return m_number_of_parts; }
int32_t number_of_points() const { return m_number_of_points; }
std::vector<int32_t>* parts() const { return m_parts; }
std::vector<point_t*>* points() const { return m_points; }
bounds_min_max_t* m_range() const { return m_m_range; }
std::vector<double>* m_values() const { return m_m_values; }
shapefile_main_t* _root() const { return m__root; }
shapefile_main_t::record_contents_t* _parent() const { return m__parent; }
};
private:
file_header_t* m_header;
std::vector<record_t*>* m_records;
shapefile_main_t* m__root;
kaitai::kstruct* m__parent;
public:
file_header_t* header() const { return m_header; }
/**
* the size of this section of the file in bytes must equal (header.file_length * 2) - 100
*/
std::vector<record_t*>* records() const { return m_records; }
shapefile_main_t* _root() const { return m__root; }
kaitai::kstruct* _parent() const { return m__parent; }
};
#endif // SHAPEFILE_MAIN_H_
// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
#include "shapefile_main.h"
#include "kaitai/exceptions.h"
shapefile_main_t::shapefile_main_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = this;
m_header = 0;
m_records = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::_read() {
m_header = new file_header_t(m__io, this, m__root);
m_records = new std::vector<record_t*>();
{
int i = 0;
while (!m__io->is_eof()) {
m_records->push_back(new record_t(m__io, this, m__root));
i++;
}
}
}
shapefile_main_t::~shapefile_main_t() {
_clean_up();
}
void shapefile_main_t::_clean_up() {
if (m_header) {
delete m_header; m_header = 0;
}
if (m_records) {
for (std::vector<record_t*>::iterator it = m_records->begin(); it != m_records->end(); ++it) {
delete *it;
}
delete m_records; m_records = 0;
}
}
shapefile_main_t::multi_point_m_t::multi_point_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_points = 0;
m_m_range = 0;
m_m_values = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::multi_point_m_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_points = m__io->read_s4le();
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
m_m_range = new bounds_min_max_t(m__io, this, m__root);
m_m_values = new std::vector<double>();
const int l_m_values = number_of_points();
for (int i = 0; i < l_m_values; i++) {
m_m_values->push_back(m__io->read_f8le());
}
}
shapefile_main_t::multi_point_m_t::~multi_point_m_t() {
_clean_up();
}
void shapefile_main_t::multi_point_m_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
if (m_m_range) {
delete m_m_range; m_m_range = 0;
}
if (m_m_values) {
delete m_m_values; m_m_values = 0;
}
}
shapefile_main_t::bounding_box_x_y_z_m_t::bounding_box_x_y_z_m_t(kaitai::kstream* p__io, shapefile_main_t::file_header_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_x = 0;
m_y = 0;
m_z = 0;
m_m = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::bounding_box_x_y_z_m_t::_read() {
m_x = new bounds_min_max_t(m__io, this, m__root);
m_y = new bounds_min_max_t(m__io, this, m__root);
m_z = new bounds_min_max_t(m__io, this, m__root);
m_m = new bounds_min_max_t(m__io, this, m__root);
}
shapefile_main_t::bounding_box_x_y_z_m_t::~bounding_box_x_y_z_m_t() {
_clean_up();
}
void shapefile_main_t::bounding_box_x_y_z_m_t::_clean_up() {
if (m_x) {
delete m_x; m_x = 0;
}
if (m_y) {
delete m_y; m_y = 0;
}
if (m_z) {
delete m_z; m_z = 0;
}
if (m_m) {
delete m_m; m_m = 0;
}
}
shapefile_main_t::point_t::point_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::point_t::_read() {
m_x = m__io->read_f8le();
m_y = m__io->read_f8le();
}
shapefile_main_t::point_t::~point_t() {
_clean_up();
}
void shapefile_main_t::point_t::_clean_up() {
}
shapefile_main_t::polygon_t::polygon_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_parts = 0;
m_points = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::polygon_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_parts = m__io->read_s4le();
m_number_of_points = m__io->read_s4le();
m_parts = new std::vector<int32_t>();
const int l_parts = number_of_parts();
for (int i = 0; i < l_parts; i++) {
m_parts->push_back(m__io->read_s4le());
}
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
}
shapefile_main_t::polygon_t::~polygon_t() {
_clean_up();
}
void shapefile_main_t::polygon_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_parts) {
delete m_parts; m_parts = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
}
shapefile_main_t::bounds_min_max_t::bounds_min_max_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::bounds_min_max_t::_read() {
m_min = m__io->read_f8le();
m_max = m__io->read_f8le();
}
shapefile_main_t::bounds_min_max_t::~bounds_min_max_t() {
_clean_up();
}
void shapefile_main_t::bounds_min_max_t::_clean_up() {
}
shapefile_main_t::poly_line_t::poly_line_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_parts = 0;
m_points = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::poly_line_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_parts = m__io->read_s4le();
m_number_of_points = m__io->read_s4le();
m_parts = new std::vector<int32_t>();
const int l_parts = number_of_parts();
for (int i = 0; i < l_parts; i++) {
m_parts->push_back(m__io->read_s4le());
}
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
}
shapefile_main_t::poly_line_t::~poly_line_t() {
_clean_up();
}
void shapefile_main_t::poly_line_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_parts) {
delete m_parts; m_parts = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
}
shapefile_main_t::multi_point_z_t::multi_point_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_points = 0;
m_z_range = 0;
m_z_values = 0;
m_m_range = 0;
m_m_values = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::multi_point_z_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_points = m__io->read_s4le();
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
m_z_range = new bounds_min_max_t(m__io, this, m__root);
m_z_values = new std::vector<double>();
const int l_z_values = number_of_points();
for (int i = 0; i < l_z_values; i++) {
m_z_values->push_back(m__io->read_f8le());
}
m_m_range = new bounds_min_max_t(m__io, this, m__root);
m_m_values = new std::vector<double>();
const int l_m_values = number_of_points();
for (int i = 0; i < l_m_values; i++) {
m_m_values->push_back(m__io->read_f8le());
}
}
shapefile_main_t::multi_point_z_t::~multi_point_z_t() {
_clean_up();
}
void shapefile_main_t::multi_point_z_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
if (m_z_range) {
delete m_z_range; m_z_range = 0;
}
if (m_z_values) {
delete m_z_values; m_z_values = 0;
}
if (m_m_range) {
delete m_m_range; m_m_range = 0;
}
if (m_m_values) {
delete m_m_values; m_m_values = 0;
}
}
shapefile_main_t::poly_line_z_t::poly_line_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_parts = 0;
m_points = 0;
m_z_range = 0;
m_z_values = 0;
m_m_range = 0;
m_m_values = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::poly_line_z_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_parts = m__io->read_s4le();
m_number_of_points = m__io->read_s4le();
m_parts = new std::vector<int32_t>();
const int l_parts = number_of_parts();
for (int i = 0; i < l_parts; i++) {
m_parts->push_back(m__io->read_s4le());
}
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
m_z_range = new bounds_min_max_t(m__io, this, m__root);
m_z_values = new std::vector<double>();
const int l_z_values = number_of_points();
for (int i = 0; i < l_z_values; i++) {
m_z_values->push_back(m__io->read_f8le());
}
m_m_range = new bounds_min_max_t(m__io, this, m__root);
m_m_values = new std::vector<double>();
const int l_m_values = number_of_points();
for (int i = 0; i < l_m_values; i++) {
m_m_values->push_back(m__io->read_f8le());
}
}
shapefile_main_t::poly_line_z_t::~poly_line_z_t() {
_clean_up();
}
void shapefile_main_t::poly_line_z_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_parts) {
delete m_parts; m_parts = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
if (m_z_range) {
delete m_z_range; m_z_range = 0;
}
if (m_z_values) {
delete m_z_values; m_z_values = 0;
}
if (m_m_range) {
delete m_m_range; m_m_range = 0;
}
if (m_m_values) {
delete m_m_values; m_m_values = 0;
}
}
shapefile_main_t::polygon_z_t::polygon_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_parts = 0;
m_points = 0;
m_z_range = 0;
m_z_values = 0;
m_m_range = 0;
m_m_values = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::polygon_z_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_parts = m__io->read_s4le();
m_number_of_points = m__io->read_s4le();
m_parts = new std::vector<int32_t>();
const int l_parts = number_of_parts();
for (int i = 0; i < l_parts; i++) {
m_parts->push_back(m__io->read_s4le());
}
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
m_z_range = new bounds_min_max_t(m__io, this, m__root);
m_z_values = new std::vector<double>();
const int l_z_values = number_of_points();
for (int i = 0; i < l_z_values; i++) {
m_z_values->push_back(m__io->read_f8le());
}
m_m_range = new bounds_min_max_t(m__io, this, m__root);
m_m_values = new std::vector<double>();
const int l_m_values = number_of_points();
for (int i = 0; i < l_m_values; i++) {
m_m_values->push_back(m__io->read_f8le());
}
}
shapefile_main_t::polygon_z_t::~polygon_z_t() {
_clean_up();
}
void shapefile_main_t::polygon_z_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_parts) {
delete m_parts; m_parts = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
if (m_z_range) {
delete m_z_range; m_z_range = 0;
}
if (m_z_values) {
delete m_z_values; m_z_values = 0;
}
if (m_m_range) {
delete m_m_range; m_m_range = 0;
}
if (m_m_values) {
delete m_m_values; m_m_values = 0;
}
}
shapefile_main_t::bounding_box_x_y_t::bounding_box_x_y_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_x = 0;
m_y = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::bounding_box_x_y_t::_read() {
m_x = new bounds_min_max_t(m__io, this, m__root);
m_y = new bounds_min_max_t(m__io, this, m__root);
}
shapefile_main_t::bounding_box_x_y_t::~bounding_box_x_y_t() {
_clean_up();
}
void shapefile_main_t::bounding_box_x_y_t::_clean_up() {
if (m_x) {
delete m_x; m_x = 0;
}
if (m_y) {
delete m_y; m_y = 0;
}
}
shapefile_main_t::point_m_t::point_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::point_m_t::_read() {
m_x = m__io->read_f8le();
m_y = m__io->read_f8le();
m_m = m__io->read_f8le();
}
shapefile_main_t::point_m_t::~point_m_t() {
_clean_up();
}
void shapefile_main_t::point_m_t::_clean_up() {
}
shapefile_main_t::polygon_m_t::polygon_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_parts = 0;
m_points = 0;
m_m_range = 0;
m_m_values = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::polygon_m_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_parts = m__io->read_s4le();
m_number_of_points = m__io->read_s4le();
m_parts = new std::vector<int32_t>();
const int l_parts = number_of_parts();
for (int i = 0; i < l_parts; i++) {
m_parts->push_back(m__io->read_s4le());
}
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
m_m_range = new bounds_min_max_t(m__io, this, m__root);
m_m_values = new std::vector<double>();
const int l_m_values = number_of_points();
for (int i = 0; i < l_m_values; i++) {
m_m_values->push_back(m__io->read_f8le());
}
}
shapefile_main_t::polygon_m_t::~polygon_m_t() {
_clean_up();
}
void shapefile_main_t::polygon_m_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_parts) {
delete m_parts; m_parts = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
if (m_m_range) {
delete m_m_range; m_m_range = 0;
}
if (m_m_values) {
delete m_m_values; m_m_values = 0;
}
}
shapefile_main_t::record_header_t::record_header_t(kaitai::kstream* p__io, shapefile_main_t::record_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::record_header_t::_read() {
m_record_number = m__io->read_s4be();
m_content_length = m__io->read_s4be();
}
shapefile_main_t::record_header_t::~record_header_t() {
_clean_up();
}
void shapefile_main_t::record_header_t::_clean_up() {
}
shapefile_main_t::multi_point_t::multi_point_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_points = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::multi_point_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_points = m__io->read_s4le();
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
}
shapefile_main_t::multi_point_t::~multi_point_t() {
_clean_up();
}
void shapefile_main_t::multi_point_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
}
shapefile_main_t::file_header_t::file_header_t(kaitai::kstream* p__io, shapefile_main_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::file_header_t::_read() {
m_file_code = m__io->read_bytes(4);
if (!(file_code() == std::string("\x00\x00\x27\x0A", 4))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x00\x00\x27\x0A", 4), file_code(), _io(), std::string("/types/file_header/seq/0"));
}
m_unused_field_1 = m__io->read_bytes(4);
if (!(unused_field_1() == std::string("\x00\x00\x00\x00", 4))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x00\x00\x00\x00", 4), unused_field_1(), _io(), std::string("/types/file_header/seq/1"));
}
m_unused_field_2 = m__io->read_bytes(4);
if (!(unused_field_2() == std::string("\x00\x00\x00\x00", 4))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x00\x00\x00\x00", 4), unused_field_2(), _io(), std::string("/types/file_header/seq/2"));
}
m_unused_field_3 = m__io->read_bytes(4);
if (!(unused_field_3() == std::string("\x00\x00\x00\x00", 4))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x00\x00\x00\x00", 4), unused_field_3(), _io(), std::string("/types/file_header/seq/3"));
}
m_unused_field_4 = m__io->read_bytes(4);
if (!(unused_field_4() == std::string("\x00\x00\x00\x00", 4))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x00\x00\x00\x00", 4), unused_field_4(), _io(), std::string("/types/file_header/seq/4"));
}
m_unused_field_5 = m__io->read_bytes(4);
if (!(unused_field_5() == std::string("\x00\x00\x00\x00", 4))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\x00\x00\x00\x00", 4), unused_field_5(), _io(), std::string("/types/file_header/seq/5"));
}
m_file_length = m__io->read_s4be();
m_version = m__io->read_bytes(4);
if (!(version() == std::string("\xE8\x03\x00\x00", 4))) {
throw kaitai::validation_not_equal_error<std::string>(std::string("\xE8\x03\x00\x00", 4), version(), _io(), std::string("/types/file_header/seq/7"));
}
m_shape_type = static_cast<shapefile_main_t::shape_type_t>(m__io->read_s4le());
m_bounding_box = new bounding_box_x_y_z_m_t(m__io, this, m__root);
}
shapefile_main_t::file_header_t::~file_header_t() {
_clean_up();
}
void shapefile_main_t::file_header_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
}
shapefile_main_t::point_z_t::point_z_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::point_z_t::_read() {
m_x = m__io->read_f8le();
m_y = m__io->read_f8le();
m_z = m__io->read_f8le();
m_m = m__io->read_f8le();
}
shapefile_main_t::point_z_t::~point_z_t() {
_clean_up();
}
void shapefile_main_t::point_z_t::_clean_up() {
}
shapefile_main_t::record_t::record_t(kaitai::kstream* p__io, shapefile_main_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_header = 0;
m_contents = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::record_t::_read() {
m_header = new record_header_t(m__io, this, m__root);
m_contents = new record_contents_t(m__io, this, m__root);
}
shapefile_main_t::record_t::~record_t() {
_clean_up();
}
void shapefile_main_t::record_t::_clean_up() {
if (m_header) {
delete m_header; m_header = 0;
}
if (m_contents) {
delete m_contents; m_contents = 0;
}
}
shapefile_main_t::record_contents_t::record_contents_t(kaitai::kstream* p__io, shapefile_main_t::record_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::record_contents_t::_read() {
m_shape_type = static_cast<shapefile_main_t::shape_type_t>(m__io->read_s4le());
n_shape_parameters = true;
if (shape_type() != shapefile_main_t::SHAPE_TYPE_NULL_SHAPE) {
n_shape_parameters = false;
n_shape_parameters = true;
switch (shape_type()) {
case shapefile_main_t::SHAPE_TYPE_POLY_LINE_Z: {
n_shape_parameters = false;
m_shape_parameters = new poly_line_z_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_MULTI_PATCH: {
n_shape_parameters = false;
m_shape_parameters = new multi_patch_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POLY_LINE_M: {
n_shape_parameters = false;
m_shape_parameters = new poly_line_m_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POLYGON: {
n_shape_parameters = false;
m_shape_parameters = new polygon_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POLYGON_Z: {
n_shape_parameters = false;
m_shape_parameters = new polygon_z_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POINT_Z: {
n_shape_parameters = false;
m_shape_parameters = new point_z_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POLY_LINE: {
n_shape_parameters = false;
m_shape_parameters = new poly_line_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POINT_M: {
n_shape_parameters = false;
m_shape_parameters = new point_m_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POLYGON_M: {
n_shape_parameters = false;
m_shape_parameters = new polygon_m_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_MULTI_POINT: {
n_shape_parameters = false;
m_shape_parameters = new multi_point_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_POINT: {
n_shape_parameters = false;
m_shape_parameters = new point_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_MULTI_POINT_M: {
n_shape_parameters = false;
m_shape_parameters = new multi_point_m_t(m__io, this, m__root);
break;
}
case shapefile_main_t::SHAPE_TYPE_MULTI_POINT_Z: {
n_shape_parameters = false;
m_shape_parameters = new multi_point_z_t(m__io, this, m__root);
break;
}
}
}
}
shapefile_main_t::record_contents_t::~record_contents_t() {
_clean_up();
}
void shapefile_main_t::record_contents_t::_clean_up() {
if (!n_shape_parameters) {
if (m_shape_parameters) {
delete m_shape_parameters; m_shape_parameters = 0;
}
}
}
shapefile_main_t::multi_patch_t::multi_patch_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_parts = 0;
m_part_types = 0;
m_points = 0;
m_z_range = 0;
m_z_values = 0;
m_m_range = 0;
m_m_values = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::multi_patch_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_parts = m__io->read_s4le();
m_number_of_points = m__io->read_s4le();
m_parts = new std::vector<int32_t>();
const int l_parts = number_of_parts();
for (int i = 0; i < l_parts; i++) {
m_parts->push_back(m__io->read_s4le());
}
m_part_types = new std::vector<part_type_t>();
const int l_part_types = number_of_parts();
for (int i = 0; i < l_part_types; i++) {
m_part_types->push_back(static_cast<shapefile_main_t::part_type_t>(m__io->read_s4le()));
}
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
m_z_range = new bounds_min_max_t(m__io, this, m__root);
m_z_values = new std::vector<double>();
const int l_z_values = number_of_points();
for (int i = 0; i < l_z_values; i++) {
m_z_values->push_back(m__io->read_f8le());
}
m_m_range = new bounds_min_max_t(m__io, this, m__root);
m_m_values = new std::vector<double>();
const int l_m_values = number_of_points();
for (int i = 0; i < l_m_values; i++) {
m_m_values->push_back(m__io->read_f8le());
}
}
shapefile_main_t::multi_patch_t::~multi_patch_t() {
_clean_up();
}
void shapefile_main_t::multi_patch_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_parts) {
delete m_parts; m_parts = 0;
}
if (m_part_types) {
delete m_part_types; m_part_types = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
if (m_z_range) {
delete m_z_range; m_z_range = 0;
}
if (m_z_values) {
delete m_z_values; m_z_values = 0;
}
if (m_m_range) {
delete m_m_range; m_m_range = 0;
}
if (m_m_values) {
delete m_m_values; m_m_values = 0;
}
}
shapefile_main_t::poly_line_m_t::poly_line_m_t(kaitai::kstream* p__io, shapefile_main_t::record_contents_t* p__parent, shapefile_main_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_bounding_box = 0;
m_parts = 0;
m_points = 0;
m_m_range = 0;
m_m_values = 0;
try {
_read();
} catch(...) {
_clean_up();
throw;
}
}
void shapefile_main_t::poly_line_m_t::_read() {
m_bounding_box = new bounding_box_x_y_t(m__io, this, m__root);
m_number_of_parts = m__io->read_s4le();
m_number_of_points = m__io->read_s4le();
m_parts = new std::vector<int32_t>();
const int l_parts = number_of_parts();
for (int i = 0; i < l_parts; i++) {
m_parts->push_back(m__io->read_s4le());
}
m_points = new std::vector<point_t*>();
const int l_points = number_of_points();
for (int i = 0; i < l_points; i++) {
m_points->push_back(new point_t(m__io, this, m__root));
}
m_m_range = new bounds_min_max_t(m__io, this, m__root);
m_m_values = new std::vector<double>();
const int l_m_values = number_of_points();
for (int i = 0; i < l_m_values; i++) {
m_m_values->push_back(m__io->read_f8le());
}
}
shapefile_main_t::poly_line_m_t::~poly_line_m_t() {
_clean_up();
}
void shapefile_main_t::poly_line_m_t::_clean_up() {
if (m_bounding_box) {
delete m_bounding_box; m_bounding_box = 0;
}
if (m_parts) {
delete m_parts; m_parts = 0;
}
if (m_points) {
for (std::vector<point_t*>::iterator it = m_points->begin(); it != m_points->end(); ++it) {
delete *it;
}
delete m_points; m_points = 0;
}
if (m_m_range) {
delete m_m_range; m_m_range = 0;
}
if (m_m_values) {
delete m_m_values; m_m_values = 0;
}
}