TerraLib and TerraView Wiki Page

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
wiki:documentation:devguide:geometry_module [2016/01/19 08:54]
gribeiro [LineString]
wiki:documentation:devguide:geometry_module [2016/01/19 09:57]
gribeiro [Set Operations]
Line 94: Line 94:
  
 <code cpp> <code cpp>
-std::​unique_ptr<​te::​gm::​LinearRing> ​= std::​make_unique<​te::​gm::​LinearRing>​(5,​ te::​gm::​LineStringType);​+std::​unique_ptr<​te::​gm::​LinearRing> ​= std::​make_unique<​te::​gm::​LinearRing>​(5,​ te::​gm::​LineStringType, 0);
  
-double xc = -54.0; +r->​setPoint(0, ​12); 
-double yc = -12.0; +r->​setPoint(1, ​17); 
-duble halfSize = size * 0.5; +r->​setPoint(2, ​77); 
- +r->​setPoint(3, ​72); 
-s->​setPoint(0, ​xc - halfSizeyc - halfSize); // lower left  +r->​setPoint(4, ​12);
-s->​setPoint(1, ​xc - halfSizeyc + halfSize); // upper left +
-s->​setPoint(2, ​xc + halfSizeyc + halfSize); // upper right +
-s->​setPoint(3, ​xc + halfSizeyc - halfSize); // lower right +
-s->​setPoint(4, ​xc - halfSizeyc - halfSize); // closing+
 </​code>​ </​code>​
  
Line 155: Line 151:
 **Polygon** is a subclass of CurvePolygon whose rings are defined by linear rings. **Polygon** is a subclass of CurvePolygon whose rings are defined by linear rings.
  
 +The code snippet below shows how to create a polygon with just one outer boundary (a LinearRing):​
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​LinearRing>​ r = std::​make_unique<​te::​gm::​LinearRing>​(5,​ te::​gm::​LineStringType,​ 4326);
 +
 +r->​setPoint(0,​ 1, 2);
 +r->​setPoint(1,​ 1, 7);
 +r->​setPoint(2,​ 7, 7);
 +r->​setPoint(3,​ 7, 2);
 +r->​setPoint(4,​ 1, 2);
 +    ​
 +te::​gm::​Polygon p(1, te::​gm::​PolygonType,​ 4326);
 +    ​
 +p.setRingN(0,​ r.release());​
 +</​code>​
 +
 +You have also methods that allows to add rings incrementally:​
 <code cpp> <code cpp>
 std::​unique_ptr<​te::​gm::​Polygon>​ p = std::​make_unique<​te::​gm::​Polygon>​(0,​ te::​gm::​PolygonType);​ std::​unique_ptr<​te::​gm::​Polygon>​ p = std::​make_unique<​te::​gm::​Polygon>​(0,​ te::​gm::​PolygonType);​
Line 252: Line 264:
  
 ===== Spatial Relationships ===== ===== Spatial Relationships =====
 +
 +**1.** Does the red polygon contains the blue one?
 <code cpp> <code cpp>
-std::​unique_ptr<​te::​gm::​Geometry> ​g1(0); +std::​unique_ptr<​te::​gm::​Geometry> ​red( te::gm::WKTReader::​read("​POLYGON ( (9 2, 9 7, 15 7, 15 2, 9 2) )"​) ​);
-std::​unique_ptr<​te::gm::Geometry>​ g2(0);+
  
-std::cout << g1->​contains(g2);+std::unique_ptr<te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (10 4, 10 7, 14 7, 14 4, 10 4) )") ); 
 +     
 +bool result = red->​contains( ​blue() ​);
  
-std::cout << ​g1->​coveredBy(g2);+std::cout << ​std::​boolalpha << result << std::end; 
 +</​code>​
  
-std::cout << g1->covers(g2);+**2.** Does the red polygon contains the blue one? 
 +<code cpp> 
 +std::unique_ptr<te::​gm::​Geometryred( te::​gm::​WKTReader::​read("​POLYGON ( (2 3, 2 6, 6 6, 6 3, 2 3) )"​) ​);
  
-std::cout << return g1->crosses(g2);+std::unique_ptr<te::​gm::​Geometryblue( te::​gm::​WKTReader::​read("​POLYGON ( (1 2, 1 7, 7 7, 7 2, 1 2) )"​) ​);
  
-std::cout << return g1->disjoint(g2);+bool result =  red->withinblue() ​);
  
-std::cout << ​return g1->​equals(g2);+std::cout << ​std::​boolalpha << result << std::endl; 
 +</​code>​
  
-std::cout << g1->intersects(g2);+<code cpp> 
 +std::unique_ptr<te::​gm::​Geometryred( te::​gm::​WKTReader::​read("​POLYGON ( (10 4, 10 7, 14 7, 14 4, 10 4) )"​) ​);
  
-std::cout << g1->overlaps(g2);+std::unique_ptr<te::​gm::​Geometryblue( te::​gm::​WKTReader::​read("​POLYGON ( (9 2, 9 7, 15 7, 15 2, 9 2) )"​) ​);
  
-std::cout << g1->touches(g2);+bool result =  red->withinblue() ​);
  
