原先的錯誤代碼:
const GeometryFactory *pGeomFactory = GeometryFactory::getDefaultInstance();
const CoordinateSequenceFactory *pCoordFactory = CoordinateArraySequenceFactory::instance();
// 構造
typedef map<int,Geometry*> Polygons;
Polygons plygns;
for (int iVal=0; iVal<nEntities; ++iVal)
{
SHPObject *pObj = SHPReadObject(hShp, iVal);
LinearRing *pRingExt = NULL;
<span style="color:#ff0000;">vector<Geometry*> vecRingInt;</span>
for (int iPart=0; iPart<pObj->nParts; ++iPart)
{
int iBeg = pObj->panPartStart[iPart];
int iEnd = iPart==pObj->nParts-1 ? pObj->nVertices:pObj->panPartStart[iPart+1];
int iSize = iEnd-iBeg;
CoordinateSequence* pCs = pCoordFactory->create(iSize,2);
for (int iCoord=0; iCoord<iSize; ++iCoord)
pCs->setAt(Coordinate(pObj->padfX[iBeg+iCoord], pObj->padfY[iBeg+iCoord]), iCoord);
LinearRing *pRing = pGeomFactory->createLinearRing(pCs);
if (iPart == 0)
pRingExt = pRing;
else
vecRingInt.push_back(pRing);
}
Polygon *pPolygon = pGeomFactory->createPolygon(pRingExt,&vecRingInt);
plygns.insert(make_pair(iVal,pPolygon));
SHPDestroyObject(pObj);
}
// 釋放
for (Polygons::iterator iter=plygns.begin(); iter!=plygns.end(); ++iter)
{
iter->second->getFactory()->destroyGeometry(iter->second);
iter->second = NULL;
}
plygns.clear();
修改後的代碼
const GeometryFactory *pGeomFactory = GeometryFactory::getDefaultInstance();
const CoordinateSequenceFactory *pCoordFactory = CoordinateArraySequenceFactory::instance();
// 構造
typedef map<int,Geometry*> Polygons;
Polygons plygns;
for (int iVal=0; iVal<nEntities; ++iVal)
{
SHPObject *pObj = SHPReadObject(hShp, iVal);
LinearRing *pRingExt = NULL;
<span style="color:#ff0000;">vector<Geometry*> *pRingInt = new vector<Geometry*>;</span>
for (int iPart=0; iPart<pObj->nParts; ++iPart)
{
int iBeg = pObj->panPartStart[iPart];
int iEnd = iPart==pObj->nParts-1 ? pObj->nVertices:pObj->panPartStart[iPart+1];
int iSize = iEnd-iBeg;
CoordinateSequence* pCs = pCoordFactory->create(iSize,2);
for (int iCoord=0; iCoord<iSize; ++iCoord)
pCs->setAt(Coordinate(pObj->padfX[iBeg+iCoord], pObj->padfY[iBeg+iCoord]), iCoord);
LinearRing *pRing = pGeomFactory->createLinearRing(pCs);
if (iPart == 0)
pRingExt = pRing;
else
pRingInt->push_back(pRing);
}
Polygon *pPolygon = pGeomFactory->createPolygon(pRingExt,pRingInt);
plygns.insert(make_pair(iVal,pPolygon));
SHPDestroyObject(pObj);
}
// 釋放
for (Polygons::iterator iter=plygns.begin(); iter!=plygns.end(); ++iter)
{
iter->second->getFactory()->destroyGeometry(iter->second);
iter->second = NULL;
}
plygns.clear();
問題在於,使用createPolygon函數非const的指針參數重載版本爲所有權轉移,內環的vector記得也是指針,而我構造Polygon內環的vector出了作用域就灰飛煙滅了,於是就掛了
PS:這裏的vector是在我的程序申請的內存,卻在geos模塊釋放,表示有點強迫,有空再找找geos有沒有由它申請vector的方法,實在不行就先createEmptyPolygon再addRing吧,或者調用拷貝構造的createPolygon犧牲點效率。。。