用gdal打开一个shp文件并读出里面点的坐标,并计算面积。

#include
#include<stdlib.h>
#include
#include
#include
#include"ogrsf_frmts.h"
using namespace std;
extern double getarea(OGRLinearRing *ring);
int main()
{
GDALAllRegister();
GDALDataset lauds;
lauds = (GDALDataset
)GDALOpenEx(“E:/Desktop/national fundamental information/LanduseData/LanduseData/Landuse.shp”, GDAL_OF_VECTOR||GDAL_OF_UPDATE, NULL, NULL, NULL);

if (lauds == NULL)
{
	cout << "open failed\n" << endl;
	exit(1);
}

OGRLayer *laulayer;
laulayer = lauds->GetLayerByName("Landuse");
//laulayer->DeleteField(5);

#if 0
OGRFieldDefn ofield(“area_sum”, OFTReal);
if (laulayer->CreateField(&ofield, TRUE) != OGRERR_NONE)
{
cout << “Creating Name field failed.\n” << endl;
}
#endif

OGRFeature *laufeature;
laulayer->ResetReading();
while ((laufeature=laulayer->GetNextFeature())!=NULL)
{

#if 1
OGRFeatureDefn* laufeaturedf = laulayer->GetLayerDefn();
int ifield;
for (ifield = 0; ifield < laufeaturedf->GetFieldCount(); ifield++)
{
OGRFieldDefn * laufielddf = laufeaturedf->GetFieldDefn(ifield);
if (laufielddf->GetType() == OFTInteger)
cout << laufielddf->GetNameRef() <<":"<< laufeature->GetFieldAsInteger(ifield) << endl;
else if (laufielddf->GetType() == OFTReal)
cout << laufielddf->GetNameRef() <<":"<< laufeature->GetFieldAsDouble(ifield) << endl;
else if (laufielddf->GetType() == OFTString)
cout << laufielddf->GetNameRef() << “:”<GetFieldAsString(ifield) << endl;
else
cout << “else:” << laufeature->GetFieldAsString(ifield);
}
#endif

	double area=0;
	OGRGeometry *laugeometry;
	laugeometry = laufeature->GetGeometryRef();
	if (laugeometry != NULL)
	{
		OGRwkbGeometryType laugeotype = laugeometry->getGeometryType();
		if (laugeotype == wkbPoint)
		{
			OGRPoint *laupoint = (OGRPoint *)laugeometry;
			cout << laupoint->getX() << laupoint->getY() << endl;
		}

		else if (laugeotype == wkbPolygon)
		{
			cout << "polygon" << endl;
			OGRPolygon *laupolygon = (OGRPolygon *)laugeometry->clone();
			OGRLinearRing  *laulr = laupolygon->getExteriorRing();
			area += getarea(laulr);


			if (laupolygon->getNumInteriorRings()) {
				for (int i = 0; i < laupolygon->getNumInteriorRings(); i++)
				{
					OGRLinearRing *laulr = (OGRLinearRing*)laupolygon->getInteriorRing(i);
					area += getarea(laulr);
				}
			}


		}

		else if(laugeotype == wkbMultiPolygon)
		{
			cout << "multipolygon" << endl;
			OGRMultiPolygon *laumltupolygon = (OGRMultiPolygon *)laugeometry;
			OGRPolygon *laupolygon1 = NULL;
			for (int i = 0; i < laumltupolygon->getNumGeometries(); i++)
			{
				laupolygon1 = (OGRPolygon*)laumltupolygon->getGeometryRef(i);
				OGRLinearRing *laulr = (OGRLinearRing*)laupolygon1->getExteriorRing();
				area += getarea(laulr);
				if (laupolygon1->getNumInteriorRings()) {
					for(int i=0;i<laupolygon1->getNumInteriorRings();i++)
					{
						OGRLinearRing *laulr = (OGRLinearRing*)laupolygon1->getInteriorRing(i);
						area += getarea(laulr);
					}
				}
			}
		}
		else cout << "no geometry" << endl;



	}

	
	cout << "areaaaa:\t"<<area<<"\n"<<"end" << "\n"<<endl;

#if 0
laufeature->SetField(“area_sum”, area); // Set fields
laulayer->SetFeature(laufeature);
#endif

	OGRFeature::DestroyFeature(laufeature);
}
cout << "all end" << endl;
GDALClose(lauds);
system("pause");

}

