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