function TranslateLayer($hSrcDS, $hSrcLayer, $hDstDS, $amAttributeIn)
{
    /* -------------------------------------------------------------------- */
    /*      Create the layer.                                               */
    /* -------------------------------------------------------------------- */
    if (!OGR_DS_TestCapability($hDstDS, ODsCCreateLayer)) {
        printf("%s data source does not support layer creation.\n", OGR_DS_GetName($hDstDS));
        return OGRERR_FAILURE;
    }
    $hFDefn = OGR_L_GetLayerDefn($hSrcLayer);
    /* MapInfo data sources are created with one empty layer corresponding 
       to the $strFname that was passed to the OGR_Dr_CreateDataSource() call.
       Fetch this layer handle now. */
    $hDstLayer = OGR_DS_GetLayer($hDstDS, 0);
    if ($hDstLayer == NULL) {
        return FALSE;
    }
    $iFieldCount = OGR_FD_GetFieldCount($hFDefn);
    printf("field count =%d\n", $iFieldCount);
    /* -------------------------------------------------------------------- */
    /*      Add fields.                                                     */
    /* -------------------------------------------------------------------- */
    for ($iField = 0; $iField < $iFieldCount; $iField++) {
        if (OGR_L_CreateField($hDstLayer, OGR_FD_GetFieldDefn($hFDefn, $iField), 0) != OGRERR_NONE) {
            return FALSE;
        }
    }
    /* -------------------------------------------------------------------- */
    /*      Transfer features.                                              */
    /* -------------------------------------------------------------------- */
    OGR_L_ResetReading($hSrcLayer);
    while (($hFeature = OGR_L_GetNextFeature($hSrcLayer)) != NULL) {
        $hDstFeature = OGR_F_Create(OGR_L_GetLayerDefn($hDstLayer));
        /* Verify if the current feature is corresponding to the feature
           to update the attribute to. If yes, the value corresponding to
           the attribute name selected is substituted. All other attributes
           and geometry are copied as is.  If not, the source feature
           is copied to the destination feature as is.*/
        if ($amAttributeIn && OGR_F_GetFID($hFeature) == $amAttributeIn[0]) {
            for ($i = 0; $i < $iFieldCount; $i++) {
                $hCurrentFieldDefn = OGR_F_GetFieldDefnRef($hFeature, $i);
                $strCurrentFieldName = OGR_FLD_GetNameRef($hCurrentFieldDefn);
                if ($strCurrentFieldName == $amAttributeIn[1]) {
                    $value = $amAttributeIn[2];
                } else {
                    $value = OGR_F_GetFieldAsString($hFeature, $i);
                }
                OGR_F_SetFieldString($hDstFeature, $i, $value);
            }
            $hGeometry = OGR_F_GetGeometryRef($hFeature);
            OGR_F_SetGeometry($hDstFeature, $hGeometry);
        } else {
            if (OGR_F_SetFrom($hDstFeature, $hFeature, FALSE) != OGRERR_NONE) {
                OGR_F_Destroy($hFeature);
                printf("Unable to translate feature %d from layer %s.\n", OGR_F_GetFID($hFeature), OGR_FD_GetName($hFDefn));
                return FALSE;
            }
        }
        OGR_F_Destroy($hFeature);
        if (OGR_L_CreateFeature($hDstLayer, $hDstFeature) != OGRERR_NONE) {
            OGR_F_Destroy($hDstFeature);
            return FALSE;
        }
        OGR_F_Destroy($hDstFeature);
    }
    return TRUE;
}
예제 #2
0
 /**
  * Return layer definition string
  * reads either *.msl file with same base name as data file
  *   or default polygon/line/point.lyr file from plugin dir
  * @return string $layerString
  */
 protected function getLayerDefinition($connParams, $layerSpatialType)
 {
     $ogrDBConn = false;
     if ($connParams['type'] == "generic") {
         $ogrConnectionStr = $this->data_path_prefix . $connParams['layer'];
         //error_log($ogrConnectionStr);
         // $layerDefFile = dirname(__FILE__) . "/" . $connParams['layer'] . ".msl";   ## swap comment if layer definition file in plugin dir
         $layerDefFile = $ogrConnectionStr . ".msl";
     } else {
         $ogrConnectionStr = "PG: " . $connParams['connection'];
         $layerDefFile = dirname(__FILE__) . "/layerdefinition/" . $connParams['schema'] . "." . $connParams['layer'] . ".msl";
         //$layerDefFile = dirname(__FILE__) . "/layerdefinition/" . $connParams['layer'] . ".msl";
     }
     if ($layerSpatialType == "vector") {
         if (!file_exists($ogrConnectionStr) && $connParams['type'] == "generic") {
             error_log($ogrConnectionStr . " does not exist.");
             return null;
         }
         // Register all drivers
         OGRRegisterAll();
         // Open data source
         $hSFDriver = NULL;
         $hDatasource = OGROpen($ogrConnectionStr, 0, $hSFDriver);
         if (!$hDatasource) {
             error_log("Unable to open %s\n" . $ogrConnectionStr);
             return 0;
         }
         if ($connParams['type'] == "generic") {
             $hLayer = OGR_DS_GetLayer($hDatasource, 0);
         } else {
             $hLayer = OGR_DS_GetLayerByName($hDatasource, $connParams['schema'] . "." . $connParams['layer']);
         }
         /* Dump info about this layer */
         $hLayerDefn = OGR_L_GetLayerDefn($hLayer);
         $hFeature = OGR_L_GetNextFeature($hLayer);
         if (OGR_F_GetGeometryRef($hFeature) != NULL) {
             $hGeom = OGR_F_GetGeometryRef($hFeature);
             //$geomType = OGR_G_GetGeometryType($hGeom);
             $geomNameOGR = OGR_G_GetGeometryName($hGeom);
         }
         /* Close data source */
         OGR_DS_Destroy($hDatasource);
         /*$geomList[1] = "point";
           $geomList[2] = "line";
           $geomList[3] = "polygon";
           $geomList[6] = "polygon";*/
         $geomList["POINT"] = "point";
         $geomList["MULTIPOINT"] = "point";
         $geomList["LINESTRING"] = "line";
         $geomList["MULTILINESTRING"] = "line";
         $geomList["POLYGON"] = "polygon";
         $geomList["MULTIPOLYGON"] = "polygon";
         //            $geomName = $geomList[$geomType];
         $geomName = $geomList[$geomNameOGR];
     } else {
         $geomName = "raster";
     }
     if (is_file($layerDefFile)) {
         //if (is_file($layerDefFile = $layerFilename . ".msl")) {
         $layerString = file_get_contents($layerDefFile);
     } else {
         $layerPath = dirname(__FILE__) . "/layerdefinition/{$geomName}.lyr";
         $layerString = file_get_contents($layerPath);
     }
     //error_log("layerDefFile: $layerDefFile");
     return $layerString;
 }
 function get_geom_type($layer)
 {
     $feature = OGR_L_GetNextFeature($layer);
     $geometry = OGR_F_GetGeometryRef($feature);
     $geom_type = strtolower(OGR_G_GetGeometryName($geometry));
     $this->geom_type = $geom_type;
     return $geom_type;
 }
