128class ShapeBaseChart {
130 ShapeBaseChart() =
delete;
131 ShapeBaseChart(
const std::string &filename,
const size_t &min_scale,
132 const wxColor &color = *wxBLACK)
137 _min_scale(min_scale),
141 _is_usable = fs::exists(filename);
144 ShapeBaseChart(
const ShapeBaseChart &t) {
145 this->_filename = t._filename;
146 this->_is_usable = t._is_usable;
147 this->_is_tiled = t._is_tiled;
148 this->_min_scale = t._min_scale;
149 this->_reader =
nullptr;
150 this->_color = t._color;
152 this->_loading = t._loading;
159 void SetColor(wxColor color) { _color = color; }
186 bool IsUsable() {
return _is_usable && !_loading; }
187 size_t MinScale() {
return _min_scale; }
188 void RenderViewOnDC(ocpnDC &dc, ViewPort &vp) { DrawPolygonFilled(dc, vp); }
189 static const std::string ConstructPath(
const std::string &dir,
190 const std::string &quality_suffix) {
191 return std::string(dir +
192 static_cast<const char>(fs::path::preferred_separator) +
193 "basemap_" + quality_suffix +
".shp");
213 bool CrossesLand(
double &lat1,
double &lon1,
double &lat2,
double &lon2);
219 std::future<bool> _loaded;
234 void DoDrawPolygonFilled(ocpnDC &pnt, ViewPort &vp,
235 const shp::Feature &feature);
236 void DoDrawPolygonFilledGL(ocpnDC &pnt, ViewPort &vp,
237 const shp::Feature &feature);
238 void DrawPolygonFilled(ocpnDC &pnt, ViewPort &vp);
240 void AddPointToTessList(shp::Point &point, ViewPort &vp, GLUtesselator *tobj,
248 std::string _filename;
255 shp::ShapefileReader *_reader;
262 std::unordered_map<LatLonKey, std::vector<size_t>> _tiles;
293 bool LineLineIntersect(
const std::pair<double, double> &A,
294 const std::pair<double, double> &B,
295 const std::pair<double, double> &C,
296 const std::pair<double, double> &D);
316 bool PolygonLineIntersect(
const shp::Feature &feature,
317 const std::pair<double, double> &A,
318 const std::pair<double, double> &B);
326class ShapeBaseChartSet {
329 ~ShapeBaseChartSet() { Cleanup(); }
330 static wxPoint2DDouble GetDoublePixFromLL(
ViewPort &vp,
double lat,
333 void SetBasemapLandColor(wxColor color);
334 wxColor GetBasemapLandColor();
345 return _basemap_map.size() > 0 && LowestQualityBaseMap().IsUsable();
359 bool CrossesLand(
double lat1,
double lon1,
double lat2,
double lon2) {
361 return HighestQualityBaseMap().CrossesLand(lat1, lon1, lat2, lon2);
367 for (
auto &pair : _basemap_map) {
368 pair.second.CancelLoading();
370 _basemap_map.clear();
376 void LoadBasemaps(
const std::string &dir);
377 void DrawPolygonFilled(ocpnDC &pnt, ViewPort &vp, wxColor
const &color);
378 void DrawPolygonFilledGL(ocpnDC &pnt,
int *pvc, ViewPort &vp,
379 wxColor
const &color,
bool idl);
387 ShapeBaseChart &LowestQualityBaseMap();
395 ShapeBaseChart &HighestQualityBaseMap();
405 std::map<Quality, ShapeBaseChart> _basemap_map;
bool CrossesLand(double lat1, double lon1, double lat2, double lon2)
Determines if a line segment between two geographical points crosses any land mass.
bool CrossesLand(double &lat1, double &lon1, double &lat2, double &lon2)
Determines if a line segment between two geographical points intersects any land mass represented in ...