gearea。cpp
#include
#include
#include"ogrsf_frmts.h"
using namespace std;
double getarea(OGRLinearRing ring)
{
double X1, X2, Y1, Y2;
double pi = 3.14159265358979, rou = 206264.8062471, lr = 6378137.0, sr = 6356752.314, one,/
=6.6943800229008E-03,*/two = 6.7394967754790E-03, ji = 6399593.6258640232;
double afa = 1 / 298.257222101;//afa-椭球扁率;;pi-π;rou=p;lr=长半轴;sr=短半轴;one=椭球第一偏心率;two=椭球第二偏心率;ji=极点子午圈曲率半径;
double A, B, C, D, E, lad_, lad, log, log_, s = 0;
one = (pow(lr, 2) - pow(sr, 2)) / (pow(lr, 2));
A = 1 + (3.0 / 6.0)*one + (30.0 / 80.0)*pow(one, 2.0) + (35.0 / 112.0)*pow(one, 3) + (630.0 / 2304.0)*pow(one, 4.0);
B = (1 / 6.0)*one + (15 / 80.0)*pow(one, 2) + (21.0 / 112)*pow(one, 3) + (420.0 / 2304)*pow(one, 4);
C = (3.0 / 80)*pow(one, 2) + (7.0 / 112)*pow(one, 3) + (180.0 / 2304)*pow(one, 4);
D = (1.0 / 112)*pow(one, 3) + (45.0 / 2304)*pow(one, 4);
E = (5.0 / 2304)*pow(one, 4);
int n, i = ring->getNumPoints();

for (n = 0; n < i - 1; n++)
{

	X1 = ring->getX(n + 1)*pi / 180.;
	X2 = ring->getX(n)*pi / 180.;
	Y1 = ring->getY(n + 1)*pi / 180.;
	Y2 = ring->getY(n)*pi / 180.;
	lad = (X2 + X1) / 2.;
	lad_ = 2. * sr*sr*lad;
	log_ = (Y2 - Y1) / 2.;
	log = (Y2 + Y1) / 2.;
	s = s + lad_ * (A*sin(log_)*cos(log) - B * sin(3 * log_)*cos(3 * log) + C * sin(5 * log_)*cos(5 * log) - D * sin(7 * log_)*cos(7 * log) + E * sin(9 * log_)*cos(9 * log));

}
if (n = i - 1)
{
	X1 = ring->getX(0)*pi / 180.;
	X2 = ring->getX(i - 1)*pi / 180.;
	Y1 = ring->getY(0)*pi / 180.;
	Y2 = ring->getY(i - 1)*pi / 180.;
	lad = (X2 + X1) / 2;
	lad_ = 2 * sr*sr*lad;
	log_ = (Y2 - Y1) / 2;
	log = (Y2 + Y1) / 2;
	s += lad_ * (A*sin(log_)*cos(log) - B * sin(3 * log_)*cos(3 * log) + C * sin(5 * log_)*cos(5 * log) - D * sin(7 * log_)*cos(7 * log) + E * sin(9 * log_)*cos(9 * log));

}

return s;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的示例代码,使用GDAL库加载显示shp文件: ```python from osgeo import ogr from osgeo import gdal from osgeo import osr import matplotlib.pyplot as plt # 打开shapefile文件 driver = ogr.GetDriverByName('ESRI Shapefile') shpfile = driver.Open('path/to/your/file.shp', 0) layer = shpfile.GetLayer() # 获取图层的空间参考 spatialRef = layer.GetSpatialRef() print('空间参考:', spatialRef.ExportToWkt()) # 获取图层的范围 extent = layer.GetExtent() print('图层范围:', extent) # 获取图层的投影信息 proj4 = spatialRef.ExportToProj4() print('投影信息:', proj4) # 将图层转换为gdal格式 gdal.SetConfigOption('GDAL_FILENAME_IS_UTF8', 'NO') gdal.SetConfigOption('SHAPE_ENCODING', '') mem_drv = ogr.GetDriverByName('Memory') mem_ds = mem_drv.CreateDataSource('memData') mem_layer = mem_ds.CreateLayer('layer', srs=spatialRef, geom_type=layer.GetGeomType()) # 将原始图层的属性表结构复制到新图层中 layer_def = layer.GetLayerDefn() for i in range(layer_def.GetFieldCount()): field_def = layer_def.GetFieldDefn(i) mem_layer.CreateField(field_def) # 将原始图层中的要素复制到新图层中 for feat in layer: mem_layer.CreateFeature(feat) # 将gdal格式的图层转换为numpy数组 driver = gdal.GetDriverByName('MEM') dst_ds = driver.CreateCopy('', mem_ds, 0) arr = dst_ds.GetRasterBand(1).ReadAsArray() # 显示图层 plt.imshow(arr, cmap='gray') plt.show() ``` 说明: 1. 首先通过ogr打开shp文件,并获取图层的空间参考、范围和投影信息。 2. 然后将图层转换为gdal格式,并将其转换为numpy数组。 3. 最后使用matplotlib库显示数组。 需要注意的是,该示例代码仅适用于包含单一要素类型的shp文件。如果要处理包含多个要素类型的shp文件,需要对代码进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值