#include <ogrsf_frmts.h> #include <boost/geometry/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/linestring.hpp> #include <boost/geometry/geometries/polygon.hpp> #include <boost/assign.hpp> BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian); namespace bg = boost::geometry; typedef bg::model::d2::point_xy<double> bg_point; typedef bg::model::ring<bg_point> bg_ring; typedef bg::model::polygon<bg_point> bg_polygon; typedef bg::model::linestring<bg_point> bg_linestring; void point2ogrpoint(OGRPoint& lhs, const bg_point& rhs); void line2ogrline(OGRLineString& lhs, const bg_linestring& rhs); void poly2ogrpoly(OGRPolygon& lhs, const bg_polygon& rhs); bg_point ogrpoint2point( const OGRPoint& rhs ); bg_linestring ogrline2line( const OGRLineString& rhs ); bg_polygon ogrpoly2poly( const OGRPolygon& rhs ); using namespace boost::assign; void point2ogrpoint(OGRPoint& lhs, const bg_point& rhs) { lhs.setX( bg::get<0>(rhs) ); lhs.setY( bg::get<1>(rhs) ); } void line2ogrline(OGRLineString& lhs, const bg_linestring& rhs) { lhs.setNumPoints( rhs.size() ); for( int i = 0; i < rhs.size(); ++i ) { lhs.setPoint( i, bg::get<0>(rhs[i]), bg::get<1>(rhs[i]), 0.0 ); } } void ring2ogrring(OGRLinearRing& lhs, const bg_ring& rhs) { lhs.setNumPoints( rhs.size() ); for( int i = 0; i < rhs.size(); ++i ) { lhs.setPoint( i, bg::get<0>(rhs[i]), bg::get<1>(rhs[i]), 0.0 ); } } void poly2ogrpoly(OGRPolygon& lhs, const bg_polygon& rhs) { { // external ring OGRLinearRing externalRing; ring2ogrring( externalRing, rhs.outer() ); lhs.addRing( &externalRing ); } // internal rings for( int i = 0; i < rhs.inners().size(); ++i ) { OGRLinearRing internalRing; ring2ogrring( internalRing, rhs.inners()[i] ); lhs.addRing( &internalRing ); } } bg_point ogrpoint2point( const OGRPoint& rhs ) { return bg_point( rhs.getX(), rhs.getY() ); } bg_linestring ogrline2line( const OGRLineString& rhs ) { bg_linestring result; for( int i = 0; i < rhs.getNumPoints(); ++i ) { result += bg_point( rhs.getX(i), rhs.getY(i) ); } return result; } bg_ring ogrring2ring( const OGRLinearRing& rhs ) { bg_ring result; for( int i = 0; i < rhs.getNumPoints(); ++i ) { result += bg_point( rhs.getX(i), rhs.getY(i) ); } return result; } bg_polygon ogrpoly2poly( const OGRPolygon& rhs ) { bg_polygon result; result.outer() = ogrring2ring( *(rhs.getExteriorRing()) ); int n = rhs.getNumInteriorRings(); for( int i = 0; i < n; ++i ) { result.inners().push_back( ogrring2ring(*(rhs.getInteriorRing( i ))) ); } return result; }
2012年6月7日木曜日
boost::geometry と gdal/ogr
普通にやるには、GDAL/OGR にて、geos を有効にしてコンパイルすれば何の問題もないです。
単に boost::geometry を使ってみたかっただけという…
concepts ベースで書いてみようかなとも思ったんですが、OGRPolygon あたりの実装を concept で書くのは、自分には無理ゲーっぽいと思ったので相互変換のコードでお茶を濁しました。お陰で、だいぶ geometry の concept についても、わかってきたのですが・・・。このポストが、役に立つ人っているのかいな?という疑問が無いわけでもない…。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