zoukankan      html  css  js  c++  java
  • [geos]Geometry基本的几何对象

    读取shp中的点,读取shp中的线,

    (1)读取shp中的多边形,修改属性字段的值。

    类库版本:geos3.6.2,shapelib1.3

    定义类变量:

     GeometryFactory::unique_ptr global_factory;

    构造中初始化

    // Define a precision model using 0,0 as the reference origin
    // and 2.0 as coordinates scale.
    PrecisionModel *pm = new PrecisionModel(1.0, 0, 0);
    
    // Initialize global factory with defined PrecisionModel
    // and a SRID of -1 (undefined).
    global_factory = GeometryFactory::create(pm, -1);
    

    方法体中调用:  

          std::string::size_type pos=pszShapeFile.find('.'); 
    	/*std::string ext=filename.substr(pos==string::npos? pszShapeFile.length():pos+1); */
    
    	std::string tmp=pszShapeFile;
    	std::string dbfname=tmp.replace(tmp.begin()+pos+1,tmp.end(),"dbf");
    	SHPHandle hShp= SHPOpen(pszShapeFile.c_str(), "r");
    	DBFHandle	hDBF = DBFOpen( dbfname.c_str(), "r+b" );
    	if( hDBF == NULL )
    	{
    		return;
    	}
    	int idxCeiling=DBFGetFieldIndex(hDBF,"CeilingZ");
    	int idxFloor=DBFGetFieldIndex(hDBF,"FloorZ");
    	if (idxCeiling==-1)
    	{
    		idxCeiling=DBFAddField(hDBF,"CeilingZ",FTDouble, 10, 4);
    	}
    	if (idxFloor==-1)
    	{
    		idxFloor=DBFAddField(hDBF,"FloorZ",FTDouble, 10, 4);
    	}
    	int nShapeType, nVertices;
    	int nEntities = 0;
    	double* minB = new double[4];
    	double* maxB = new double[4];
    	SHPGetInfo(hShp, &nEntities, &nShapeType, minB, maxB);
    	printf("ShapeType:%d
    ", nShapeType);
    	printf("Number of Rooms: %d
    ", nEntities);
    	if (nShapeType==SHPT_POLYGON ||nShapeType==SHPT_POLYGONZ)
    	{
    		geos::geom::CoordinateArraySequenceFactory csf;
    
    		for (int idx = 0; idx < nEntities;idx++)
    		{
    			std::pair<int, int> pair;
    			cell_residual.resize (num_of_hists, pair);
    			int iShape = idx;
    			SHPObject *obj = SHPReadObject(hShp, iShape);
    
    			int parts = obj->nParts;
    			int verts=obj->nVertices;
    			printf("nParts:%d
    ", parts);
    			printf("nVertices:%d
    ", verts);
    			geos::geom::CoordinateSequence* cs1 = csf.create(verts,2);
    			for (size_t j = 0; j < verts; j++)
    			{
    				double x = obj->padfX[j];
    				double y = obj->padfY[j];
    				cs1->setAt(Coordinate (x,y,0),j);
    			}
    			geos::geom::LinearRing* ring1 = global_factory->createLinearRing(cs1);
    			geos::geom::Geometry* p1 = global_factory->createPolygon(ring1,NULL);
    			//根据房间范围遍历每一个点
    			for (int i=0;i<pcl_t_cloud->points.size();i++)
    			{
    				pcl::PointXYZ pt=pcl_t_cloud->points[i];
    
    				geos::geom::Coordinate coord(pt.x,pt.y,0);
    				geos::geom::Geometry* pt_g=global_factory->createPoint(coord);
    				bool flag=p1->contains(pt_g);
    				if (flag)
    				{
    					int indx=floor((pt.z-minPt.z)/interval);
    					if (indx<num_of_hists)
    					{
    						cell_residual[indx].first = indx;
    						int ptscount=cell_residual[indx].second;
    						cell_residual[indx].second = ptscount+1;
    					}
    				}
    			}
    			//排序高度数组
    			std::sort (cell_residual.begin (), cell_residual.end (), comparePair2);
    			//得到最大和最小值,统计数目最多的两个
    			double minZ=cell_residual[num_of_hists-2].first*interval + minPt.z;
    			double maxZ=cell_residual[num_of_hists-1].first*interval + minPt.z;
    			//赋值2个属性
    			DBFWriteDoubleAttribute(hDBF, iShape ,idxCeiling,std::min(minZ,maxZ) );
    			DBFWriteDoubleAttribute(hDBF, iShape ,idxFloor,std::max(minZ,maxZ) );
    			cell_residual.clear();
    		}
    		
    	}
    	DBFClose( hDBF );
    	SHPClose(hShp);
    

      

  • 相关阅读:
    【CLR Via C#】2 程序集
    值类型与引用类型
    .Net Framework简介
    【CLR Via C#】15 枚举类型与位类型
    Dictionary的用法及用途
    枚举
    GitExtensions使用教程
    Bootstrap如何禁止响应式布局
    【StyleCop】StyleCop规则汇总
    优化SQL查询:如何写出高性能SQL语句
  • 原文地址:https://www.cnblogs.com/yhlx125/p/7753445.html
Copyright © 2011-2022 走看看