当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪GIS中最小外包矩形(MBR)            在GIS中,我们会经常碰到最小外包矩形,MBR。最小外包矩形就是包围图元,平且平行于X轴和Y轴的最小外界矩形。到底这个矩形有什么用,设想一下,一个几何体有很多.........
    ▪jenkins slave windows 64位构建报错      系统版本:win7 64位 旗舰版 软件环境: jdk-7u21-windows-i586.exe apache-ant-1.9.1-bin 报错过程:首先在master端构建,一切正常。将改任务改为slave 端实现报错,报错内容: 主要现象是svn代码检出部分.........
    ▪GDAL坐标转换六参的使用方法      GDAL六参坐标转换是一种二维坐标转换的参数,常在GDALDataset 类中的CPLErr SetGeoTransform( double* padfTransform )使用;下面让我们先来谈论一下二维的仿射变换。 仿射变换变换公式:.........

[1]GIS中最小外包矩形(MBR)
    来源: 互联网  发布时间: 2013-11-19

      在GIS中,我们会经常碰到最小外包矩形,MBR。最小外包矩形就是包围图元,平且平行于X轴和Y轴的最小外界矩形。到底这个矩形有什么用,设想一下,一个几何体有很多顶点,我们要判断一个图形是否包含另一个图形,就要一个个点点判断,这样为大大延长处理的时间。那如果是针对矩形的判断将会见的很多。又比如在空间索引中,作为几何体图形的近似可以加快索引处理的时间。在空间查询中,例如要查找离我当前位置周围最近的几个餐厅。如果没有做空间所以,当然也行,暴力法一个个测试,直到找出所有符合条件的餐厅。有了这个MBR作为索引数据的近似,那么查询的速度也会加快,只不过在创建索引的时候要花一些时间而已。

        既然这个MBR如此重要,本人在之前的代码上不断改进,终于拿出一个比较稳定的版本的最小外包矩形的代码。在此奉献给大家,希望各位也能提出代码中的问题。

头文件如下:

#include <math.h>

#include <algorithm>

using namespace std;

class GEOMETRY_API GeoEnvelope
{
public:
	//默认构造函数
	GeoEnvelope();
	//带参数的构造函数
	GeoEnvelope(double minX,double maxX,double minY,double maxY);
	//拷贝构造函数
	GeoEnvelope(const GeoEnvelope& envelope);
	//用两个坐标点初始化
	GeoEnvelope(GeoCoordinate *coord1,GeoCoordinate *coord2);

	virtual ~GeoEnvelope(void);

	//判断两个最小外包矩形是否相交(计算出在内还在外)
	int InterSects(const GeoEnvelope & otherEvp);
	// 判断矩形是否为空
	bool IsNull(void) const;

	// 获取最小外包矩形的宽度
	double GetWidth(void);

	// 获取最小外界矩形的高度
	double GetHeight(void);

	// 获得矩形的中心点坐标
	GeoCoordinate * Center() const;

	//测试是否包含另一个MBR
	bool Contains(const GeoEnvelope &env);

	//判断一个点是否在该矩形中
	bool Contains(const GeoCoordinate &pt);

	//判断一个点是否在矩形内
	bool IsPointInRect(double x,double y);

	//计算两个矩形相交的部分
	GeoEnvelope* Intersection(const GeoEnvelope& env);

	//计算到另一个MBR的距离
	double DistanceTo(GeoEnvelope &env);

	//计算面积
	double Area();

	//计算周长
	double Perimeter();

	//是否包含这个点
	bool Contains(double x, double y) const;

	//静态函数

	//判断p1,p2构成的矩形和q1,q2构成的矩形是否相交
	static bool Intersects(GeoCoordinate &p1, GeoCoordinate &p2, GeoCoordinate &q1, GeoCoordinate &q2);

public:
	double minX;	//最小外包矩形的最小x值
	double maxX;	//最小外包矩形的最大x值
	double minY;	//最小外包矩形的最小y值
	double maxY;	//最小外包矩形的最大y值
};


