⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wktwriter.cpp

📁 一个很好的vc底层代码
💻 CPP
字号:
/********************************************************************** * $Id: WKTWriter.cpp,v 1.21 2004/12/08 13:54:43 strk Exp $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2001-2002 Vivid Solutions Inc. * * This is free software; you can redistribute and/or modify it under * the terms of the GNU Lesser General Public Licence as published * by the Free Software Foundation.  * See the COPYING file for more information. * **********************************************************************/#include <geos/io.h>#include <geos/util.h>#include <typeinfo>#include <stdio.h>#define PRINT_Z 0namespace geos {WKTWriter::WKTWriter() {	isFormatted=false;	level=0;	formatter="%f";}WKTWriter::~WKTWriter() {}string WKTWriter::createFormatter(const PrecisionModel* precisionModel) {	// the default number of decimal places is 16, which is sufficient	// to accomodate the maximum precision of a double.    int decimalPlaces = precisionModel->getMaximumSignificantDigits();	string fmt="%.";	char buffer[255];	sprintf(buffer,"%i",decimalPlaces);	fmt.append(buffer);	fmt.append("f");	return fmt;}//string WKTWriter::stringOfChar(char ch, int count) {	//string str="";	//for (int i=0;i<count;i++) str+=ch;	//return string(count, ch);//}string WKTWriter::write(const Geometry *geometry) {	Writer sw;//	try {		writeFormatted(geometry,false,&sw);//	} catch (IOException ex) {//		Assert::shouldNeverReachHere();//	}	string res=sw.toString();	return res;}void WKTWriter::write(const Geometry *geometry, Writer *writer) {	writeFormatted(geometry, false, writer);}string WKTWriter::writeFormatted(const Geometry *geometry) {	Writer *sw=new Writer();//	try {		writeFormatted(geometry, true, sw);//	}catch (IOException ex) {//		Assert::shouldNeverReachHere();//	}	return sw->toString();}void WKTWriter::writeFormatted(const Geometry *geometry, Writer *writer) {	writeFormatted(geometry, true, writer);}void WKTWriter::writeFormatted(const Geometry *geometry, bool isFormatted, Writer *writer) {	this->isFormatted=isFormatted;	formatter=createFormatter(geometry->getPrecisionModel());	appendGeometryTaggedText(geometry, 0, writer);}void WKTWriter::appendGeometryTaggedText(const Geometry *geometry, int level, Writer *writer) {	indent(level, writer);	if (typeid(*geometry)==typeid(Point)) {		Point* point=(Point*)geometry;		appendPointTaggedText(point->getCoordinate(),level,writer,point->getPrecisionModel());	} else if (typeid(*geometry)==typeid(LinearRing)) {		appendLinearRingTaggedText((LinearRing*) geometry, level, writer);	} else if (typeid(*geometry)==typeid(LineString)) {		appendLineStringTaggedText((LineString*)geometry, level, writer);	} else if (typeid(*geometry)==typeid(LinearRing)) {		appendLinearRingTaggedText((LinearRing*)geometry, level, writer);	} else if (typeid(*geometry)==typeid(Polygon)) {		appendPolygonTaggedText((Polygon*)geometry, level, writer);	} else if (typeid(*geometry)==typeid(MultiPoint)) {		appendMultiPointTaggedText((MultiPoint*)geometry, level, writer);	} else if (typeid(*geometry)==typeid(MultiLineString)) {		appendMultiLineStringTaggedText((MultiLineString*)geometry, level, writer);	} else if (typeid(*geometry)==typeid(MultiPolygon)) {		appendMultiPolygonTaggedText((MultiPolygon*)geometry, level, writer);	} else if (typeid(*geometry)==typeid(GeometryCollection)) {		appendGeometryCollectionTaggedText((GeometryCollection*)geometry, level, writer);	} else {//		Assert.shouldNeverReachHere("Unsupported Geometry implementation:" + geometry->getClass());		Assert::shouldNeverReachHere("Unsupported Geometry implementation");	}}voidWKTWriter::appendPointTaggedText(const Coordinate* coordinate, int level,		Writer *writer, const PrecisionModel* precisionModel) {	writer->write("POINT ");	appendPointText(coordinate, level, writer, precisionModel);}void WKTWriter::appendLineStringTaggedText(const LineString *lineString, int level, Writer *writer) {	writer->write("LINESTRING ");	appendLineStringText(lineString, level, false, writer);}/* * Converts a <code>LinearRing</code> to &lt;LinearRing Tagged Text&gt; * format, then appends it to the writer. * * @param  linearRing  the <code>LinearRing</code> to process * @param  writer      the output writer to append to */void WKTWriter::appendLinearRingTaggedText(const LinearRing* linearRing, int level, Writer *writer) {	writer->write("LINEARRING ");	appendLineStringText((LineString*)linearRing, level, false, writer);}void WKTWriter::appendPolygonTaggedText(const Polygon *polygon, int level, Writer *writer) {	writer->write("POLYGON ");	appendPolygonText(polygon, level, false, writer);}void WKTWriter::appendMultiPointTaggedText(const MultiPoint *multipoint, int level, Writer *writer) {	writer->write("MULTIPOINT ");	appendMultiPointText(multipoint, level, writer);}void WKTWriter::appendMultiLineStringTaggedText(const MultiLineString *multiLineString, int level,Writer *writer) {	writer->write("MULTILINESTRING ");	appendMultiLineStringText(multiLineString, level, false, writer);}void WKTWriter::appendMultiPolygonTaggedText(const MultiPolygon *multiPolygon, int level, Writer *writer) {	writer->write("MULTIPOLYGON ");	appendMultiPolygonText(multiPolygon, level, writer);}void WKTWriter::appendGeometryCollectionTaggedText(const GeometryCollection *geometryCollection, int level,Writer *writer) {	writer->write("GEOMETRYCOLLECTION ");	appendGeometryCollectionText(geometryCollection, level, writer);}voidWKTWriter::appendPointText(const Coordinate* coordinate, int level,		Writer *writer,const PrecisionModel* precisionModel) {	if (coordinate==NULL) {		writer->write("EMPTY");	} else {		writer->write("(");		appendCoordinate(coordinate, writer, precisionModel);		writer->write(")");	}}void WKTWriter::appendCoordinate(const Coordinate* coordinate, Writer *writer, const PrecisionModel* precisionModel) {//	Coordinate* externalCoordinate=new Coordinate();//	precisionModel->toExternal(*coordinate, externalCoordinate);	string out="";	out+=writeNumber(coordinate->x);	out+=" ";	out+=writeNumber(coordinate->y);#if PRINT_Z	out+=" ";	out+=writeNumber(coordinate->z);#endif	writer->write(out);//	delete externalCoordinate;}string WKTWriter::writeNumber(double d) {	string out="";	char buffer[255];	sprintf(buffer,formatter.c_str(),d);	out.append(buffer);	out.append("");	return out;}void WKTWriter::appendLineStringText(const LineString *lineString, int level, bool doIndent, Writer *writer) {	if (lineString->isEmpty()) {		writer->write("EMPTY");	} else {		if (doIndent) indent(level, writer);		writer->write("(");		for(int i=0;i<lineString->getNumPoints();i++) {			if (i>0) {				writer->write(", ");				if (i%10==0) indent(level + 2, writer);			}			appendCoordinate(&(lineString->getCoordinateN(i)), writer, lineString->getPrecisionModel());		}		writer->write(")");	}}void WKTWriter::appendPolygonText(const Polygon *polygon, int level, bool indentFirst, Writer *writer) {	if (polygon->isEmpty()) {		writer->write("EMPTY");	} else {		if (indentFirst) indent(level, writer);		writer->write("(");		appendLineStringText(polygon->getExteriorRing(), level, false, writer);		for (int i=0; i<polygon->getNumInteriorRing(); i++) {			writer->write(", ");			const LineString *ls=polygon->getInteriorRingN(i);			appendLineStringText(ls, level + 1, true, writer);		}		writer->write(")");	}}void WKTWriter::appendMultiPointText(const MultiPoint *multiPoint, int level, Writer *writer) {	if (multiPoint->isEmpty()) {		writer->write("EMPTY");	} else {		writer->write("(");		for (int i=0; i<multiPoint->getNumGeometries(); i++) {			if (i > 0) {				writer->write(", ");			}			appendCoordinate(((Point* )multiPoint->getGeometryN(i))->getCoordinate(), writer,							  multiPoint->getPrecisionModel());		}		writer->write(")");	}}void WKTWriter::appendMultiLineStringText(const MultiLineString *multiLineString, int level, bool indentFirst,											Writer *writer) {	if (multiLineString->isEmpty()) {		writer->write("EMPTY");	} else {		int level2=level;		bool doIndent=indentFirst;		writer->write("(");		for (int i=0; i<multiLineString->getNumGeometries();i++) {			if (i>0) {				writer->write(", ");				level2=level+1;				doIndent=true;			}			appendLineStringText((LineString *) multiLineString->getGeometryN(i), level2, doIndent, writer);		}		writer->write(")");	}}void WKTWriter::appendMultiPolygonText(const MultiPolygon *multiPolygon, int level, Writer *writer) {	if (multiPolygon->isEmpty()) {		writer->write("EMPTY");	} else {		int level2=level;		bool doIndent=false;		writer->write("(");		for (int i=0; i<multiPolygon->getNumGeometries();i++) {			if (i>0) {				writer->write(", ");				level2=level+1;				doIndent=true;			}			appendPolygonText((Polygon *) multiPolygon->getGeometryN(i), level2, doIndent, writer);		}		writer->write(")");	}}void WKTWriter::appendGeometryCollectionText(const GeometryCollection *geometryCollection, int level, Writer *writer) {	if (geometryCollection->isEmpty()) {		writer->write("EMPTY");	} else {		int level2=level;		writer->write("(");		for (int i=0; i<geometryCollection->getNumGeometries();i++) {			if (i>0) {				writer->write(", ");				level2=level+1;			}			appendGeometryTaggedText(geometryCollection->getGeometryN(i),level2,writer);		}		writer->write(")");	}}void WKTWriter::indent(int level, Writer *writer) {	if (!isFormatted || level<=0) return;	writer->write("\n");	//writer->write(stringOfChar(' ', INDENT * level));	writer->write(string(INDENT * level, ' '));}}/********************************************************************** * $Log: WKTWriter.cpp,v $ * Revision 1.21  2004/12/08 13:54:43  strk * gcc warnings checked and fixed, general cleanups. * * Revision 1.20  2004/10/21 22:29:54  strk * Indentation changes and some more COMPUTE_Z rules * * Revision 1.19  2004/10/20 17:32:14  strk * Initial approach to 2.5d intersection() * * Revision 1.18  2004/07/19 13:19:31  strk * Documentation fixes * * Revision 1.17  2004/07/07 09:38:12  strk * Dropped WKTWriter::stringOfChars (implemented by std::string). * Dropped WKTWriter default constructor (internally created GeometryFactory). * Updated XMLTester to respect the changes. * Main documentation page made nicer. * * Revision 1.16  2004/07/02 13:28:27  strk * Fixed all #include lines to reflect headers layout change. * Added client application build tips in README. * * Revision 1.15  2004/03/18 10:42:44  ybychkov * "IO" and "Util" upgraded to JTS 1.4 * "Geometry" partially upgraded. * * Revision 1.14  2003/11/07 01:23:42  pramsey * Add standard CVS headers licence notices and copyrights to all cpp and h * files. * * **********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -