TerraLib and TerraView Wiki Page

Geometry

1. Link para documentação do Módulo Geometry.

2. Script CMake:

CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
 
project(curso_terralib_geometry)
 
add_definitions(-DBOOST_ALL_NO_LIB -DBOOST_FILESYSTEM_VERSION=3 -DBOOST_UBLAS_TYPE_CHECK=0 -DBOOST_LOG_DYN_LINK)
 
if(APPLE)
  add_definitions(-ftemplate-depth-1024)
endif()
 
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER MATCHES ".*clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -std=c++11")
endif()
 
find_package(Boost 1.54.0 REQUIRED system chrono timer filesystem)
 
find_package(terralib REQUIRED)
 
include_directories(${Boost_INCLUDE_DIR} ${terralib_INCLUDE_DIRS} ${terralib_DIR})
 
file(GLOB CURSO_SRC_FILES *.cpp)
 
add_executable(curso_terralib_geometry ${CURSO_SRC_FILES})
 
target_link_libraries(curso_terralib_geometry terralib_mod_geometry
                                              ${BOOST_SYSTEM_LIBRARY})

3. Código:

main.cpp
// TerraLib
#include <terralib/common/TerraLib.h>
#include <terralib/geometry/Point.h>
#include <terralib/geometry/LineString.h>
#include <terralib/geometry/LinearRing.h>
#include <terralib/geometry/Polygon.h>
#include <terralib/geometry/WKTReader.h>
 
// STL
#include <iostream>
#include <memory>
 
void op_contains()
{
  {
    //std::unique_ptr<te::gm::LinearRing> anel_vermelho = std::make_unique<te::gm::LinearRing>(5, te::gm::LineStringType, 0);
    std::unique_ptr<te::gm::LinearRing> anel_vermelho( new te::gm::LinearRing(5, te::gm::LineStringType, 0) );
    anel_vermelho->setPoint(0, 1, 2);
    anel_vermelho->setPoint(1, 1, 7);
    anel_vermelho->setPoint(2, 7, 7);
    anel_vermelho->setPoint(3, 7, 2);
    anel_vermelho->setPoint(4, 1, 2);
 
    te::gm::Polygon poligono_vermelho(1, te::gm::PolygonType, 0);
 
    poligono_vermelho.setRingN(0, anel_vermelho.release());
 
 
    //std::unique_ptr<te::gm::LinearRing> anel_azul = std::make_unique<te::gm::LinearRing>(5, te::gm::LineStringType);
    std::unique_ptr<te::gm::LinearRing> anel_azul( new te::gm::LinearRing(5, te::gm::LineStringType) );
    anel_azul->setPoint(0, 2, 3);
    anel_azul->setPoint(1, 2, 6);
    anel_azul->setPoint(2, 6, 6);
    anel_azul->setPoint(3, 6, 3);
    anel_azul->setPoint(4, 2, 3);
 
    te::gm::Polygon poligono_azul(1, te::gm::PolygonType, 0);
 
    poligono_azul.setRingN(0, anel_azul.release());
 
    std::cout << "O poligono Vermelho contem o Azul? " << std::boolalpha << poligono_vermelho.contains(&poligono_azul) << std::endl;
 
  }
 
  {
    std::unique_ptr<te::gm::Geometry> poligono_vermelho( te::gm::WKTReader::read("POLYGON ( (9 2, 9 7, 15 7, 15 2, 9 2) )") );
    std::unique_ptr<te::gm::Geometry> poligono_azul( te::gm::WKTReader::read("POLYGON ( (10 4, 10 7, 14 7, 14 4, 10 4) )") );
 
    std::cout << "O poligono Vermelho contem o Azul? " << std::boolalpha << poligono_vermelho->contains( poligono_azul.get() ) << std::endl;
  }
}
 
void op_within()
{
 
  {
    std::unique_ptr<te::gm::Geometry> poligono_vermelho( te::gm::WKTReader::read("POLYGON ( (2 3, 2 6, 6 6, 6 3, 2 3) )") );
    std::unique_ptr<te::gm::Geometry> poligono_azul( te::gm::WKTReader::read("POLYGON ( (1 2, 1 7, 7 7, 7 2, 1 2) )") );
 
    std::cout << "O poligono Vermelho esta dentro do Azul? " << std::boolalpha << poligono_vermelho->within( poligono_azul.get() ) << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> poligono_vermelho( te::gm::WKTReader::read("POLYGON ( (10 4, 10 7, 14 7, 14 4, 10 4) )") );
    std::unique_ptr<te::gm::Geometry> poligono_azul( te::gm::WKTReader::read("POLYGON ( (9 2, 9 7, 15 7, 15 2, 9 2) )") );
 
    std::cout << "O poligono Vermelho esta dentro do Azul? " << std::boolalpha << poligono_vermelho->within( poligono_azul.get() ) << std::endl;
  }
}
 