function OGR_F_DumpReadable($hFeature)
{
    $hFeatureDefn = OGR_F_GetDefnRef($hFeature);
    printf("OGRFeature(%s):%ld\n", OGR_FD_GetName($hFeatureDefn), OGR_F_GetFID($hFeature));
    $numFields = OGR_FD_GetFieldCount($hFeatureDefn);
    for ($iField = 0; $iField < $numFields; $iField++) {
        $hFieldDefn = OGR_FD_GetFieldDefn($hFeatureDefn, $iField);
        printf("  %s (%s) = ", OGR_FLD_GetNameRef($hFieldDefn), OGR_GetFieldTypeName(OGR_FLD_GetType($hFieldDefn)));
        if (OGR_F_IsFieldSet($hFeature, $iField)) {
            printf("%s\n", OGR_F_GetFieldAsString($hFeature, $iField));
        } else {
            printf("(null)\n");
        }
    }
    if (OGR_F_GetStyleString($hFeature) != NULL) {
        printf("  Style = %s\n", OGR_F_GetStyleString($hFeature));
    }
    if (OGR_F_GetGeometryRef($hFeature) != NULL) {
        OGR_G_DumpReadable(OGR_F_GetGeometryRef($hFeature));
    }
    printf("\n");
}
예제 #5
0
     echo "could not open dest.";
     exit;
 }
 echo "shapefile opened, postgres source opened";
 // shapefiles only have one layer, so
 // the second arg to GetLayer is 0.
 $src_layer = OGR_DS_GetLayer($src_ds, 0);
 if ($src_layer == NULL) {
     echo "could not open source layer";
     return;
 }
 $feature_defn = OGR_L_GetLayerDefn($src_layer);
 /*---------------------------------------------------------------------------------------*/
 /* this is done to find out the geometry type only - should be moved to its own function */
 $feature = OGR_L_GetNextFeature($src_layer);
 $geometry = OGR_F_GetGeometryRef($feature);
 $geom_type = strtolower(OGR_G_GetGeometryName($geometry));
 // execute sql command using form id to find out spatial table name and attribute table
 // namme
 $sql_str = "SELECT " . "tng_spatial_data.table_name, " . "tng_spatial_attribute_table.attr_table_name " . "FROM " . "tng_form_spatial_data " . "INNER JOIN tng_spatial_data ON tng_form_spatial_data.spatial_table_id = tng_spatial_data.spatial_table_id " . "INNER JOIN tng_spatial_attribute_table on tng_form_spatial_data.spatial_table_id = tng_spatial_attribute_table.spatial_table_id " . "WHERE " . "tng_form_spatial_data.form_id = 1 " . "AND " . "tng_spatial_data.geometry_type = '" . $geom_type . "'";
 $dbconn = new DBConn();
 $dbconn->connect();
 $result = pg_query($dbconn->conn, $sql_str);
 if (!$result) {
     echo "An error occurred while executing the query - class_form.php:47 " . pg_last_error($dbconn->conn);
     $dbconn->disconnect();
 } else {
     $dst_layer_name = pg_fetch_result($result, 0, 0);
     $dst_attr_table_name = pg_fetch_result($result, 0, 1);
     $dbconn->disconnect();
 }