实现文件如下所示:

#include "GeoEnvelope.h"

GeoEnvelope::GeoEnvelope()
{
	minX = 0;
	minY = -2;
	maxX = 0;
	maxY = -2;
}

//带参数的构造函数
GeoEnvelope::GeoEnvelope(double minX,double maxX,double minY,double maxY)
{
	//先要比较坐标大小,然后再进行判断
	if (minX > maxX)
	{
		this->minX = maxX;
		this->maxX = minX;
	}
	else
	{
		this->minX = minX;
		this->maxX = maxX;
	}

	if (minY > maxY)
	{
		this->minY = maxY;
		this->maxY = minY;
	}
	else
	{
		this->minY = minY;
		this->maxY = maxY;
	}
}

//拷贝构造函数
GeoEnvelope::GeoEnvelope(const GeoEnvelope& envelope)
{
	this->minX = envelope.minX;
	this->maxX = envelope.maxX;
	this->minY = envelope.minY;
	this->maxY = envelope.maxY;
}

//用两个坐标点初始化
GeoEnvelope::GeoEnvelope(GeoCoordinate *coord1,GeoCoordinate *coord2)
{
	if (coord1->x < coord2->x)
	{
		minX = coord1->x;
		maxX = coord2->x;
	}
	else
	{
		minX = coord2->x;
		maxX = coord1->x;
	}

	if (coord1->y < coord2->y)
	{
		minY = coord1->y;
		maxY = coord2->y;
	}
	else
	{
		minY = coord2->y;
		maxY = coord1->y;
	}
}

//析构函数
GeoEnvelope::~GeoEnvelope(void)
{
}

int GeoEnvelope::InterSects(const GeoEnvelope & otherEvp)
{
	//上下左右四个方向
	if (maxX < otherEvp.minX || minX > otherEvp.maxX ||
		maxY < otherEvp.minY || minY > otherEvp.maxY)
	{
		return 0;
	}

	//四个对角方向
	if (maxX < otherEvp.minX && maxY < otherEvp.minY)
	{
		return 0;
	}
	if (maxX < otherEvp.minX && minY > otherEvp.maxY)
	{
		return 0;
	}

	//在矩形内
	if (minX >= otherEvp.minX && maxX <= otherEvp.maxX &&
		minY >= otherEvp.minY && maxY <= otherEvp.maxY)
	{
		return 1;
	}
	
	return 2;	//相交
}

// 判断矩形是否为空
bool GeoEnvelope::IsNull(void) const
{
	if (maxX < minX || maxY < minY)
	{
		return false;
	} 
	return true;
}

// 获取最小外包矩形的宽度
double GeoEnvelope::GetWidth(void)
{
	if (IsNull())
	{
		return 0;
	}
	return fabs(maxX - minX);
}

// 获取最小外界矩形的高度
double GeoEnvelope::GetHeight(void)
{
	if (IsNull())
	{
		return 0;
	}
	return fabs(maxY - minY);
}

// 获得矩形的中心点坐标
GeoCoordinate * GeoEnvelope::Center() const
{
	if (IsNull())
	{
		return NULL;
	}

	return new GeoCoordinate((minX+maxX)/2,
		(minY+maxY)/2);
}

//测试是否包含另一个MBR
bool GeoEnvelope::Contains(const GeoEnvelope &env)
{
	if (IsNull() || env.IsNull())
	{
		return false;
	}
	return env.minX > minX &&
		env.maxX < maxX &&
		env.minY > minY &&
		env.maxY < maxY;
}

//判断一个点是否在该矩形中
bool GeoEnvelope::Contains(const GeoCoordinate &pt)
{
	if (IsNull())
	{
		return false;
	}

	if (pt.x > minX && pt.x < maxX && pt.y > minY && pt.y < maxY)
	{
		return 1;
	}
	return 0;
}

//在矩形外返回0,否则返回1
bool GeoEnvelope::IsPointInRect(double x,double y)
{
	if (IsNull())
	{
		return false;
	}

	if (x > minX && x < maxX && y > minY && y < maxY)
	{
		return 1;
	}
	return 0;
}

