Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: The OGRMultiLineString class. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 1999, Frank Warmerdam 9 : * Copyright (c) 2008-2013, Even Rouault <even dot rouault at spatialys.com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #include "cpl_port.h" 15 : #include "ogr_geometry.h" 16 : 17 : #include <cstddef> 18 : 19 : #include "cpl_error.h" 20 : #include "ogr_core.h" 21 : #include "ogr_p.h" 22 : 23 : /************************************************************************/ 24 : /* OGRMultiLineString( const OGRMultiLineString& ) */ 25 : /************************************************************************/ 26 : 27 : /** 28 : * \brief Copy constructor. 29 : * 30 : * Note: before GDAL 2.1, only the default implementation of the constructor 31 : * existed, which could be unsafe to use. 32 : * 33 : * @since GDAL 2.1 34 : */ 35 : 36 : OGRMultiLineString::OGRMultiLineString(const OGRMultiLineString &) = default; 37 : 38 : /************************************************************************/ 39 : /* operator=( const OGRMultiCurve&) */ 40 : /************************************************************************/ 41 : 42 : /** 43 : * \brief Assignment operator. 44 : * 45 : * Note: before GDAL 2.1, only the default implementation of the operator 46 : * existed, which could be unsafe to use. 47 : * 48 : * @since GDAL 2.1 49 : */ 50 : 51 : OGRMultiLineString & 52 5 : OGRMultiLineString::operator=(const OGRMultiLineString &other) 53 : { 54 5 : if (this != &other) 55 : { 56 4 : OGRMultiCurve::operator=(other); 57 : } 58 5 : return *this; 59 : } 60 : 61 : /************************************************************************/ 62 : /* clone() */ 63 : /************************************************************************/ 64 : 65 16353 : OGRMultiLineString *OGRMultiLineString::clone() const 66 : 67 : { 68 16353 : auto ret = new (std::nothrow) OGRMultiLineString(*this); 69 16353 : if (ret) 70 : { 71 16353 : if (ret->WkbSize() != WkbSize()) 72 : { 73 0 : delete ret; 74 0 : ret = nullptr; 75 : } 76 : } 77 16353 : return ret; 78 : } 79 : 80 : /************************************************************************/ 81 : /* getGeometryType() */ 82 : /************************************************************************/ 83 : 84 33672 : OGRwkbGeometryType OGRMultiLineString::getGeometryType() const 85 : 86 : { 87 33672 : if ((flags & OGR_G_3D) && (flags & OGR_G_MEASURED)) 88 3056 : return wkbMultiLineStringZM; 89 30616 : else if (flags & OGR_G_MEASURED) 90 256 : return wkbMultiLineStringM; 91 30360 : else if (flags & OGR_G_3D) 92 5631 : return wkbMultiLineString25D; 93 : else 94 24729 : return wkbMultiLineString; 95 : } 96 : 97 : /************************************************************************/ 98 : /* getGeometryName() */ 99 : /************************************************************************/ 100 : 101 2175 : const char *OGRMultiLineString::getGeometryName() const 102 : 103 : { 104 2175 : return "MULTILINESTRING"; 105 : } 106 : 107 : /************************************************************************/ 108 : /* isCompatibleSubType() */ 109 : /************************************************************************/ 110 : 111 : OGRBoolean 112 50442 : OGRMultiLineString::isCompatibleSubType(OGRwkbGeometryType eGeomType) const 113 : { 114 50442 : return wkbFlatten(eGeomType) == wkbLineString; 115 : } 116 : 117 : /************************************************************************/ 118 : /* importFromWkb() */ 119 : /************************************************************************/ 120 : 121 1305 : OGRErr OGRMultiLineString::importFromWkb(const unsigned char *pabyData, 122 : size_t nSize, 123 : OGRwkbVariant eWkbVariant, 124 : size_t &nBytesConsumedOut) 125 : 126 : { 127 1305 : if (nGeomCount == 1 && nSize >= 9 && flags == 0 && pabyData[0] == wkbNDR && 128 3 : memcmp(pabyData + 1, "\x05\x00\x00\x00\x01\x00\x00\x00", 8) == 0) 129 : { 130 : // Optimization to import a Intel-ordered 1-part multilinestring on 131 : // top of an existing 1-part multilinestring, to save dynamic memory 132 : // allocations. 133 3 : const size_t nDataOffset = 9; 134 3 : size_t nBytesConsumedLineString = 0; 135 : // cppcheck-suppress knownConditionTrueFalse 136 3 : if (nSize != static_cast<size_t>(-1)) 137 2 : nSize -= nDataOffset; 138 3 : OGRErr eErr = cpl::down_cast<OGRLineString *>(papoGeoms[0]) 139 3 : ->OGRLineString::importFromWkb( 140 : pabyData + nDataOffset, nSize, eWkbVariant, 141 : nBytesConsumedLineString); 142 3 : if (eErr == OGRERR_NONE) 143 : { 144 2 : nBytesConsumedOut = nDataOffset + nBytesConsumedLineString; 145 : } 146 : else 147 : { 148 1 : empty(); 149 : } 150 3 : return eErr; 151 : } 152 : 153 1302 : return OGRGeometryCollection::importFromWkbInternal( 154 1302 : pabyData, nSize, /*nRecLevel=*/0, eWkbVariant, nBytesConsumedOut); 155 : } 156 : 157 : /************************************************************************/ 158 : /* exportToWkt() */ 159 : /************************************************************************/ 160 : 161 242 : std::string OGRMultiLineString::exportToWkt(const OGRWktOptions &opts, 162 : OGRErr *err) const 163 : 164 : { 165 242 : return exportToWktInternal(opts, err, "LINESTRING"); 166 : } 167 : 168 : /************************************************************************/ 169 : /* hasCurveGeometry() */ 170 : /************************************************************************/ 171 : 172 : OGRBoolean 173 3181 : OGRMultiLineString::hasCurveGeometry(int /* bLookForNonLinear */) const 174 : { 175 3181 : return false; 176 : } 177 : 178 : /************************************************************************/ 179 : /* CastToMultiCurve() */ 180 : /************************************************************************/ 181 : 182 : /** 183 : * \brief Cast to multicurve. 184 : * 185 : * The passed in geometry is consumed and a new one returned. 186 : * 187 : * @param poMLS the input geometry - ownership is passed to the method. 188 : * @return new geometry. 189 : */ 190 : 191 9 : OGRMultiCurve *OGRMultiLineString::CastToMultiCurve(OGRMultiLineString *poMLS) 192 : { 193 9 : OGRMultiCurve *poMLC = new OGRMultiCurve(); 194 9 : TransferMembersAndDestroy(poMLS, poMLC); 195 9 : return poMLC; 196 : }