void op_touches()
{
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("LINESTRING (1 5, 1 7, 3 7)") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("LINESTRING (3 5, 1 7)") );
 
    std::cout << "A linha Vermelha toca a Azul? " << std::boolalpha << vermelho->touches( azul.get() ) << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("LINESTRING (4 5, 4 7, 6 7)") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("LINESTRING (5 5, 5 8)") );
 
    std::cout << "A linha Vermelha toca a Azul? " << std::boolalpha << vermelho->touches( azul.get() ) << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("LINESTRING (1 3, 3 4)") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("LINESTRING (3 4, 5 3)") );
 
    std::cout << "A linha Vermelha toca a Azul? " << std::boolalpha << vermelho->touches( azul.get() ) << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (1 0, 1 2, 4 2, 4 0, 1 0) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (4 0, 4 2, 7 2, 7 0, 4 0) )") );
 
    std::cout << "O poligono Vermelho toca o Azul? " << std::boolalpha << vermelho->touches( azul.get() ) << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (8 5, 8 7, 11 7, 11 5, 8 5) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (11 6, 13 8, 15 6, 13 4, 11 6) )") );
 
    std::cout << "O poligono Vermelho toca o Azul? " << std::boolalpha << vermelho->touches( azul.get() ) << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (9 1, 9 3, 12 3, 12 1, 9 1) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (11 2, 13 3, 15 2, 13 1, 11 2) )") );
 
    std::cout << "O poligono Vermelho toca o Azul? " << std::boolalpha << vermelho->touches( azul.get() ) << std::endl;
  }
 
}
 
void op_intersection()
{
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (2 2, 2 4, 5 4, 5 2, 2 2) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (4 1, 4 3, 7 3, 7 1, 4 1) )") );
 
    std::unique_ptr<te::gm::Geometry> resultado( vermelho->intersection( azul.get() ) );
 
    std::cout << "Qual o resultado da intersecao entre os poligonos? " << std::boolalpha << resultado->toString()  << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (2 5, 2 7, 5 7, 5 5, 2 5) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (5 5, 5 7, 8 7, 8 5, 5 5) )") );
 
    std::unique_ptr<te::gm::Geometry> resultado( vermelho->intersection( azul.get() ) );
 
    std::cout << "Qual o resultado da intersecao entre os poligonos? " << std::boolalpha << resultado->toString()  << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (9 2, 9 4, 11 4, 11 2, 9 2) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (12 1, 12 3, 15 3, 15 1, 12 1) )") );
 
    std::unique_ptr<te::gm::Geometry> resultado( vermelho->intersection( azul.get() ) );
 
    std::cout << "Qual o resultado da intersecao entre os poligonos? " << std::boolalpha << resultado->toString()  << std::endl;
  }
 
}
 
void op_union()
{
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (2 2, 2 4, 5 4, 5 2, 2 2) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (4 1, 4 3, 7 3, 7 1, 4 1) )") );
 
    std::unique_ptr<te::gm::Geometry> resultado( vermelho->Union( azul.get() ) );
 
    std::cout << "Qual o resultado da uniao dos poligonos? " << std::boolalpha << resultado->toString()  << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (2 5, 2 7, 5 7, 5 5, 2 5) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (5 5, 5 7, 8 7, 8 5, 5 5) )") );
 
    std::unique_ptr<te::gm::Geometry> resultado( vermelho->Union( azul.get() ) );
 
    std::cout << "Qual o resultado da uniao dos poligonos? " << std::boolalpha << resultado->toString()  << std::endl;
  }
 
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (9 2, 9 4, 11 4, 11 2, 9 2) )") );
    std::unique_ptr<te::gm::Geometry> azul( te::gm::WKTReader::read("POLYGON ( (12 1, 12 3, 15 3, 15 1, 12 1) )") );
 
    std::unique_ptr<te::gm::Geometry> resultado( vermelho->Union( azul.get() ) );
 
    std::cout << "Qual o resultado da uniao dos poligonos? " << std::boolalpha << resultado->toString()  << std::endl;
  }
 
}
 
void op_buffer()
{
  {
    std::unique_ptr<te::gm::Geometry> vermelho( te::gm::WKTReader::read("POLYGON ( (6 3, 6 5, 9 5, 9 3, 6 3) )") );
 
    std::unique_ptr<te::gm::Geometry> resultado( vermelho->buffer(2.0) );
 
    std::cout << "Qual o resultado do buffer? " << std::boolalpha << resultado->toString()  << std::endl;
  }
}
 
 
int main(int argc, char* argv[])
{
  TerraLib::getInstance().initialize();
 
  op_contains();
 
  op_within();
 
  op_touches();
 
  op_intersection();
 
  op_union();
 
  op_buffer();
 
  TerraLib::getInstance().finalize();
 
  return EXIT_SUCCESS;
}

4. Opções do CMake:

-DCMAKE_BUILD_TYPE:STRING="Debug"
 
-DCMAKE_PREFIX_PATH:PATH="/home/terralib5/mylibs;/home/terralib5/mylibs/terralib5/lib/cmake"