-std::cout << ​g1->within(g2);+std::cout << ​std::​boolalpha << result << std::​endl;​ 
 +</​code>​ 
 + 
 +**3.** Does the red line touches the blue one? 
 +<code cpp> 
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​LINESTRING (1 5, 1 7, 3 7)") ); 
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​LINESTRING (3 5, 1 7)") ); 
 +     
 +bool result = red->touchesblue.get() ); 
 + 
 +std::cout << std::​boolalpha << result << std::endl ; 
 +</​code>​ 
 + 
 +<code cpp> 
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​LINESTRING (4 5, 4 7, 6 7)") ); 
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​LINESTRING (5 5, 5 8)") ); 
 + 
 +bool result = red->​touches( blue.get() ); 
 + 
 +std::cout << std::​boolalpha << result << std::endl ; 
 +</​code>​ 
 + 
 +<code cpp> 
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​LINESTRING (1 3, 3 4)") ); 
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​LINESTRING (3 4, 5 3)") ); 
 +     
 +bool result = red->​touches( blue.get() ); 
 + 
 +std::cout << std::​boolalpha << result << std::endl ; 
 +</​code>​ 
 + 
 +**3.** Does the red polygon touches the blue one? 
 +<code cpp> 
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (1 0, 1 2, 4 2, 4 0, 1 0) )") ); 
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (4 0, 4 2, 7 2, 7 0, 4 0) )") ); 
 +     
 +bool result = red->​touches( blue.get() ); 
 + 
 +std::cout << std::​boolalpha << result << std::endl ; 
 +</​code>​ 
 +   
 +<code cpp> 
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (8 5, 8 7, 11 7, 11 5, 8 5) )") ); 
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (11 6, 13 8, 15 6, 13 4, 11 6) )") ); 
 + 
 +bool result = red->​touches( blue.get() ); 
 + 
 +std::cout << std::​boolalpha << result << std::endl ; 
 + 
 +</​code>​  
 +   
 +<code cpp> 
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (9 1, 9 3, 12 3, 12 1, 9 1) )") ); 
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (11 2, 13 3, 15 2, 13 1, 11 2) )") ); 
 +     
 +bool result = red->​touches( blue.get() ​)
 + 
 +std::cout << std::​boolalpha << result << std::​endl ​;
 </​code>​ </​code>​
  
 ===== Set Operations ===== ===== Set Operations =====
  
 +**1.** Polygon intersection:​
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (2 2, 2 4, 5 4, 5 2, 2 2) )") );
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (4 1, 4 3, 7 3, 7 1, 4 1) )") );
 +    ​
 +std::​unique_ptr<​te::​gm::​Geometry>​ result( red->​intersection( blue.get() ) );
 +    ​
 +std::cout << result->​toString() ​ << std::end;
 +</​code>​
 +
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (2 5, 2 7, 5 7, 5 5, 2 5) )") );
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (5 5, 5 7, 8 7, 8 5, 5 5) )") );
 +    ​
 +std::​unique_ptr<​te::​gm::​Geometry>​ result( red->​intersection( blue.get() ) );
 +    ​
 +std::cout << result->​toString() ​ << std::endl;
 +</​code>​
 +
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (9 2, 9 4, 11 4, 11 2, 9 2) )") );
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (12 1, 12 3, 15 3, 15 1, 12 1) )") );
 +    ​
 +std::​unique_ptr<​te::​gm::​Geometry>​ result( red->​intersection( blue.get() ) );
 +    ​
 +std::cout << result->​toString() ​ << std::endl;
 +</​code>​
 +
 +**2.** Polygon union:
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (2 2, 2 4, 5 4, 5 2, 2 2) )") );
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (4 1, 4 3, 7 3, 7 1, 4 1) )") );
 +    ​
 +std::​unique_ptr<​te::​gm::​Geometry>​ result( red->​Union( blue.get() ) );
 +    ​
 +std::cout << result->​toString() ​ << std::endl;
 +</​code>​
 +
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (2 5, 2 7, 5 7, 5 5, 2 5) )") );
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (5 5, 5 7, 8 7, 8 5, 5 5) )") );
 +    ​
 +std::​unique_ptr<​te::​gm::​Geometry>​ result( red->​Union( blue.get() ) );
 +    ​
 +std::cout << result->​toString() ​ << std::endl;
 +</​code>​
 +
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​Geometry>​ red( te::​gm::​WKTReader::​read("​POLYGON ( (9 2, 9 4, 11 4, 11 2, 9 2) )") );
 +std::​unique_ptr<​te::​gm::​Geometry>​ blue( te::​gm::​WKTReader::​read("​POLYGON ( (12 1, 12 3, 15 3, 15 1, 12 1) )") );
 +    ​
 +std::​unique_ptr<​te::​gm::​Geometry>​ result( red->​Union( blue.get() ) );
 +    ​
 +std::cout << result->​toString() ​ << std::endl;
 +</​code>​
 ===== Buffer ===== ===== Buffer =====
  
 +<code cpp>
 +std::​unique_ptr<​te::​gm::​Geometry>​ poly( te::​gm::​WKTReader::​read("​POLYGON ( (6 3, 6 5, 9 5, 9 3, 6 3) )") );
 +
 +std::​unique_ptr<​te::​gm::​Geometry>​ result( poly->​buffer(2.0) );
 +    ​
 +std::cout << result->​toString() ​ << std::endl;
 +</​code>​
 ===== Metric Operators ===== ===== Metric Operators =====