Esempio n. 1
0
def xyz_json_to_feat(feat_json, fields):
    """ 
    Convert xyz geojson to feature, given fields
    """

    names = fields.names()

    qattrs = list()

    # handle xyz id
    v = feat_json.get(XYZ_ID, "")
    val = QVariant(v)
    qattrs.append([QGS_XYZ_ID, val])

    if QGS_XYZ_ID not in names:
        fields.append(make_field(QGS_XYZ_ID, val))

    props = feat_json.get("properties")
    if isinstance(props, dict):
        rename_special_props(props)  # rename fid in props
        attrs = list(_attrs(props))
        for k, v in attrs:
            val = QVariant(v)
            # if not val.isValid():
            #     val = QVariant("")
            if not val.type() in valid_fieldTypes:
                for cast in [QVariant.Int, QVariant.String]:
                    if val.canConvert(cast):
                        val.convert(cast)
                        break
            if not val.type() in valid_qvariant:
                print_qgis("Invalid type", k, val.typeName())
                continue
            if k not in names:
                fields.append(make_field(k, val))
            qattrs.append([k, val])

    feat = QgsFeature(fields)

    for k, v in qattrs:
        feat.setAttribute(k, v)

    geom = feat_json.get("geometry")
    if geom is not None:
        s = json.dumps(geom)
        geom_ = QgsGeometry.fromWkt(
            ogr.CreateGeometryFromJson(s).ExportToWkt())
        feat.setGeometry(geom_)

    return feat
Esempio n. 2
0
    def _single_feature(feat_json, fields):
        # adapt to existing fields
        feat = QgsFeature()

        names = fields.names()
        if QGS_ID in names: names.remove(QGS_ID)
        names_normal = list(map(normal_field_name, names))
        qattrs = list()

        # handle xyz id
        v = feat_json.get(XYZ_ID, "")
        val = QVariant(v)
        qattrs.append([QGS_XYZ_ID, val])

        if QGS_XYZ_ID not in names:
            fields.append(make_field(QGS_XYZ_ID, val))

        props = feat_json.get("properties")
        if not props is None:
            attrs = list(_attrs(props))
            for k, v in attrs:
                val = QVariant(v)
                if not val.isValid():
                    val = QVariant("")
                # if not val.type() in valid_qvariant:
                if not val.type() in valid_fieldTypes:
                    for cast in [QVariant.Int, QVariant.String]:
                        if val.canConvert(cast):
                            val.convert(cast)
                            break
                if not val.type() in valid_qvariant:
                    print_qgis("Invalid type", k, val.typeName())
                    continue
                if k not in names_normal:
                    k = unique_field_name(k, len(fields))
                    fields.append(make_field(k, val))
                else:
                    idx = names_normal.index(k)
                    k = names[idx]
                qattrs.append([k, val])

            feat.setFields(fields)

        for k, v in qattrs:
            feat.setAttribute(k, v)

        return feat