77 if ( !PySequence_Check( a0 ) )
79 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"A sequence of QgsPoint, QgsPointXY or array of floats is expected" ).toUtf8().constData() );
85 const int size = PySequence_Size( a0 );
86 QVector< QgsPoint * > pointList;
87 pointList.reserve( size );
90 for (
int i = 0; i < size; ++i )
92 PyObject *value = PySequence_GetItem( a0, i );
95 qDeleteAll( pointList );
97 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Invalid type at index %1." ).arg( i ) .toUtf8().constData() );
102 if ( PySequence_Check( value ) )
104 const int elementSize = PySequence_Size( value );
105 if ( elementSize < 2 || elementSize > 4 )
107 qDeleteAll( pointList );
110 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Invalid sequence size at index %1. Expected an array of 2-4 float values, got %2." ).arg( i ).arg( elementSize ).toUtf8().constData() );
118 PyObject *element = PySequence_GetItem( value, 0 );
121 qDeleteAll( pointList );
123 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Invalid type at index %1." ).arg( i ) .toUtf8().constData() );
129 const double x = PyFloat_AsDouble( element );
130 Py_DECREF( element );
131 if ( PyErr_Occurred() )
133 qDeleteAll( pointList );
140 element = PySequence_GetItem( value, 1 );
143 qDeleteAll( pointList );
146 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Invalid type at index %1." ).arg( i ) .toUtf8().constData() );
152 const double y = PyFloat_AsDouble( element );
153 Py_DECREF( element );
154 if ( PyErr_Occurred() )
156 qDeleteAll( pointList );
163 std::unique_ptr< QgsPoint > point = std::make_unique< QgsPoint >( x, y );
164 if ( elementSize > 2 )
166 element = PySequence_GetItem( value, 2 );
169 qDeleteAll( pointList );
172 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Invalid type at index %1." ).arg( i ) .toUtf8().constData() );
178 const double z = PyFloat_AsDouble( element );
179 Py_DECREF( element );
180 if ( PyErr_Occurred() )
182 qDeleteAll( pointList );
188 point->addZValue( z );
190 if ( elementSize > 3 )
192 element = PySequence_GetItem( value, 3 );
195 qDeleteAll( pointList );
198 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Invalid type at index %1." ).arg( i ) .toUtf8().constData() );
204 const double m = PyFloat_AsDouble( element );
205 Py_DECREF( element );
206 if ( PyErr_Occurred() )
208 qDeleteAll( pointList );
214 point->addMValue( m );
216 pointList.append( point.release() );
221 qDeleteAll( pointList );
229 if ( sipCanConvertToType( value, sipType_QgsPointXY, SIP_NOT_NONE ) )
232 QgsPointXY *p =
reinterpret_cast<QgsPointXY *
>( sipConvertToType( value, sipType_QgsPointXY, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
235 pointList.append(
new QgsPoint( p->
x(), p->
y() ) );
237 sipReleaseType( p, sipType_QgsPointXY, state );
239 else if ( sipCanConvertToType( value, sipType_QgsPoint, SIP_NOT_NONE ) )
242 QgsPoint *p =
reinterpret_cast<QgsPoint *
>( sipConvertToType( value, sipType_QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
245 pointList.append( p->
clone() );
247 sipReleaseType( p, sipType_QgsPoint, state );
258 qDeleteAll( pointList );
261 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Invalid type at index %1. Expected QgsPoint, QgsPointXY or array of floats." ).arg( i ) .toUtf8().constData() );
283 QgsMultiPoint(
const QVector<double> &x,
const QVector<double> &y,
284 const QVector<double> &z = QVector<double>(),
285 const QVector<double> &m = QVector<double>() )
SIP_HOLDGIL;
306 if ( a0 < 0 || a0 >= sipCpp->numGeometries() )
308 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
313 return sipConvertFromType( sipCpp->pointN( a0 ), sipType_QgsPoint, NULL );
327 const QgsPoint *pointN(
int index )
const;
333 bool fromWkt(
const QString &wkt )
override;
334 void clear()
override;
368 SIP_PYOBJECT __repr__();
370 QString wkt = sipCpp->asWkt();
371 if ( wkt.length() > 1000 )
372 wkt = wkt.left( 1000 ) + QStringLiteral(
"..." );
373 QString
str = QStringLiteral(
"<QgsMultiPoint: %1>" ).arg( wkt );
374 sipRes = PyUnicode_FromString(
str.toUtf8().constData() );