//计算两个矩形相交的部分
GeoEnvelope* GeoEnvelope::Intersection(const GeoEnvelope& env)
{
	if (IsNull() || env.IsNull() || ! InterSects(env)) return new GeoEnvelope();

	double intMinX = minX > env.minX ? minX : env.minX;
	double intMinY = minY > env.minY ? minY : env.minY;
	double intMaxX = maxX < env.maxX ? maxX : env.maxX;
	double intMaxY = maxY < env.maxY ? maxY : env.maxY;
	return new GeoEnvelope(intMinX, intMaxX, intMinY, intMaxY);
}

//计算到另一个MBR的距离
double GeoEnvelope::DistanceTo(GeoEnvelope &env)
{
	//如果相交,距离则为0
	if (InterSects(env))
	{
		return 0;
	}
	double dx = 0;
	if (maxX < env.minX)
	{
		dx = env.minX - maxX;
	}
	if (minX > env.maxX)
	{
		dx = minX - env.maxX;
	}

	double dy = 0;
	if (maxY < env.minY)
	{
		dy = env.minY - maxY;
	}
	if (minY > env.maxY)
	{
		dy = minY - env.maxY;
	}

	//如果其中之一为0,则计算水平或者垂直距离
	if (0.0 == dx)
	{
		return dy;
	}
	if (0.0 == dy)
	{
		return dx;
	}
	return sqrt(dx*dx + dy*dy);
}

//计算面积
double GeoEnvelope::Area()
{
	if (IsNull())
	{
		return 0;
	}
	return GetHeight()*GetWidth();
}

//计算周长
double GeoEnvelope::Perimeter()
{
	if (IsNull())
	{
		return 0;
	}
	return GetWidth()*2 + GetHeight()*2;
}

//测试是否包含
bool GeoEnvelope::Contains(double x, double y) const
{
	if (IsNull()) 
		return false;

	return x >= minX &&
		x <= maxX &&
		y >= minY &&
		y <= maxY;
}

//判断p1,p2构成的矩形和q1,q2构成的矩形是否相交
bool GeoEnvelope::Intersects(GeoCoordinate &p1, GeoCoordinate &p2, GeoCoordinate &q1, GeoCoordinate &q2)
{
	double minq = min(q1.x, q2.x);
	double maxq = max(q1.x, q2.x);
	double minp = min(p1.x, p2.x);
	double maxp = max(p1.x, p2.x);

	if( minp > maxq )
		return false;
	if( maxp < minq )
		return false;

	minq = min(q1.y, q2.y);
	maxq = max(q1.y, q2.y);
	minp = min(p1.y, p2.y);
	maxp = max(p1.y, p2.y);

	if( minp > maxq )
		return false;
	if( maxp < minq )
		return false;
	return true;
}


代码经过测试,希望对大家有用。

作者:zhouxuguang236 发表于2013-6-3 21:42:51 原文链接
阅读:60 评论:0 查看评论

    
[2]jenkins slave windows 64位构建报错
    来源: 互联网  发布时间: 2013-11-19

系统版本:win7 64位 旗舰版

软件环境:

jdk-7u21-windows-i586.exe

apache-ant-1.9.1-bin

报错过程:首先在master端构建,一切正常。将改任务改为slave 端实现报错,报错内容:

主要现象是svn代码检出部分文件后报错。网上搜查无果,最后在群scmeye 尴尬哥的提醒下"检查jvm"。安装的是32位的jdk,虽然java的功能都能用,但是会报错。

重装为64位的jdk。问题解决构建成功


