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 16352 : OGRMultiLineString *OGRMultiLineString::clone() const 66 : 67 : { 68 16352 : return new (std::nothrow) OGRMultiLineString(*this); 69 : } 70 : 71 : /************************************************************************/ 72 : /* getGeometryType() */ 73 : /************************************************************************/ 74 : 75 33663 : OGRwkbGeometryType OGRMultiLineString::getGeometryType() const 76 : 77 : { 78 33663 : if ((flags & OGR_G_3D) && (flags & OGR_G_MEASURED)) 79 3056 : return wkbMultiLineStringZM; 80 30607 : else if (flags & OGR_G_MEASURED) 81 256 : return wkbMultiLineStringM; 82 30351 : else if (flags & OGR_G_3D) 83 5639 : return wkbMultiLineString25D; 84 : else 85 24712 : return wkbMultiLineString; 86 : } 87 : 88 : /************************************************************************/ 89 : /* getGeometryName() */ 90 : /************************************************************************/ 91 : 92 2170 : const char *OGRMultiLineString::getGeometryName() const 93 : 94 : { 95 2170 : return "MULTILINESTRING"; 96 : } 97 : 98 : /************************************************************************/ 99 : /* isCompatibleSubType() */ 100 : /************************************************************************/ 101 : 102 : OGRBoolean 103 48320 : OGRMultiLineString::isCompatibleSubType(OGRwkbGeometryType eGeomType) const 104 : { 105 48320 : return wkbFlatten(eGeomType) == wkbLineString; 106 : } 107 : 108 : /************************************************************************/ 109 : /* importFromWkb() */ 110 : /************************************************************************/ 111 : 112 1305 : OGRErr OGRMultiLineString::importFromWkb(const unsigned char *pabyData, 113 : size_t nSize, 114 : OGRwkbVariant eWkbVariant, 115 : size_t &nBytesConsumedOut) 116 : 117 : { 118 1305 : if (nGeomCount == 1 && nSize >= 9 && flags == 0 && pabyData[0] == wkbNDR && 119 3 : memcmp(pabyData + 1, "\x05\x00\x00\x00\x01\x00\x00\x00", 8) == 0) 120 : { 121 : // Optimization to import a Intel-ordered 1-part multilinestring on 122 : // top of an existing 1-part multilinestring, to save dynamic memory 123 : // allocations. 124 3 : const size_t nDataOffset = 9; 125 3 : size_t nBytesConsumedLineString = 0; 126 : // cppcheck-suppress knownConditionTrueFalse 127 3 : if (nSize != static_cast<size_t>(-1)) 128 2 : nSize -= nDataOffset; 129 3 : OGRErr eErr = cpl::down_cast<OGRLineString *>(papoGeoms[0]) 130 3 : ->OGRLineString::importFromWkb( 131 : pabyData + nDataOffset, nSize, eWkbVariant, 132 : nBytesConsumedLineString); 133 3 : if (eErr == OGRERR_NONE) 134 : { 135 2 : nBytesConsumedOut = nDataOffset + nBytesConsumedLineString; 136 : } 137 : else 138 : { 139 1 : empty(); 140 : } 141 3 : return eErr; 142 : } 143 : 144 1302 : return OGRGeometryCollection::importFromWkbInternal( 145 1302 : pabyData, nSize, /*nRecLevel=*/0, eWkbVariant, nBytesConsumedOut); 146 : } 147 : 148 : /************************************************************************/ 149 : /* exportToWkt() */ 150 : /************************************************************************/ 151 : 152 242 : std::string OGRMultiLineString::exportToWkt(const OGRWktOptions &opts, 153 : OGRErr *err) const 154 : 155 : { 156 242 : return exportToWktInternal(opts, err, "LINESTRING"); 157 : } 158 : 159 : /************************************************************************/ 160 : /* hasCurveGeometry() */ 161 : /************************************************************************/ 162 : 163 : OGRBoolean 164 3178 : OGRMultiLineString::hasCurveGeometry(int /* bLookForNonLinear */) const 165 : { 166 3178 : return false; 167 : } 168 : 169 : /************************************************************************/ 170 : /* CastToMultiCurve() */ 171 : /************************************************************************/ 172 : 173 : /** 174 : * \brief Cast to multicurve. 175 : * 176 : * The passed in geometry is consumed and a new one returned. 177 : * 178 : * @param poMLS the input geometry - ownership is passed to the method. 179 : * @return new geometry. 180 : */ 181 : 182 9 : OGRMultiCurve *OGRMultiLineString::CastToMultiCurve(OGRMultiLineString *poMLS) 183 : { 184 9 : OGRMultiCurve *poMLC = new OGRMultiCurve(); 185 9 : TransferMembersAndDestroy(poMLS, poMLC); 186 9 : return poMLC; 187 : }