Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qgeojson.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// Copyright (C) 2018 Julian Sherollari <jdotsh@gmail.com>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
5#include "qgeojson_p.h"
6#include <qvariant.h>
7#include <qjsondocument.h>
8#include <qjsonobject.h>
9#include <qjsonvalue.h>
10#include <qjsonarray.h>
11#include <qgeocoordinate.h>
12#include <qgeocircle.h>
13#include <qgeopath.h>
14#include <qgeopolygon.h>
15#include <qtextstream.h>
16
18
499{
500 QGeoCoordinate returnedCoordinates;
501 const QVariantList positionList = position.value<QVariantList>();
502 for (qsizetype i = 0; i < positionList.size(); ++i) { // Iterating Point coordinates arrays
503 switch (i) {
504 case 0:
505 returnedCoordinates.setLongitude(positionList.at(i).toDouble());
506 break;
507 case 1:
508 returnedCoordinates.setLatitude(positionList.at(i).toDouble());
509 break;
510 case 2:
511 returnedCoordinates.setAltitude(positionList.at(i).toDouble());
512 break;
513 default:
514 break;
515 }
516 }
517 return returnedCoordinates;
518}
519
521{
522 QList<QGeoCoordinate> returnedCoordinates;
523 const QVariantList positionsList = arrayOfPositions.value<QVariantList>();
524 for (const auto &position : positionsList) // Iterating the LineString coordinates nested arrays
525 returnedCoordinates.append(importPosition(position)); // Populating the QList of coordinates
526 return returnedCoordinates;
527}
528
530{
531 QList<QList<QGeoCoordinate>> returnedCoordinates;
532 const QVariantList positionsList = arrayOfArrayofPositions.value<QVariantList>();
533 for (const auto &position : positionsList) // Iterating the Polygon coordinates nested arrays
534 returnedCoordinates << importArrayOfPositions(position);
535 return returnedCoordinates;
536}
537
538static QGeoCircle importPoint(const QVariantMap &inputMap)
539{
540 QGeoCircle returnedObject;
541 QGeoCoordinate center;
542 QVariant valueCoords = inputMap.value(QStringLiteral("coordinates"));
543 center = importPosition(valueCoords);
544 returnedObject.setCenter(center);
545 return returnedObject;
546}
547
548static QGeoPath importLineString(const QVariantMap &inputMap)
549{
550 QGeoPath returnedObject;
551 QList <QGeoCoordinate> coordinatesList;
552 const QVariant valueCoordinates = inputMap.value(QStringLiteral("coordinates"));
553 coordinatesList = importArrayOfPositions(valueCoordinates);
554 returnedObject.setPath(coordinatesList);
555 return returnedObject;
556}
557
558static QGeoPolygon importPolygon(const QVariantMap &inputMap)
559{
560 QGeoPolygon returnedObject;
561 const QVariant valueCoordinates = inputMap.value(QStringLiteral("coordinates"));
562 const QList<QList<QGeoCoordinate>> perimeters = importArrayOfArrayOfPositions(valueCoordinates);
563 for (qsizetype i = 0; i < perimeters.size(); ++i) { // Import an array of QList<QGeocoordinates>
564 if (i == 0)
565 returnedObject.setPerimeter(perimeters.at(i)); // External perimeter
566 else
567 returnedObject.addHole(perimeters.at(i)); // Inner perimeters
568 }
569 return returnedObject;
570}
571
573{
574 QVariantList returnedObject;
575 const QVariantList coordinatesList = inputMap.value(QStringLiteral("coordinates")).value<QVariantList>();
576 QVariantMap singlePointMap;
577 QGeoCircle parsedPoint;
578 for (const auto &coordinate : coordinatesList) { // Iterating MultiPoint coordinates nasted arrays
579 parsedPoint.setCenter(importPosition(coordinate));
580 singlePointMap.insert(QStringLiteral("type"), QStringLiteral("Point"));
581 singlePointMap.insert(QStringLiteral("data"), QVariant::fromValue(parsedPoint));
582 returnedObject.append(QVariant::fromValue(singlePointMap));
583 }
584 return returnedObject;
585}
586
588{
589 QVariantList returnedObject;
590 QGeoPath parsedLineString;
591 const QVariant listCoords = inputMap.value(QStringLiteral("coordinates"));
592 const QVariantList list = listCoords.value<QVariantList>();
593 QVariantMap singleLinestringMap;
594 for (int i = 0; i < list.size(); ++i) { // Iterating the MultiLineString coordinates nasted arrays using importArrayOfPositions
595 singleLinestringMap.clear();
596 const QList <QGeoCoordinate> coordinatesList = importArrayOfPositions(list.at(i));
597 singleLinestringMap.insert(QStringLiteral("type"), QStringLiteral("LineString"));
598 parsedLineString.setPath(coordinatesList);
599 singleLinestringMap.insert(QStringLiteral("data"), QVariant::fromValue(parsedLineString));
600 returnedObject.append(QVariant::fromValue(singleLinestringMap));
601 }
602 return returnedObject;
603}
604
606{
607 QVariantList returnedObject;
608 QGeoPolygon singlePoly;
609 QVariantMap singlePolygonMap;
610 const QVariant valueCoordinates = inputMap.value(QStringLiteral("coordinates"));
611 const QVariantList list = valueCoordinates.value<QVariantList>();
612 for (int i = 0; i < list.size(); ++i) { // Iterating the MultiPolygon coordinates nasted arrays
613 singlePolygonMap.clear();
615
616 for (int j = 0; j < coordinatesList.size(); ++j) {
617 if (j == 0)
618 singlePoly.setPerimeter(coordinatesList.at(j));
619 else
620 singlePoly.addHole(coordinatesList.at(j));
621 }
622 singlePolygonMap.insert(QStringLiteral("type"), QStringLiteral("Polygon"));
623 singlePolygonMap.insert(QStringLiteral("data"), QVariant::fromValue(singlePoly));
624 returnedObject.append(QVariant::fromValue(singlePolygonMap));
625 }
626 return returnedObject;
627}
628
629static QVariantMap importGeometry(const QVariantMap &inputMap); // Function prototype for a tail recursion
630
632{
633 QVariantList returnedObject;
634 const QVariant listGeometries = inputMap.value(QStringLiteral("geometries"));
635 const QVariantList list = listGeometries.value<QVariantList>(); // QVariantList of heterogeneous composition of the other geometry types
636 for (int i = 0; i < list.size(); ++i) {
637 QVariantMap geometryMap = list.at(i).value<QVariantMap>();
638 QVariantMap geoMap = importGeometry(geometryMap);
639 returnedObject.append(geoMap);
640 }
641 return returnedObject;
642}
643
645{
646 QVariantMap returnedObject;
647 QString geometryTypes[] = {
648 QStringLiteral("Point"),
649 QStringLiteral("MultiPoint"),
650 QStringLiteral("LineString"),
651 QStringLiteral("MultiLineString"),
652 QStringLiteral("Polygon"),
653 QStringLiteral("MultiPolygon"),
654 QStringLiteral("GeometryCollection")
655 };
656 enum geoTypeSwitch {
657 Point,
658 MultiPoint,
659 LineString,
660 MultiLineString,
661 Polygon,
662 MultiPolygon,
663 GeometryCollection
664 };
665 for (int i = 0; i<7; ++i) {
666 if (inputMap.value(QStringLiteral("type")).value<QString>() == geometryTypes[i]) {
667 switch (i) {
668 case Point: {
669 returnedObject.insert(QStringLiteral("type"), QStringLiteral("Point"));
670 returnedObject.insert(QStringLiteral("data"), QVariant::fromValue(importPoint(inputMap)));
671 break;
672 }
673 case MultiPoint: {
674 returnedObject.insert(QStringLiteral("type"), QStringLiteral("MultiPoint"));
675 returnedObject.insert(QStringLiteral("data"), QVariant::fromValue(importMultiPoint(inputMap)));
676 break;
677 }
678 case LineString: {
679 returnedObject.insert(QStringLiteral("type"), QStringLiteral("LineString"));
680 returnedObject.insert(QStringLiteral("data"), QVariant::fromValue(importLineString(inputMap)));
681 break;
682 }
683 case MultiLineString: {
684 returnedObject.insert(QStringLiteral("type"), QStringLiteral("MultiLineString"));
685 returnedObject.insert(QStringLiteral("data"), QVariant::fromValue(importMultiLineString(inputMap)));
686 break;
687 }
688 case Polygon: {
689 returnedObject.insert(QStringLiteral("type"), QStringLiteral("Polygon"));
690 returnedObject.insert(QStringLiteral("data"), QVariant::fromValue(importPolygon(inputMap)));
691 break;
692 }
693 case MultiPolygon: {
694 returnedObject.insert(QStringLiteral("type"), QStringLiteral("MultiPolygon"));
695 returnedObject.insert(QStringLiteral("data"), QVariant::fromValue(importMultiPolygon(inputMap)));
696 break;
697 }
698 case GeometryCollection: {
699 returnedObject.insert(QStringLiteral("type"), QStringLiteral("GeometryCollection"));
700 returnedObject.insert(QStringLiteral("data"), QVariant::fromValue(importGeometryCollection(inputMap)));
701 break;
702 }
703 default:
704 break;
705 }
706 }
707 }
708 return returnedObject;
709}
710
712{
713 QVariantList returnedObject;
714 const QVariantList featuresList = inputMap.value(QStringLiteral("features")).value<QVariantList>();
715 for (int i = 0; i < featuresList.size(); ++i) {
716 QVariantMap inputFeatureMap = featuresList.at(i).value<QVariantMap>();
717 QVariantMap singleFeatureMap = importGeometry(inputFeatureMap.value(QStringLiteral("geometry")).value<QVariantMap>());
718 const QVariantMap importedProperties = inputFeatureMap.value(QStringLiteral("properties")).value<QVariantMap>();
719 singleFeatureMap.insert(QStringLiteral("properties"), importedProperties);
720 if (inputFeatureMap.contains(QStringLiteral("id"))) {
721 QVariant importedId = inputFeatureMap.value(QStringLiteral("id")).value<QVariant>();
722 singleFeatureMap.insert(QStringLiteral("id"), importedId);
723 }
724 returnedObject.append(singleFeatureMap);
725 }
726 return returnedObject;
727}
728
729static QJsonValue exportPosition(const QGeoCoordinate &obtainedCoordinates)
730{
731 QJsonValue geoLat = obtainedCoordinates.latitude();
732 QJsonValue geoLong = obtainedCoordinates.longitude();
733 QJsonArray array = {geoLong, geoLat};
734 QJsonValue geoAlt;
735 if (!qIsNaN(obtainedCoordinates.altitude())) {
736 geoAlt = obtainedCoordinates.altitude();
737 array.append(geoAlt);
738 }
739 QJsonValue geoArray = array;
740 return geoArray;
741}
742
743static QJsonValue exportArrayOfPositions(const QList<QGeoCoordinate> &obtainedCoordinatesList)
744{
745 QJsonValue lineCoordinates;
746 QJsonValue multiPosition;
747 QJsonArray arrayPosition;
748 for (int i = 0; i < obtainedCoordinatesList.size(); ++i) {
749 multiPosition = exportPosition(obtainedCoordinatesList.at(i));
750 arrayPosition.append(multiPosition);
751 }
752 lineCoordinates = arrayPosition;
753 return lineCoordinates;
754}
755
757{
758 QJsonValue lineCoordinates;
759 QJsonValue polyCoordinates;
760 QJsonArray arrayPath;
761 for (int i = 0; i < obtainedCoordinates.size(); ++i) {
762 lineCoordinates = exportArrayOfPositions(obtainedCoordinates.at(i));
763 arrayPath.append(lineCoordinates);
764 }
765 polyCoordinates = arrayPath;
766 return polyCoordinates;
767}
768
769static QJsonObject exportPoint(const QVariantMap &pointMap)
770{
771 QJsonObject parsedPoint;
772 QGeoCircle circle = pointMap.value(QStringLiteral("data")).value<QGeoCircle>();
773 parsedPoint.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("Point")));
774 parsedPoint.insert(QStringLiteral("coordinates"), exportPosition(circle.center()));
775 return parsedPoint;
776}
777
778static QJsonObject exportLineString(const QVariantMap &lineStringMap)
779{
780 QJsonObject parsedLineString;
781 QList <QGeoCoordinate> linestringPath = lineStringMap.value(QStringLiteral("data")).value<QGeoPath>().path();
782 parsedLineString.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("LineString")));
783 parsedLineString.insert(QStringLiteral("coordinates"), exportArrayOfPositions(linestringPath));
784 return parsedLineString;
785}
786
787static QJsonObject exportPolygon(const QVariantMap &polygonMap)
788{
789 QVariant polygonVariant = polygonMap.value(QStringLiteral("data"));
790 QJsonObject parsedPolygon;
791 QJsonValue polyCoordinates;
792 QList<QList<QGeoCoordinate>> obtainedCoordinatesPoly;
793 QGeoPolygon parsedPoly = polygonVariant.value<QGeoPolygon>();
794 obtainedCoordinatesPoly << parsedPoly.perimeter();
795 if (parsedPoly.holesCount()!=0)
796 for (int i = 0; i < parsedPoly.holesCount(); ++i) {
797 obtainedCoordinatesPoly << parsedPoly.holePath(i);
798 }
799 polyCoordinates = exportArrayOfArrayOfPositions(obtainedCoordinatesPoly);
800 parsedPolygon.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("Polygon")));
801 parsedPolygon.insert(QStringLiteral("coordinates"), polyCoordinates);
802 return parsedPolygon;
803}
804
805static QJsonObject exportMultiPoint(const QVariantMap &multiPointMap)
806{
807 QJsonObject parsedMultiPoint;
808 QList <QGeoCoordinate> obtainedCoordinatesMP;
809 QVariantList multiCircleVariantList = multiPointMap.value(QStringLiteral("data")).value<QVariantList>();
810 for (const QVariant &exCircleVariantMap: multiCircleVariantList) {
811 obtainedCoordinatesMP << exCircleVariantMap.value<QVariantMap>().value(QStringLiteral("data")).value<QGeoCircle>().center();
812 }
813 QJsonValue multiPosition = exportArrayOfPositions(obtainedCoordinatesMP);
814 parsedMultiPoint.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("MultiPoint")));
815 parsedMultiPoint.insert(QStringLiteral("coordinates"), multiPosition);
816 return parsedMultiPoint;
817}
818
819static QJsonObject exportMultiLineString(const QVariantMap &multiLineStringMap)
820{
821 QJsonObject parsedMultiLineString;
822 QList<QList<QGeoCoordinate>> extractedCoordinatesValue;
823 QVariant multiPathVariant = multiLineStringMap.value(QStringLiteral("data"));
824 QVariantList multiPathList = multiPathVariant.value<QVariantList>();
825 for (int i = 0; i < multiPathList.size(); ++i) {
826 extractedCoordinatesValue << multiPathList.at(i).value<QVariantMap>().value(QStringLiteral("data")).value<QGeoPath>().path();
827 }
828 QJsonValue exportedCoordinatesValue = exportArrayOfArrayOfPositions(extractedCoordinatesValue);
829 parsedMultiLineString.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("MultiLineString")));
830 parsedMultiLineString.insert(QStringLiteral("coordinates"), exportedCoordinatesValue);
831 return parsedMultiLineString;
832}
833
834static QJsonObject exportMultiPolygon(const QVariantMap &multiPolygonMap)
835{
836 QJsonObject parsedMultiPolygon;
837 QJsonValue polyCoordinates;
838 QJsonArray parsedArrayPolygon;
839 QList<QList<QGeoCoordinate>> extractedCoordinatesValue;
840 QVariant multiPolygonVariant = multiPolygonMap.value(QStringLiteral("data"));
841 QVariantList multiPolygonList = multiPolygonVariant.value<QVariantList>();
842 int polyHoles = 0;
843 int currentHole;
844 for (int i = 0; i < multiPolygonList.size(); ++i) { // Start parsing Polygon list
845 extractedCoordinatesValue << multiPolygonList.at(i).value<QVariantMap>().value(QStringLiteral("data")).value<QGeoPolygon>().perimeter(); // Extract external polygon path
846 polyHoles = multiPolygonList.at(i).value<QVariantMap>().value(QStringLiteral("data")).value<QGeoPolygon>().holesCount();
847 if (polyHoles) // Check if the polygon has holes
848 for (currentHole = 0 ; currentHole < polyHoles; currentHole++)
849 extractedCoordinatesValue << multiPolygonList.at(i).value<QVariantMap>().value(QStringLiteral("data")).value<QGeoPolygon>().holePath(currentHole);
850 polyCoordinates = exportArrayOfArrayOfPositions(extractedCoordinatesValue); // Generates QJsonDocument compatible value
851 parsedArrayPolygon.append(polyCoordinates); // Adds one level of nesting in coordinates
852 extractedCoordinatesValue.clear(); // Clears the temporary polygon linear ring storage
853 }
854 QJsonValue exportedCoordinatesNodeValue = parsedArrayPolygon;
855 parsedMultiPolygon.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("MultiPolygon")));
856 parsedMultiPolygon.insert(QStringLiteral("coordinates"), exportedCoordinatesNodeValue);
857 return parsedMultiPolygon;
858}
859
860static QJsonObject exportGeometry(const QVariantMap &geometryMap); // Function prototype
861
862static QJsonObject exportGeometryCollection(const QVariantMap &geometryCollection)
863{
864 QJsonObject parsed;
865 QJsonObject parsedGeometry;
866 QJsonValue valueGeometries;
867 QJsonArray parsedGeometries;
868 QVariantList geometriesList = geometryCollection.value(QStringLiteral("data")).value<QVariantList>();
869 for (int i = 0; i < geometriesList.size(); ++i) {
870 parsedGeometry = exportGeometry(geometriesList.at(i).value<QVariantMap>());
871 valueGeometries = parsedGeometry;
872 parsedGeometries.append(valueGeometries);
873 }
874 QJsonValue exportedGeometriesValue = parsedGeometries;
875 parsed.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("GeometryCollection")));
876 parsed.insert(QStringLiteral("geometries"), exportedGeometriesValue);
877 return parsed;
878}
879
880static QJsonObject exportGeometry(const QVariantMap &geometryMap)
881{
882 QJsonObject exportedGeometry;
883 if (geometryMap.value(QStringLiteral("type")) == QStringLiteral("Point"))
884 exportedGeometry = exportPoint(geometryMap);
885 if (geometryMap.value(QStringLiteral("type")) == QStringLiteral("MultiPoint"))
886 exportedGeometry = exportMultiPoint(geometryMap);
887 if (geometryMap.value(QStringLiteral("type")) == QStringLiteral("LineString"))
888 exportedGeometry = exportLineString(geometryMap);
889 if (geometryMap.value(QStringLiteral("type")) == QStringLiteral("MultiLineString"))
890 exportedGeometry = exportMultiLineString(geometryMap);
891 if (geometryMap.value(QStringLiteral("type")) == QStringLiteral("Polygon"))
892 exportedGeometry = exportPolygon(geometryMap);
893 if (geometryMap.value(QStringLiteral("type")) == QStringLiteral("MultiPolygon"))
894 exportedGeometry = exportMultiPolygon(geometryMap);
895 if (geometryMap.value(QStringLiteral("type")) == QStringLiteral("GeometryCollection"))
896 exportedGeometry = exportGeometryCollection(geometryMap);
897 return exportedGeometry;
898}
899
900static QJsonObject exportFeature(const QVariantMap &featureMap)
901{
902 QJsonObject exportedFeature;
903 QJsonValue geometryNodeValue = QJsonValue(exportGeometry(featureMap));
904 QJsonValue propertiesNodeValue = featureMap.value(QStringLiteral("properties")).value<QVariant>().toJsonValue();
905 QJsonValue idNodeValue = featureMap.value(QStringLiteral("id")).value<QVariant>().toJsonValue();
906 exportedFeature.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("Feature")));
907 exportedFeature.insert(QStringLiteral("geometry"), geometryNodeValue);
908 exportedFeature.insert(QStringLiteral("properties"), propertiesNodeValue);
909 if (!idNodeValue.isNull()) // this value is optional
910 exportedFeature.insert(QStringLiteral("id"), idNodeValue);
911 return exportedFeature;
912}
913
914static QJsonObject exportFeatureCollection(const QVariantMap &featureCollection)
915{
916 QJsonObject exportedFeatureCollection;
917 QJsonArray featureArray;
918 QVariantList featureList = featureCollection.value(QStringLiteral("data")).value<QVariantList>();
919 for (int i = 0; i < featureList.size(); ++i) {
920 featureArray.append(QJsonValue(exportFeature(featureList.at(i).value<QVariantMap>())));
921 }
922 exportedFeatureCollection.insert(QStringLiteral("type"), QJsonValue(QStringLiteral("FeatureCollection")));
923 exportedFeatureCollection.insert(QStringLiteral("features"), QJsonValue(featureArray) );
924 return exportedFeatureCollection;
925}
926
927namespace QGeoJson
928{
929
940{
941 QVariantList returnedList;
942 QJsonObject object = geoJson.object(); // Read json object from imported doc
943 QVariantMap rootGeoJsonObject = object.toVariantMap(); // Extraced map using Qt's API
944 QString geoType[] = {
945 QStringLiteral("Point"),
946 QStringLiteral("MultiPoint"),
947 QStringLiteral("LineString"),
948 QStringLiteral("MultiLineString"),
949 QStringLiteral("Polygon"),
950 QStringLiteral("MultiPolygon"),
951 QStringLiteral("GeometryCollection"),
952 QStringLiteral("Feature"),
953 QStringLiteral("FeatureCollection")
954 };
955 enum geoTypeSwitch {
956 Point,
957 MultiPoint,
958 LineString,
959 MultiLineString,
960 Polygon,
961 MultiPolygon,
962 GeometryCollection,
963 Feature,
964 FeatureCollection
965 };
966 QVariantMap parsedGeoJsonMap;
967
968 // Checking whether the JSON object has a "type" member
969 const QVariant keyVariant = rootGeoJsonObject.value(QStringLiteral("type"));
970 if (!keyVariant.isValid()) {
971 // Type check failed
972 }
973 QString valueType = keyVariant.value<QString>();
974
975 // Checking whether the "type" member has a GeoJSON admitted value
976 for (int i = 0; i < 9; ++i) {
977 if (valueType == geoType[i]) {
978 switch (i) {
979 case Point: {
980 QGeoCircle circle = importPoint(rootGeoJsonObject);
981 QVariant dataNodeValue = QVariant::fromValue(circle);
982 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("Point"));
983 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
984 break;
985 }
986 case MultiPoint: {
987 QVariantList multiCircle = importMultiPoint(rootGeoJsonObject);
988 QVariant dataNodeValue = QVariant::fromValue(multiCircle);
989 QList <QGeoCircle> testlist;
990 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("MultiPoint"));
991 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
992 break;
993 }
994 case LineString: {
995 QGeoPath lineString = importLineString(rootGeoJsonObject);
996 QVariant dataNodeValue = QVariant::fromValue(lineString);
997 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("LineString"));
998 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
999 break;
1000 }
1001 case MultiLineString: {
1002 QVariantList multiLineString = importMultiLineString(rootGeoJsonObject);
1003 QVariant dataNodeValue = QVariant::fromValue(multiLineString);
1004 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("MultiLineString"));
1005 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
1006 break;
1007 }
1008 case Polygon: {
1009 QGeoPolygon poly = importPolygon(rootGeoJsonObject);
1010 QVariant dataNodeValue = QVariant::fromValue(poly);
1011 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("Polygon"));
1012 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
1013 break;
1014 }
1015 case MultiPolygon: {
1016 QVariantList multiPoly = importMultiPolygon(rootGeoJsonObject);
1017 QVariant dataNodeValue = QVariant::fromValue(multiPoly);
1018 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("MultiPolygon"));
1019 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
1020 break;
1021 }
1022 // List of GeoJson geometry objects
1023 case GeometryCollection: {
1024 QVariantList multiGeo = importGeometryCollection(rootGeoJsonObject);
1025 QVariant dataNodeValue = QVariant::fromValue(multiGeo);
1026 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("GeometryCollection"));
1027 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
1028 break;
1029 }
1030 // Single GeoJson geometry object with properties
1031 case Feature: {
1032 parsedGeoJsonMap = importGeometry(rootGeoJsonObject.value(QStringLiteral("geometry")).value<QVariantMap>());
1033 QVariantMap importedProperties = rootGeoJsonObject.value(QStringLiteral("properties")).value<QVariantMap>();
1034 parsedGeoJsonMap.insert(QStringLiteral("properties"), importedProperties);
1035 if (rootGeoJsonObject.contains(QStringLiteral("id"))){
1036 QVariant importedId = rootGeoJsonObject.value(QStringLiteral("id")).value<QVariant>();
1037 parsedGeoJsonMap.insert(QStringLiteral("id"), importedId);
1038 }
1039 break;
1040 }
1041 // Heterogeneous list of GeoJSON geometries with properties
1042 case FeatureCollection: {
1043 QVariantList featCollection = importFeatureCollection(rootGeoJsonObject);
1044 QVariant dataNodeValue = QVariant::fromValue(featCollection);
1045 parsedGeoJsonMap.insert(QStringLiteral("type"), QStringLiteral("FeatureCollection"));
1046 parsedGeoJsonMap.insert(QStringLiteral("data"), dataNodeValue);
1047 break;
1048 }
1049 default:
1050 break;
1051 }
1052 QVariant bboxNodeValue = rootGeoJsonObject.value(QStringLiteral("bbox"));
1053 if (bboxNodeValue.isValid()) {
1054 parsedGeoJsonMap.insert(QStringLiteral("bbox"), bboxNodeValue);
1055 }
1056 returnedList.append(parsedGeoJsonMap);
1057 } else if (i >= 9) {
1058 // Error
1059 break;
1060 }
1061 }
1062 return returnedList;
1063}
1064
1075{
1076 if (geoData.isEmpty())
1077 return QJsonDocument();
1078 QVariantMap exportMap = geoData.at(0).value<QVariantMap>(); // Extracting the QVMap
1079 QJsonObject newObject;
1080 QJsonDocument newDocument;
1081 if (exportMap.contains(QStringLiteral("properties"))) {
1082 newObject = exportFeature(exportMap);
1083 } else {
1084 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("Point")) // Check the value corresponding to the key "Point"
1085 newObject = exportPoint(exportMap);
1086 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("MultiPoint"))
1087 newObject = exportMultiPoint(exportMap);
1088 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("LineString"))
1089 newObject = exportLineString(exportMap);
1090 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("MultiLineString"))
1091 newObject = exportMultiLineString(exportMap);
1092 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("Polygon"))
1093 newObject = exportPolygon(exportMap);
1094 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("MultiPolygon"))
1095 newObject = exportMultiPolygon(exportMap);
1096 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("GeometryCollection"))
1097 newObject = exportGeometryCollection(exportMap);
1098 if (exportMap.value(QStringLiteral("type")) == QStringLiteral("FeatureCollection"))
1099 newObject = exportFeatureCollection(exportMap);
1100 }
1101 if (exportMap.contains((QStringLiteral("bbox")))) {
1102 QJsonArray bboxArray;
1103 QVariantList bboxList = exportMap.value(QStringLiteral("bbox")).value<QVariantList>();
1104 for (int i = 0; i < bboxList.size(); ++i) {
1105 bboxArray.append(QJsonValue(bboxList.at(i).value<double>()));
1106 }
1107 newObject.insert(QStringLiteral("bbox"), QJsonValue(bboxArray));
1108 }
1109 newDocument.setObject(newObject);
1110 return newDocument;
1111}
1112
1113// Functions for toString
1115{
1116 stream << "{ " << QString::number(crd.latitude(), 'f', 3) << ", "
1117 << QString::number(crd.longitude(), 'f', 3) << ", "
1118 << QString::number(crd.altitude(), 'f', 3) << " }";
1119 return stream;
1120}
1121
1123{
1124 switch (shape.type()) {
1125 case QGeoShape::CircleType: {
1126 QGeoCircle circle(shape);
1127 stream << "QGeoCircle(" <<circle.center() << ", "<< QString::number(circle.radius()) << ")";
1128 break;
1129 }
1130 case QGeoShape::PathType: {
1131 QGeoPath path(shape);
1132 stream << "QGeoPath(";
1133 for (auto c: path.path())
1134 stream << c << ", ";
1135 stream << ")";
1136 break;
1137 }
1139 QGeoPolygon poly(shape);
1140 stream << "QGeoPolygon(";
1141 for (auto c: poly.perimeter())
1142 stream << c << ", ";
1143 stream << ")";
1144 break;
1145 }
1146 default:
1147 stream << "QGeoShape(Unknown)";
1148 break;
1149 }
1150 return stream;
1151}
1152
1153
1154static QString printQvariant(const QVariant v, int tabs = 0) {
1155 static constexpr QStringView sTab(u" ");
1156 QString sTabs;
1157 QString res;
1159 for (int i = 0; i< tabs; i++) {
1160 sTabs += sTab;
1161 }
1162 if (v.typeId() == QMetaType::QVariantList) {
1163 stream << sTabs << "[\n";
1164 const QVariantList &l = v.toList();
1165 for (int i = 0; i < l.size(); ++i)
1166 stream << printQvariant(l.at(i), tabs + 1);
1167 stream << sTabs << "]\n";
1168 } else if (v.typeId() == QMetaType::QVariantMap) {
1169 stream << sTabs << "{\n";
1170 const QVariantList &l = v.toList();
1171 const QVariantMap &map = v.toMap();
1172
1173 // Either one or the other are valid
1174 if (!map.keys().isEmpty()) {
1175 // Handle type first, to easy reading
1176 if (map.contains(QStringLiteral("type"))) {
1177 stream << sTabs << sTab << QStringLiteral("type") << " : "
1178 << printQvariant(map[QStringLiteral("type")], tabs + 1).remove(QRegularExpression(QStringLiteral("^[ ]*")));;
1179 }
1180 for (QVariantMap::const_iterator iter = map.begin(); iter != map.end(); ++iter) {
1181 if (iter.key() == QStringLiteral("type"))
1182 continue;
1183 stream << sTabs << sTab << iter.key() << " : " << printQvariant(iter.value(), tabs + 1).remove(QRegularExpression(QStringLiteral("^[ ]*")));;
1184 }
1185 }
1186 for (int i = 0; i < l.size(); ++i)
1187 stream << printQvariant(l.at(i), tabs + 1);
1188 stream << sTabs << "}\n";
1189 } else {
1190 stream << sTabs;
1191 QGeoShape workigGeometry;
1192 if ( v.canConvert<QGeoShape>()) {
1193 workigGeometry = v.value<QGeoShape>();
1194 if (workigGeometry.type() == QGeoShape::CircleType) {
1195 QGeoCircle circle = v.value<QGeoCircle>();
1196 stream << circle<< "\n";
1197 } else if (workigGeometry.type() == QGeoShape::PathType) {
1198 QGeoPath path = v.value<QGeoPath>();
1199 stream << path<< "\n";
1200 } else if (workigGeometry.type() == QGeoShape::PolygonType) {
1201 QGeoPolygon polygon = v.value<QGeoPolygon>();
1202 stream << polygon<< "\n";
1203 }
1204 } else {
1205 if (v.isNull())
1206 stream << "null\n";
1207 else
1208 stream << v.toString() << "\n";
1209 }
1210 }
1211 return res;
1212}
1213
1220 if (geoData.isEmpty())
1221 return QString();
1222 return printQvariant(geoData.first(), 0);
1223}
1224
1225} // namespace QGeoJson
1226
\inmodule QtPositioning
Definition qgeocircle.h:15
void setCenter(const QGeoCoordinate &center)
Sets the center coordinate of this geo circle to center.
QGeoCoordinate center
This property holds the center coordinate for the geo circle.
Definition qgeocircle.h:17
qreal radius
This property holds the circle radius in meters.
Definition qgeocircle.h:18
\inmodule QtPositioning
double longitude
This property holds the longitude in decimal degrees.
double latitude
This property holds the latitude in decimal degrees.
double altitude
This property holds the altitude in meters above sea level.
void setLatitude(double latitude)
Sets the latitude (in decimal degrees) to latitude.
void setLongitude(double longitude)
Sets the longitude (in decimal degrees) to longitude.
void setAltitude(double altitude)
Sets the altitude (meters above sea level) to altitude.
\inmodule QtPositioning
Definition qgeopath.h:16
void setPath(const QList< QGeoCoordinate > &path)
Sets all the elements of the path.
Definition qgeopath.cpp:123
\inmodule QtPositioning
Definition qgeopolygon.h:16
Q_INVOKABLE qsizetype holesCount() const
Returns the number of holes.
const QList< QGeoCoordinate > holePath(qsizetype index) const
Returns a QList<QGeoCoordinate> which represents the hole at index.
void setPerimeter(const QList< QGeoCoordinate > &path)
Sets the perimeter of the polygon based on a list of coordinates path.
QList< QGeoCoordinate > perimeter
Definition qgeopolygon.h:18
Q_INVOKABLE void addHole(const QVariant &holePath)
Sets the holePath for a hole inside the polygon.
\inmodule QtPositioning
Definition qgeoshape.h:17
ShapeType type
This property holds the type of this geo shape.
Definition qgeoshape.h:19
@ PolygonType
Definition qgeoshape.h:35
\inmodule QtCore\reentrant
Definition qjsonarray.h:18
void append(const QJsonValue &value)
Inserts value at the end of the array.
\inmodule QtCore\reentrant
void setObject(const QJsonObject &object)
Sets object as the main object of this document.
QJsonObject object() const
Returns the QJsonObject contained in the document.
\inmodule QtCore\reentrant
Definition qjsonobject.h:20
iterator insert(const QString &key, const QJsonValue &value)
Inserts a new item with the key key and a value of value.
\inmodule QtCore\reentrant
Definition qjsonvalue.h:24
bool isNull() const
Returns true if the value is null.
Definition qjsonvalue.h:71
qsizetype size() const noexcept
Definition qlist.h:386
bool isEmpty() const noexcept
Definition qlist.h:390
T & first()
Definition qlist.h:628
QList< T > toList() const noexcept
Definition qlist.h:716
const_reference at(qsizetype i) const noexcept
Definition qlist.h:429
T value(qsizetype i) const
Definition qlist.h:661
void append(parameter_type t)
Definition qlist.h:441
void clear()
Definition qlist.h:417
iterator insert(const Key &key, const T &value)
Definition qmap.h:687
T value(const Key &key, const T &defaultValue=T()) const
Definition qmap.h:356
bool contains(const Key &key) const
Definition qmap.h:340
void clear()
Definition qmap.h:288
QList< Key > keys() const
Definition qmap.h:382
iterator begin()
Definition qmap.h:597
iterator end()
Definition qmap.h:601
\inmodule QtCore \reentrant
\inmodule QtCore
Definition qstringview.h:76
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:7822
QString & remove(qsizetype i, qsizetype len)
Removes n characters from the string, starting at the given position index, and returns a reference t...
Definition qstring.cpp:3435
\inmodule QtCore
\inmodule QtCore
Definition qvariant.h:64
T value() const &
Definition qvariant.h:511
bool isValid() const
Returns true if the storage type of this variant is not QMetaType::UnknownType; otherwise returns fal...
Definition qvariant.h:707
double toDouble(bool *ok=nullptr) const
Returns the variant as a double if the variant has userType() \l QMetaType::Double,...
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:531
QMap< QString, QString > map
[6]
\inmodule QtLocation \keyword QGeoJson Namespace
QTextStream & operator<<(QTextStream &stream, const QGeoCoordinate &crd)
static QString printQvariant(const QVariant v, int tabs=0)
QJsonDocument exportGeoJson(const QVariantList &geoData)
This method exports the QVariantList geoData, expected to be structured like described in the section...
QVariantList importGeoJson(const QJsonDocument &geoJson)
This method imports the geoJson document, expected to contain valid GeoJSON data, into a QVariantList...
Definition qgeojson.cpp:939
QString toString(const QVariantList &geoData)
This method accepts the QVariantList geoData, structured as described in \l {Importing GeoJSON},...
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter * iter
EGLStreamKHR stream
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qIsNaN(qfloat16 f) noexcept
Definition qfloat16.h:238
static QJsonValue exportArrayOfPositions(const QList< QGeoCoordinate > &obtainedCoordinatesList)
Definition qgeojson.cpp:743
static QVariantList importMultiPoint(const QVariantMap &inputMap)
Definition qgeojson.cpp:572
static QList< QList< QGeoCoordinate > > importArrayOfArrayOfPositions(const QVariant &arrayOfArrayofPositions)
Definition qgeojson.cpp:529
static QVariantList importMultiPolygon(const QVariantMap &inputMap)
Definition qgeojson.cpp:605
static QJsonObject exportFeature(const QVariantMap &featureMap)
Definition qgeojson.cpp:900
static QVariantMap importGeometry(const QVariantMap &inputMap)
Definition qgeojson.cpp:644
static QJsonObject exportPoint(const QVariantMap &pointMap)
Definition qgeojson.cpp:769
static QGeoPolygon importPolygon(const QVariantMap &inputMap)
Definition qgeojson.cpp:558
static QJsonObject exportFeatureCollection(const QVariantMap &featureCollection)
Definition qgeojson.cpp:914
static QGeoCoordinate importPosition(const QVariant &position)
Definition qgeojson.cpp:498
static QGeoCircle importPoint(const QVariantMap &inputMap)
Definition qgeojson.cpp:538
static QVariantList importMultiLineString(const QVariantMap &inputMap)
Definition qgeojson.cpp:587
static QJsonObject exportMultiPolygon(const QVariantMap &multiPolygonMap)
Definition qgeojson.cpp:834
static QJsonObject exportGeometryCollection(const QVariantMap &geometryCollection)
Definition qgeojson.cpp:862
static QJsonObject exportMultiLineString(const QVariantMap &multiLineStringMap)
Definition qgeojson.cpp:819
static QVariantList importGeometryCollection(const QVariantMap &inputMap)
Definition qgeojson.cpp:631
static QJsonObject exportPolygon(const QVariantMap &polygonMap)
Definition qgeojson.cpp:787
static QJsonValue exportArrayOfArrayOfPositions(const QList< QList< QGeoCoordinate > > &obtainedCoordinates)
Definition qgeojson.cpp:756
static QGeoPath importLineString(const QVariantMap &inputMap)
Definition qgeojson.cpp:548
static QList< QGeoCoordinate > importArrayOfPositions(const QVariant &arrayOfPositions)
Definition qgeojson.cpp:520
static QJsonObject exportLineString(const QVariantMap &lineStringMap)
Definition qgeojson.cpp:778
static QJsonObject exportGeometry(const QVariantMap &geometryMap)
Definition qgeojson.cpp:880
static QJsonValue exportPosition(const QGeoCoordinate &obtainedCoordinates)
Definition qgeojson.cpp:729
static QVariantList importFeatureCollection(const QVariantMap &inputMap)
Definition qgeojson.cpp:711
static QJsonObject exportMultiPoint(const QVariantMap &multiPointMap)
Definition qgeojson.cpp:805
GLsizei const GLfloat * v
[13]
GLuint res
const GLubyte * c
GLenum array
GLsizei const GLchar *const * path
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define QStringLiteral(str)
ptrdiff_t qsizetype
Definition qtypes.h:70
QList< int > list
[14]
Definition parser.h:19