Started by user anonymous
Building remotely on zero in workspace c:\jenkins\workspace\test
Checking out a fresh workspace because there's no workspace at C:\jenkins\workspace\test
Cleaning local Directory .
Checking out http://www.test.cn/svn/00900003/trunk/编码/源代码/statsvn at revision '2013-06-03T16:04:24.539 +0800'
ERROR: Failed to check out http://www.test.cn/svn/00900003/trunk/编码/源代码/statsvn
org.tmatesoft.svn.core.SVNException: svn: E175002: REPORT /svn/00900003/!svn/vcc/default failed
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:379)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:364)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:352)
	at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:708)
	at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.doReport(DAVConnection.java:335)
	at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.runReport(DAVRepository.java:1289)
	at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.update(DAVRepository.java:837)
	at org.tmatesoft.svn.core.internal.wc16.SVNUpdateClient16.update(SVNUpdateClient16.java:507)
	at org.tmatesoft.svn.core.internal.wc16.SVNUpdateClient16.doCheckout(SVNUpdateClient16.java:915)
	at org.tmatesoft.svn.core.internal.wc2.old.SvnOldCheckout.run(SvnOldCheckout.java:19)
	at org.tmatesoft.svn.core.internal.wc2.old.SvnOldCheckout.run(SvnOldCheckout.java:8)
	at org.tmatesoft.svn.core.internal.wc2.SvnOperationRunner.run(SvnOperationRunner.java:20)
	at org.tmatesoft.svn.core.wc2.SvnOperationFactory.run(SvnOperationFactory.java:1235)
	at org.tmatesoft.svn.core.wc2.SvnOperation.run(SvnOperation.java:291)
	at org.tmatesoft.svn.core.wc.SVNUpdateClient.doCheckout(SVNUpdateClient.java:777)
	at hudson.scm.subversion.CheckoutUpdater$1.perform(CheckoutUpdater.java:99)
	at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:153)
	at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:161)
	at hudson.scm.subversion.UpdateUpdater$TaskImpl.perform(UpdateUpdater.java:121)
	at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:153)
	at hudson.scm.SubversionSCM$CheckOutTask.perform(SubversionSCM.java:903)
	at hudson.scm.SubversionSCM$CheckOutTask.invoke(SubversionSCM.java:884)
	at hudson.scm.SubversionSCM$CheckOutTask.invoke(SubversionSCM.java:867)
	at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2387)
	at hudson.remoting.UserRequest.perform(UserRequest.java:118)
	at hudson.remoting.UserRequest.perform(UserRequest.java:48)
	at hudson.remoting.Request$2.run(Request.java:326)
	at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at hudson.remoting.Engine$1$1.run(Engine.java:58)
	at java.lang.Thread.run(Unknown Source)
Caused by: svn: E175002: REPORT /svn/00900003/!svn/vcc/default failed
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:208)
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:154)
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:97)
	... 34 more
Caused by: org.tmatesoft.svn.core.SVNException: svn: E155009: REPORT request failed on '/svn/00900003/!svn/vcc/default'
svn: E155009: Error processing command 'cp-and-translate' in 'C:\jenkins\workspace\test\site\images'
	at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:64)
	at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:51)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection._request(HTTPConnection.java:748)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:373)
	... 33 more
Caused by: svn: E155009: REPORT request failed on '/svn/00900003/!svn/vcc/default'
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:208)
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:154)
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:97)
	at org.tmatesoft.svn.core.SVNErrorMessage.wrap(SVNErrorMessage.java:407)
	... 35 more
