int GetRCCoordinate(LPCSTR pszKeyName, int nDefault, int nMaxVal) { char strVal[MAX_LINE_LENGTH]; if (!GetRCString(pszKeyName, strVal, NULL, MAX_LINE_LENGTH)) { return nDefault; } return ParseCoordinate(strVal, nDefault, nMaxVal); }
OGRGeometry* KMLNode::getGeometry(Nodetype eType) { unsigned int nCount, nCount2, nCountP; OGRGeometry* poGeom = NULL; KMLNode* poCoor = NULL; Coordinate* psCoord = NULL; if (sName_.compare("Point") == 0) { // Search coordinate Element for(nCount = 0; nCount < pvpoChildren_->size(); nCount++) { if((*pvpoChildren_)[nCount]->sName_.compare("coordinates") == 0) { poCoor = (*pvpoChildren_)[nCount]; for(nCountP = 0; nCountP < poCoor->pvsContent_->size(); nCountP++) { psCoord = ParseCoordinate((*poCoor->pvsContent_)[nCountP]); if(psCoord != NULL) { if (psCoord->bHasZ) poGeom = new OGRPoint(psCoord->dfLongitude, psCoord->dfLatitude, psCoord->dfAltitude); else poGeom = new OGRPoint(psCoord->dfLongitude, psCoord->dfLatitude); delete psCoord; return poGeom; } } } } poGeom = new OGRPoint(); } else if (sName_.compare("LineString") == 0) { // Search coordinate Element poGeom = new OGRLineString(); for(nCount = 0; nCount < pvpoChildren_->size(); nCount++) { if((*pvpoChildren_)[nCount]->sName_.compare("coordinates") == 0) { poCoor = (*pvpoChildren_)[nCount]; for(nCountP = 0; nCountP < poCoor->pvsContent_->size(); nCountP++) { psCoord = ParseCoordinate((*poCoor->pvsContent_)[nCountP]); if(psCoord != NULL) { if (psCoord->bHasZ) ((OGRLineString*)poGeom)->addPoint(psCoord->dfLongitude, psCoord->dfLatitude, psCoord->dfAltitude); else ((OGRLineString*)poGeom)->addPoint(psCoord->dfLongitude, psCoord->dfLatitude); delete psCoord; } } } } } else if (sName_.compare("Polygon") == 0) { //********************************* // Search outerBoundaryIs Element //********************************* poGeom = new OGRPolygon(); for(nCount = 0; nCount < pvpoChildren_->size(); nCount++) { if((*pvpoChildren_)[nCount]->sName_.compare("outerBoundaryIs") == 0 && (*pvpoChildren_)[nCount]->pvpoChildren_->size() > 0) { poCoor = (*(*pvpoChildren_)[nCount]->pvpoChildren_)[0]; } } // No outer boundary found if(poCoor == NULL) { return poGeom; } // Search coordinate Element OGRLinearRing* poLinearRing = NULL; for(nCount = 0; nCount < poCoor->pvpoChildren_->size(); nCount++) { if((*poCoor->pvpoChildren_)[nCount]->sName_.compare("coordinates") == 0) { for(nCountP = 0; nCountP < (*poCoor->pvpoChildren_)[nCount]->pvsContent_->size(); nCountP++) { psCoord = ParseCoordinate((*(*poCoor->pvpoChildren_)[nCount]->pvsContent_)[nCountP]); if(psCoord != NULL) { if (poLinearRing == NULL) { poLinearRing = new OGRLinearRing(); } if (psCoord->bHasZ) poLinearRing->addPoint(psCoord->dfLongitude, psCoord->dfLatitude, psCoord->dfAltitude); else poLinearRing->addPoint(psCoord->dfLongitude, psCoord->dfLatitude); delete psCoord; } } } } // No outer boundary coordinates found if(poLinearRing == NULL) { return poGeom; } ((OGRPolygon*)poGeom)->addRingDirectly(poLinearRing); poLinearRing = NULL; //********************************* // Search innerBoundaryIs Elements //********************************* for(nCount2 = 0; nCount2 < pvpoChildren_->size(); nCount2++) { if((*pvpoChildren_)[nCount2]->sName_.compare("innerBoundaryIs") == 0) { if (poLinearRing) ((OGRPolygon*)poGeom)->addRingDirectly(poLinearRing); poLinearRing = NULL; if ((*pvpoChildren_)[nCount2]->pvpoChildren_->size() == 0) continue; poLinearRing = new OGRLinearRing(); poCoor = (*(*pvpoChildren_)[nCount2]->pvpoChildren_)[0]; // Search coordinate Element for(nCount = 0; nCount < poCoor->pvpoChildren_->size(); nCount++) { if((*poCoor->pvpoChildren_)[nCount]->sName_.compare("coordinates") == 0) { for(nCountP = 0; nCountP < (*poCoor->pvpoChildren_)[nCount]->pvsContent_->size(); nCountP++) { psCoord = ParseCoordinate((*(*poCoor->pvpoChildren_)[nCount]->pvsContent_)[nCountP]); if(psCoord != NULL) { if (psCoord->bHasZ) poLinearRing->addPoint(psCoord->dfLongitude, psCoord->dfLatitude, psCoord->dfAltitude); else poLinearRing->addPoint(psCoord->dfLongitude, psCoord->dfLatitude); delete psCoord; } } } } } } if (poLinearRing) ((OGRPolygon*)poGeom)->addRingDirectly(poLinearRing); } else if (sName_.compare("MultiGeometry") == 0) { if (eType == MultiPoint) poGeom = new OGRMultiPoint(); else if (eType == MultiLineString) poGeom = new OGRMultiLineString(); else if (eType == MultiPolygon) poGeom = new OGRMultiPolygon(); else poGeom = new OGRGeometryCollection(); for(nCount = 0; nCount < pvpoChildren_->size(); nCount++) { OGRGeometry* poSubGeom = (*pvpoChildren_)[nCount]->getGeometry(); if (poSubGeom) ((OGRGeometryCollection*)poGeom)->addGeometryDirectly(poSubGeom); } } return poGeom; }