1#ifndef OSMSCOUT_UTIL_GEOMETRY_H
2#define OSMSCOUT_UTIL_GEOMETRY_H
27#include <unordered_map>
63 return deg*M_PI/180.0;
73 return rad*180.0/M_PI;
86 double diff = std::abs(a - b);
89 return 2 * M_PI - diff;
102 template<
class InputIt >
109 double minLon=first->GetLon();
110 double maxLon=minLon;
111 double minLat=first->GetLat();
112 double maxLat=minLat;
114 for (InputIt i=first; i!=last; i++) {
115 minLon=std::min(minLon,i->GetLon());
116 maxLon=std::max(maxLon,i->GetLon());
117 minLat=std::min(minLat,i->GetLat());
118 maxLat=std::max(maxLat,i->GetLat());
121 boundingBox.Set(GeoCoord(minLat,minLon),
122 GeoCoord(maxLat,maxLon));
137 assert(!nodes.empty());
141 for (
const auto& node : nodes) {
142 boundingBox.Include(node);
159 assert(!nodes.empty());
163 for (
const auto& node : nodes) {
164 boundingBox.Include(node.GetCoord());
183 assert(!nodes.empty());
185 boundingBox.Invalidate();
186 for (
const auto& node : nodes) {
187 boundingBox.Include(node);
202 assert(!nodes.empty());
204 boundingBox.Invalidate();
205 for (
const auto& node : nodes) {
206 boundingBox.Include(node.GetCoord());
221 if (a1.IsEqual(b1) ||
227 if (a1.IsEqual(a2) &&
234 double denr=(b2.GetLat()-b1.GetLat())*(a2.GetLon()-a1.GetLon())-
235 (b2.GetLon()-b1.GetLon())*(a2.GetLat()-a1.GetLat());
237 double ua_numr=(b2.GetLon()-b1.GetLon())*(a1.GetLat()-b1.GetLat())-
238 (b2.GetLat()-b1.GetLat())*(a1.GetLon()-b1.GetLon());
239 double ub_numr=(a2.GetLon()-a1.GetLon())*(a1.GetLat()-b1.GetLat())-
240 (a2.GetLat()-a1.GetLat())*(a1.GetLon()-b1.GetLon());
243 if (ua_numr==0.0 && ub_numr==0.0) {
245 GeoBox aBox(GeoCoord(a1.GetLat(),a1.GetLon()),
246 GeoCoord(a2.GetLat(),a2.GetLon()));
247 GeoBox bBox(GeoCoord(b1.GetLat(),b1.GetLon()),
248 GeoCoord(b2.GetLat(),b2.GetLon()));
250 return bBox.Includes(a1,
false) ||
251 bBox.Includes(a2,
false) ||
252 aBox.Includes(b1,
false) ||
253 aBox.Includes(b2,
false);
259 double ua=ua_numr/denr;
260 double ub=ub_numr/denr;
273 template<
typename N,
typename I>
280 if (a1.IsEqual(b1) ||
282 intersection.Set(a1.GetLat(),a1.GetLon());
285 if (a2.IsEqual(b1) ||
287 intersection.Set(a2.GetLat(),a2.GetLon());
290 if (a1.IsEqual(a2) &&
304 double denr=(b2.GetLat()-b1.GetLat())*(a2.GetLon()-a1.GetLon())-
305 (b2.GetLon()-b1.GetLon())*(a2.GetLat()-a1.GetLat());
307 double ua_numr=(b2.GetLon()-b1.GetLon())*(a1.GetLat()-b1.GetLat())-
308 (b2.GetLat()-b1.GetLat())*(a1.GetLon()-b1.GetLon());
309 double ub_numr=(a2.GetLon()-a1.GetLon())*(a1.GetLat()-b1.GetLat())-
310 (a2.GetLat()-a1.GetLat())*(a1.GetLon()-b1.GetLon());
313 if (ua_numr==0.0 && ub_numr==0.0) {
315 GeoBox aBox(GeoCoord(a1.GetLat(),a1.GetLon()),
316 GeoCoord(a2.GetLat(),a2.GetLon()));
317 GeoBox bBox(GeoCoord(b1.GetLat(),b1.GetLon()),
318 GeoCoord(b2.GetLat(),b2.GetLon()));
319 if (bBox.Includes(a1,
false)){
320 intersection.Set(a1.GetLat(),a1.GetLon());
323 if (bBox.Includes(a2,
false)){
324 intersection.Set(a2.GetLat(),a2.GetLon());
327 if (aBox.Includes(b1,
false)){
328 intersection.Set(b1.GetLat(),b1.GetLon());
331 if (aBox.Includes(b2,
false)){
332 intersection.Set(b2.GetLat(),b2.GetLon());
342 double ua=ua_numr/denr;
343 double ub=ub_numr/denr;
349 intersection.Set(a1.GetLat()+ua*(a2.GetLat()-a1.GetLat()),
350 a1.GetLon()+ua*(a2.GetLon()-a1.GetLon()));
369 if (a1.IsEqual(b1) ||
371 intersection.Set(a1.GetX(),a1.GetY());
374 if (a2.IsEqual(b1) ||
376 intersection.Set(a2.GetX(),a2.GetY());
379 if (a1.IsEqual(a2) &&
385 double denr=(b2.GetY()-b1.GetY())*(a2.GetX()-a1.GetX())-
386 (b2.GetX()-b1.GetX())*(a2.GetY()-a1.GetY());
388 double ua_numr=(b2.GetX()-b1.GetX())*(a1.GetY()-b1.GetY())-
389 (b2.GetY()-b1.GetY())*(a1.GetX()-b1.GetX());
390 double ub_numr=(a2.GetX()-a1.GetX())*(a1.GetY()-b1.GetY())-
391 (a2.GetY()-a1.GetY())*(a1.GetX()-b1.GetX());
398 return ua_numr==0.0 && ub_numr==0.0;
401 double ua=ua_numr/denr;
402 double ub=ub_numr/denr;
408 intersection.Set(a1.GetX()+ua*(a2.GetX()-a1.GetX()),
409 a1.GetY()+ua*(a2.GetY()-a1.GetY()));
420 double lonDelta=a.GetLon()-b.GetLon();
421 double latDelta=a.GetLat()-b.GetLat();
423 return lonDelta*lonDelta+latDelta*latDelta;
491 template<
typename N,
typename M>
493 const std::vector<M>& nodes)
499 for (i=0, j=nodes.size()-1; i<nodes.size(); j=i++) {
500 if (point.GetLat()==nodes[i].GetLat() &&
501 point.GetLon()==nodes[i].GetLon()) {
505 if ((((nodes[i].GetLat()<=point.GetLat()) && (point.GetLat()<nodes[j].GetLat())) ||
506 ((nodes[j].GetLat()<=point.GetLat()) && (point.GetLat()<nodes[i].GetLat()))) &&
507 (point.GetLon()<(nodes[j].GetLon()-nodes[i].GetLon())*(point.GetLat()-nodes[i].GetLat())/(nodes[j].GetLat()-nodes[i].GetLat())+
508 nodes[i].GetLon())) {
523 template<
typename N,
typename M>
525 const std::vector<M>& nodes)
531 for (i=0, j=nodes.size()-1; i<nodes.size(); j=i++) {
532 if (point.GetLat()==nodes[i].GetLat() &&
533 point.GetLon()==nodes[i].GetLon()) {
537 if ((((nodes[i].GetLat()<=point.GetLat()) && (point.GetLat()<nodes[j].GetLat())) ||
538 ((nodes[j].GetLat()<=point.GetLat()) && (point.GetLat()<nodes[i].GetLat()))) &&
539 (point.GetLon()<(nodes[j].GetLon()-nodes[i].GetLon())*(point.GetLat()-nodes[i].GetLat())/(nodes[j].GetLat()-nodes[i].GetLat())+
540 nodes[i].GetLon())) {
552 template<
typename N,
typename M>
554 const std::vector<M>& b)
556 for (
const auto& node : a) {
569 template<
typename N,
typename M>
571 const std::vector<M>& b,
575 if (!aBox.Intersects(bBox)){
579 for (
const auto& node : a) {
592 template<
typename N,
typename M>
594 const std::vector<M>& b)
612 template<
typename N,
typename M>
614 const std::vector<M>& b)
616 for (
const auto& node : a) {
639 template<
typename N,
typename M>
641 const std::vector<M>& b)
647 for (
const auto& node : a) {
659 if (count>=100 &&
double(pro)/20.0>
double(contra)) {
664 return double(pro)/20.0>double(contra);
676 template<
typename N,
typename M>
678 const std::vector<M>& b)
688 for (
const auto& node : a) {
700 if (count>=100 && pro/20>contra) {
705 if (pro == 0 && contra == 0 && count > 0) {
709 return pro/20.0>contra;
724 if (points.size()<3) {
728 points.push_back(points[0]);
730 size_t edgesIntersect=0;
732 for (
size_t i=0; i<points.size()-1; i++) {
735 for (
size_t j=i+1; j<points.size()-1; j++) {
743 if (edgesIntersect>2) {
748 if (edgesIntersect>1) {
770 const std::vector<bool>& edgeStartsNewPoly)
772 size_t edgesIntersect=0;
774 for (
size_t i=0; i<edges.size(); i++) {
777 for (
size_t j=i+1; j<edges.size(); j++) {
788 if (edgeStartsNewPoly[i]) {
789 if (edgesIntersect>2) {
800 if (edgesIntersect>1) {
827 for (
size_t i=1; i<edges.size(); i++) {
829 if (edges[i].y<edges[ptIdx].y) {
833 else if (edges[i].y==edges[ptIdx].y) {
834 if (edges[i].x<edges[ptIdx].x) {
840 size_t prevIdx=(ptIdx==0) ? edges.size()-1 : ptIdx-1;
841 size_t nextIdx=(ptIdx==edges.size()-1) ? 0 : ptIdx+1;
843 double signedArea=(edges[ptIdx].x-edges[prevIdx].x)*
844 (edges[nextIdx].y-edges[ptIdx].y)-
845 (edges[ptIdx].y-edges[prevIdx].y)*
846 (edges[nextIdx].x-edges[ptIdx].x);
848 return signedArea>0.0;
860 std::vector<std::vector<N> >& innerPoints)
862 if (outerPoints.size()<3) {
866 size_t numEdges=outerPoints.size();
868 for (
size_t i=0; i<innerPoints.size(); i++) {
869 numEdges+=innerPoints[i].size();
872 std::vector<bool> edgeStartsNewPoly(numEdges,
false);
873 std::vector<std::pair<N,N> > listEdges(numEdges);
878 outerPoints.push_back(outerPoints[0]);
879 for (
size_t i=0; i<innerPoints.size(); i++) {
880 innerPoints[i].push_back(innerPoints[i][0]);
884 edgeStartsNewPoly[0]=
true;
885 for (
size_t i=1; i<outerPoints.size(); i++) {
886 std::pair<N, N> outerEdge;
888 outerEdge.first=outerPoints[i-1];
889 outerEdge.second=outerPoints[i];
890 listEdges[cEdge]=outerEdge;
896 for (
size_t i=0; i<innerPoints.size(); i++) {
897 edgeStartsNewPoly[cEdge]=
true;
899 for (
size_t j=1; j<innerPoints[i].size(); j++) {
900 std::pair<N, N> innerEdge;
902 innerEdge.first=innerPoints[i][j-1];
903 innerEdge.second=innerPoints[i][j];
904 listEdges[cEdge]=innerEdge;
912 outerPoints.pop_back();
913 for (
size_t i=0; i<innerPoints.size(); i++) {
914 innerPoints[i].pop_back();
923 std::reverse(outerPoints.begin(),
927 for (
int i=0; i<innerPoints.size(); i++) {
929 std::reverse(innerPoints[i].begin(),
930 innerPoints[i].end());
952 double length=sqrt(x*x+y*y);
964 inline double Det(
double x1,
990 assert(edges.size()>=3);
998 for (
size_t i=1; i<edges.size(); i++) {
1000 if (edges[i].GetLat()<edges[ptIdx].GetLat()) {
1004 else if (edges[i].GetLat()==edges[ptIdx].GetLat()) {
1005 if (edges[i].GetLon()<edges[ptIdx].GetLon()) {
1011 size_t prevIdx=(ptIdx==0) ? edges.size()-1 : ptIdx-1;
1012 size_t nextIdx=(ptIdx==edges.size()-1) ? 0 : ptIdx+1;
1014 double signedArea=(edges[ptIdx].GetLon()-edges[prevIdx].GetLon())*
1015 (edges[nextIdx].GetLat()-edges[ptIdx].GetLat())-
1016 (edges[ptIdx].GetLat()-edges[prevIdx].GetLat())*
1017 (edges[nextIdx].GetLon()-edges[ptIdx].GetLon());
1019 return signedArea<0.0;
1034 template<
typename N>
1039 double xdelta=b.GetLon()-a.GetLon();
1040 double ydelta=b.GetLat()-a.GetLat();
1042 if (xdelta==0 && ydelta==0) {
1043 return std::numeric_limits<double>::infinity();
1046 double u=((p.GetLon()-a.GetLon())*xdelta+(p.GetLat()-a.GetLat())*ydelta)/(xdelta*xdelta+ydelta*ydelta);
1060 cx=a.GetLon()+u*xdelta;
1061 cy=a.GetLat()+u*ydelta;
1064 double dx=cx-p.GetLon();
1065 double dy=cy-p.GetLat();
1067 return sqrt(dx*dx+dy*dy);
1073 GeoCoord& intersection);
1089 double bLon,
double bLat);
1105 const Bearing &bearing,
1106 const Distance &distance,
1107 double& lat2,
double& lon2);
1115 const Bearing &bearing,
1116 const Distance &distance);
1165 return x==other.
x &&
y==other.
y;
1170 return std::tie(
y,
x) < std::tie(other.
y, other.
x);
1175 return x==other.
x &&
y==other.
y;
1202 std::vector<ScanCell>& cells);
1211 double p1x,
double p1y,
1212 double p2x,
double p2y,
1214 double& qx,
double& qy);
1217 const GeoCoord& segmentStart,
1218 const GeoCoord& segmentEnd,
1220 GeoCoord& intersection);
1223 const GeoCoord& segmentStart,
1224 const GeoCoord& segmentEnd,
1226 GeoCoord& intersection);
1229 const GeoCoord& segmentStart,
1230 const GeoCoord& segmentEnd,
1232 GeoCoord& intersection);
1255 template<
typename N>
1257 size_t from,
size_t to,
1258 GeoBox& boundingBox)
1260 if (path.empty() || from>=to){
1261 boundingBox.Invalidate();
1265 double minLon=path[from%path.size()].GetLon();
1266 double maxLon=minLon;
1267 double minLat=path[from%path.size()].GetLat();
1268 double maxLat=minLat;
1270 for (
size_t i=from; i<to; i++) {
1271 minLon=std::min(minLon,path[i%path.size()].GetLon());
1272 maxLon=std::max(maxLon,path[i%path.size()].GetLon());
1273 minLat=std::min(minLat,path[i%path.size()].GetLat());
1274 maxLat=std::max(maxLat,path[i%path.size()].GetLat());
1277 boundingBox.Set(GeoCoord(minLat,minLon),
1278 GeoCoord(maxLat,maxLon));
1287 template<
typename N>
1289 std::vector<SegmentGeoBox> &segmentBoxes,
1291 size_t segmentSize = 1000)
1293 assert(segmentSize>0);
1294 for (
size_t i=0;i<bound;i+=segmentSize){
1297 box.
to = std::min(i+segmentSize,bound);
1299 segmentBoxes.push_back(box);
1309 template<
typename N>
1311 const std::vector<N> &bPath,
1314 std::vector<PathIntersection> &intersections,
1315 size_t aStartIndex=0,
1316 size_t bStartIndex=0)
1318 size_t aIndex=aStartIndex;
1319 size_t bIndex=bStartIndex;
1321 size_t aBound=aClosed?aIndex+aPath.size():aPath.size()-1;
1322 size_t bBound=bClosed?bIndex+bPath.size():bPath.size()-1;
1323 size_t bStart=bIndex;
1325 if (bStart>=bBound || aIndex>=aBound){
1335 std::vector<SegmentGeoBox> bSegmentBoxes;
1338 for (;aIndex<aBound;aIndex++){
1339 N a1=aPath[aIndex%aPath.size()];
1340 N a2=aPath[(aIndex+1)%aPath.size()];
1341 aLineBox.Set(GeoCoord(a1.GetLat(),a1.GetLon()),
1342 GeoCoord(a2.GetLat(),a2.GetLon()));
1343 if (!bBox.Intersects(aLineBox,
false)){
1346 for (bIndex=bStart;bIndex<bBound;bIndex++){
1347 N b1=bPath[bIndex%bPath.size()];
1348 N b2=bPath[(bIndex+1)%bPath.size()];
1349 bLineBox.Set(GeoCoord(b1.GetLat(),b1.GetLon()),
1350 GeoCoord(b2.GetLat(),b2.GetLon()));
1352 if (!bSegmentBoxes[bIndex/1000].bbox.Intersects(aLineBox,
false) &&
1353 !aLineBox.Intersects(bLineBox,
false)){
1355 bIndex+=std::max(0, 998-(
int)(bIndex%1000));
1358 if (!aLineBox.Intersects(bLineBox,
false)){
1369 GeoCoord pointBefore(a1.GetLat()-(a2.GetLat()-a1.GetLat()),
1370 a1.GetLon()-(a2.GetLon()-a1.GetLon()));
1371 GeoCoord pointAfter(b2.GetLat()+(b2.GetLat()-b1.GetLat()),
1372 b2.GetLon()+(b2.GetLon()-b1.GetLon()));
1374 (pointAfter.GetLat()-pi.
point.GetLat())-
1375 (pi.
point.GetLat()-pointBefore.GetLat())*
1376 (pointAfter.GetLon()-pi.
point.GetLon());
1383 intersections.push_back(pi);
1395 template<
typename N>
1403 std::vector<SegmentGeoBox> segmentBoxes;
1406 for (; i<way.size()-1; i++) {
1409 lineBox.Set(GeoCoord(i1.GetLat(),i1.GetLon()),
1410 GeoCoord(i2.GetLat(),i2.GetLon()));
1412 for (j=i+1; j<way.size()-1; j++) {
1413 if (!segmentBoxes[j/1000].bbox.Intersects(lineBox,
false) &&
1414 !segmentBoxes[(j+1)/1000].bbox.Intersects(lineBox,
false)){
1416 j+=std::max(0, 998-(
int)(j%1000));
1424 if (way[i].IsEqual(way[j]) ||
1425 way[i].IsEqual(way[j+1]) ||
1426 way[i+1].IsEqual(way[j]) ||
1427 way[i+1].IsEqual(way[j+1])) {
1454 std::unordered_map<Id,size_t> nodeIdIndexMap;
1455 std::vector<Point> nodes;
1456 std::list<Edge> edges;
1459 void RemoveEliminatingEdges();
1498 Direction direction;
1500 size_t currentIndex=0;
1504 void CalculateBox();
1511 direction(direction),
1512 parts((double)parts)
1514 assert(currentIndex<parts);
1522 if (currentIndex<parts) {
1529 assert(currentIndex<parts);
1535 assert(currentIndex<parts);
1536 return currentIndex;
1547 return hash<int>{}(cell.
GetX()) ^ (hash<int>{}(cell.
GetY()) << 1);
#define OSMSCOUT_API
Definition CoreImportExport.h:45
GeoBoxPartitioner(const GeoBox &box, Direction direction, size_t parts)
Definition Geometry.h:1507
size_t GetCurrentIndex() const
Definition Geometry.h:1533
void Advance()
Definition Geometry.h:1518
GeoBox GetCurrentGeoBox() const
Definition Geometry.h:1527
Direction
Definition Geometry.h:1491
Definition Geometry.h:1439
bool Merge(std::list< Polygon > &result)
void AddPolygon(const std::vector< Point > &polygonsCoords)
bool GetLineIntersectionPixel(const N &a1, const N &a2, const N &b1, const N &b2, N &intersection)
Definition Geometry.h:363
bool FindIntersection(const std::vector< N > &way, size_t &i, size_t &j)
Definition Geometry.h:1396
double Det(double x1, double y1, double x2, double y2)
Definition Geometry.h:964
void OSMSCOUT_API ScanConvertLine(int x1, int y1, int x2, int y2, std::vector< ScanCell > &cells)
OSMSCOUT_API double DistanceToSegment(double px, double py, double p1x, double p1y, double p2x, double p2y, double &r, double &qx, double &qy)
OSMSCOUT_API Bearing GetSphericalBearingFinal(const GeoCoord &a, const GeoCoord &b)
OSMSCOUT_API Distance GetEllipsoidalDistance(double aLon, double aLat, double bLon, double bLat)
double AngleDiff(double a, double b)
Definition Geometry.h:84
OSMSCOUT_API Bearing GetSphericalBearingInitial(const GeoCoord &a, const GeoCoord &b)
int GetRelationOfPointToArea(const N &point, const std::vector< M > &nodes)
Definition Geometry.h:524
bool IsCoordInArea(const N &point, const std::vector< M > &nodes)
Definition Geometry.h:492
bool IsAreaSubOfAreaQuorum(const std::vector< N > &a, const std::vector< M > &b)
Definition Geometry.h:640
bool AreaIsClockwise(const std::vector< N > &edges)
Definition Geometry.h:988
bool GetLineIntersection(const N &a1, const N &a2, const N &b1, const N &b2, I &intersection)
Definition Geometry.h:274
bool AreaIsValid(std::vector< N > &outerPoints, std::vector< std::vector< N > > &innerPoints)
Definition Geometry.h:859
bool IsAreaCompletelyInArea(const std::vector< N > &a, const std::vector< M > &b)
Definition Geometry.h:553
bool AreaIsCCW(const std::vector< N > &edges)
Definition Geometry.h:816
double RadToDeg(double rad)
Definition Geometry.h:71
bool IsAreaSubOfAreaOrSame(const std::vector< N > &a, const std::vector< M > &b)
Definition Geometry.h:677
OSMSCOUT_API Distance GetSphericalDistance(const GeoCoord &a, const GeoCoord &b)
double DegToRad(double deg)
Definition Geometry.h:61
bool AreaIsSimple(std::vector< N > points)
Definition Geometry.h:722
void FindPathIntersections(const std::vector< N > &aPath, const std::vector< N > &bPath, bool aClosed, bool bClosed, std::vector< PathIntersection > &intersections, size_t aStartIndex=0, size_t bStartIndex=0)
Definition Geometry.h:1310
OSMSCOUT_API double GetDistanceInLonDegrees(const Distance &d, double latitude=0)
void GetBoundingBox(const InputIt first, const InputIt last, GeoBox &boundingBox)
Definition Geometry.h:103
bool LinesIntersect(const N &a1, const N &a2, const N &b1, const N &b2)
Definition Geometry.h:216
void Normalize(double x, double y, double &nx, double &ny)
Definition Geometry.h:947
bool IsAreaSubOfArea(const std::vector< N > &a, const std::vector< M > &b)
Definition Geometry.h:613
bool IsAreaAtLeastPartlyInArea(const std::vector< N > &a, const std::vector< M > &b, const GeoBox &aBox, const GeoBox &bBox)
Definition Geometry.h:570
OSMSCOUT_API double NormalizeRelativeAngle(double angle)
const size_t CELL_DIMENSION_COUNT
Definition Geometry.h:1474
OSMSCOUT_API const std::array< CellDimension, CELL_DIMENSION_COUNT > cellDimension
OSMSCOUT_API size_t Pow(size_t a, size_t b)
double DistanceSquare(const N &a, const N &b)
Definition Geometry.h:417
void ComputeSegmentBoxes(const std::vector< N > &path, std::vector< SegmentGeoBox > &segmentBoxes, size_t bound, size_t segmentSize=1000)
Definition Geometry.h:1288
void GetSegmentBoundingBox(const std::vector< N > &path, size_t from, size_t to, GeoBox &boundingBox)
Definition Geometry.h:1256
double CalculateDistancePointToLineSegment(const N &p, const N &a, const N &b)
Definition Geometry.h:1035
const size_t CELL_DIMENSION_MAX
Definition Geometry.h:1473
Definition Geometry.h:1468
double width
Definition Geometry.h:1469
double height
Definition Geometry.h:1470
Definition Geometry.h:1239
double aDistanceSquare
distance^2 between "a path" point and intersection
Definition Geometry.h:1245
GeoCoord point
intersection point
Definition Geometry.h:1240
size_t bIndex
"b path" point index before intersection
Definition Geometry.h:1242
double orientation
Definition Geometry.h:1243
size_t aIndex
"a path" point index before intersection
Definition Geometry.h:1241
double bDistanceSquare
distance^2 between "b path" point and intersection
Definition Geometry.h:1246
Definition Geometry.h:1449
std::vector< Point > coords
Definition Geometry.h:1450
Definition Geometry.h:1151
int x
Definition Geometry.h:1152
int y
Definition Geometry.h:1153
bool operator==(const ScanCell &other) const
Definition Geometry.h:1163
void Set(int x, int y)
Definition Geometry.h:1157
bool IsEqual(const ScanCell &other) const
Definition Geometry.h:1173
int GetX() const
Definition Geometry.h:1178
int GetY() const
Definition Geometry.h:1183
bool operator<(const ScanCell &other) const
Definition Geometry.h:1168
Definition Geometry.h:1190
GeoBox bbox
Definition Geometry.h:1193
size_t to
exclusive
Definition Geometry.h:1192
size_t from
Definition Geometry.h:1191
size_t operator()(const osmscout::ScanCell &cell) const
Definition Geometry.h:1545