Caused by: svn: E155009: Error processing command 'cp-and-translate' in 'C:\jenkins\workspace\test\site\images'
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:208)
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:189)
	at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:141)
	at org.tmatesoft.svn.core.internal.wc.admin.SVNLogRunner.runCommand(SVNLogRunner.java:476)
	at org.tmatesoft.svn.core.internal.wc.admin.SVNLog.run(SVNLog.java:303)
	at org.tmatesoft.svn.core.internal.wc.admin.SVNAdminArea.runLogs(SVNAdminArea.java:586)
	at org.tmatesoft.svn.core.internal.wc.admin.SVNAdminArea.runLogs(SVNAdminArea.java:569)
	at org.tmatesoft.svn.core.internal.wc.SVNUpdateEditor15$SVNDirectoryInfo.runLogs(SVNUpdateEditor15.java:1609)
	at org.tmatesoft.svn.core.internal.wc.SVNUpdateEditor15.closeDir(SVNUpdateEditor15.java:507)
	at org.tmatesoft.svn.core.internal.wc.SVNCancellableEditor.closeDir(SVNCancellableEditor.java:102)
	at org.tmatesoft.svn.core.internal.io.dav.handlers.DAVEditorHandler.endElement(DAVEditorHandler.java:475)
	at org.tmatesoft.svn.core.internal.io.dav.handlers.BasicDAVHandler.endElement(BasicDAVHandler.java:103)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.readData(HTTPConnection.java:869)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.readData(HTTPConnection.java:834)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPRequest.dispatch(HTTPRequest.java:218)
	at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection._request(HTTPConnection.java:460)
	... 34 more
A         qalab.xml
A         .classpath
A         project.properties
A         .project
A         devdoc
A         devdoc\how-to-digg.txt
A         devdoc\svnlog.xsd
A         devdoc\log.dtd
A         site
A         site\style
A         site\style\maven-objectlabkit.css
A         site\news.rss
A         site\dev-forum.xml
A         site\demo
A         site\demo\index.xml
A         site\demo\navigation.xml
A         site\images
AU        site\images\chartExplanation.png
AU        site\images\lavablast.png
FATAL: null
java.lang.NullPointerException
	at java.util.ArrayList.addAll(Unknown Source)
	at hudson.scm.SubversionSCM.checkout(SubversionSCM.java:843)
	at hudson.scm.SubversionSCM.checkout(SubversionSCM.java:781)
	at hudson.model.AbstractProject.checkout(AbstractProject.java:1369)
	at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:676)
	at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:581)
	at hudson.model.Run.execute(Run.java:1576)
	at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
	at hudson.model.ResourceController.execute(ResourceController.java:88)
	at hudson.model.Executor.run(Executor.java:241)

作者:nicaiwa 发表于2013-6-4 13:26:53 原文链接
阅读:0 评论:0 查看评论

    
[3]GDAL坐标转换六参的使用方法
    来源: 互联网  发布时间: 2013-11-19

GDAL六参坐标转换是一种二维坐标转换的参数,常在GDALDataset 类中的CPLErr SetGeoTransform( double* padfTransform )使用;下面让我们先来谈论一下二维的仿射变换。

仿射变换变换公式:

展开形式:

x’,y’为目标坐标,x,y为原始坐标,dx,dy为平移参数。A为存储用于绕(dx,dy)旋转,和x,y方向的拉伸比例参数。

与GDAL坐标转换六参的对应:

double *dfGeoTransform = new double[6];

dfGeoTransform[0] = dx;

dfGeoTransform[1] = a11;

dfGeoTransform[2] = a12;

dfGeoTransform[3] = dy;

dfGeoTransform[4] = a21;

dfGeoTransform[5] = a22;

初始化时,A为2×2的单位矩阵,dx = dy = 0.0;

 即dfGeoTransform[] = {0.0,1.0,0.0,0.0,0.0,1.0};

坐标平移:

dx = dx + xtranslation;

dy = dy + xtranslation;

坐标旋转:

坐标缩放:

下面来个示例:

#include "ogrsf_frmts.h"
#include "stdio.h"
#include <iostream>
#include <string>
using namespace std;

// 定义坐标转换器
class GeoTransform
{
public:
	GeoTransform()
	{
		// 初始化六参数
		dfGeoTransform[0] = 0.0;
		dfGeoTransform[1] = 1.0;
		dfGeoTransform[2] = 0.0;
		dfGeoTransform[3] = 0.0;
		dfGeoTransform[4] = 0.0;
		dfGeoTransform[5] = 1.0;
	}

	~GeoTransform()
	{

	}

	// 设置平移
	void SetTranslate(const double dx, const double dy)
	{
		dfGeoTransform[0] += dx;
		dfGeoTransform[3] += dy;
	}

	// 设置旋转角度
	void SetRotate(const double dangle)
	{
		dfGeoTransform[1] = dfGeoTransform[1] * cos(dangle) 
			+ dfGeoTransform[2] * sin(dangle);
		dfGeoTransform[2] = - dfGeoTransform[1] * sin(dangle) 
			+ dfGeoTransform[2] * cos(dangle);
		dfGeoTransform[4] = dfGeoTransform[4] * cos(dangle) 
			+ dfGeoTransform[5] * sin(dangle);
		dfGeoTransform[5] = - dfGeoTransform[4] * sin(dangle) 
			+ dfGeoTransform[5] * cos(dangle);
	}
	// 设置x,y方向缩放比例
	void SetScale(const double xScale, const double yScale)
	{
		dfGeoTransform[1] = dfGeoTransform[1] * xScale;
		dfGeoTransform[2] = dfGeoTransform[2] * yScale;
		dfGeoTransform[4] = dfGeoTransform[4] * xScale;
		dfGeoTransform[5] = dfGeoTransform[5] * yScale;
	}

	// 转换坐标
	OGRPoint Transform(const double dx, const double dy)
	{
		double x, y;
		x = dfGeoTransform[0]
		+ dx * dfGeoTransform[1] 
		+ dy * dfGeoTransform[2];
		y = dfGeoTransform[3]
		+ dx * dfGeoTransform[4] 
		+ dy * dfGeoTransform[5];

		return OGRPoint(x,y);
	}

private:
	double dfGeoTransform[6];
};

int main()
{
	const char *pszDriverName = "DXF";
	OGRSFDriver *poDriver;

	RegisterOGRDXF();

	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
	CPLSetConfigOption("GDAL_DATA", "G:/gdal-1.9.2/data");
	poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(
		pszDriverName );
	if( poDriver == NULL )
	{
		printf( "%s driver not available.\n", pszDriverName );
		exit( 1 );
	}

	OGRDataSource *poDS;
	poDS = poDriver->CreateDataSource( "out.dxf", NULL );
	if( poDS == NULL )
	{
		printf( "Creation of output file failed.\n" );
		exit( 1 );
	}

	OGRLayer *poLayer;

	poLayer = poDS->CreateLayer( "out", NULL, wkbUnknown, NULL );
	if( poLayer == NULL )
	{
		printf( "Layer creation failed.\n" );
		exit( 1 );
	}

	OGRFeature *poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );

	// 原始矩形
	OGRLinearRing oSquare;
	oSquare.addPoint(2.0,2.0);
	oSquare.addPoint(4.0,2.0);
	oSquare.addPoint(4.0,3.0);
	oSquare.addPoint(2.0,3.0);
	oSquare.closeRings();
	poFeature->SetGeometry( &oSquare );
	if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
	{
		printf( "Failed to create feature in dxffile.\n" );
		exit( 1 );
	}

	// 定义转换器
	GeoTransform geoTransform;
	// 平移
	geoTransform.SetTranslate(2.0,3.0);
	// 旋转
	geoTransform.SetRotate(0.5);
	// 缩放比例
	geoTransform.SetScale(2.0,3.0);

	// 转换坐标之后的矩形
	OGRLinearRing oSquare2;
	oSquare2.addPoint(&geoTransform.Transform(2.0,2.0));
	oSquare2.addPoint(&geoTransform.Transform(4.0,2.0));
	oSquare2.addPoint(&geoTransform.Transform(4.0,3.0));
	oSquare2.addPoint(&geoTransform.Transform(2.0,3.0));
	oSquare2.closeRings();
	poFeature->SetGeometry( &oSquare2 );
	if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
	{
		printf( "Failed to create feature in dxffile.\n" );
		exit( 1 );
	}

	OGRFeature::DestroyFeature( poFeature );

	OGRDataSource::DestroyDataSource( poDS );
}

 

效果:


作者:zhouschina 发表于2013-6-4 13:40:08 原文链接
阅读:84 评论:0 查看评论

    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案 iis7站长之家
▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3