private void generateShapeInfo() { if (!this.hShpIsOpen) { hShp = ShapeLib.SHPOpenW(this.filePath, this.access); } if (hShp.Equals(IntPtr.Zero)) { MessageBox.Show("Oops - hShp = 0"); } else { // get shape info and verify shapes were created correctly double[] minB = new double[4]; double[] maxB = new double[4]; int nEntities = 0; ShapeLib.ShapeType shapeType = ShapeLib.ShapeType.PolyLine; ShapeLib.SHPGetInfo(hShp, ref nEntities, ref shapeType, minB, maxB); this.numberOfShapes = nEntities; this.shapeType = shapeType; this.minB = minB; this.maxB = maxB; ShapeLib.SHPClose(hShp); this.hShpIsOpen = false; this.isShapeInfoRead = true; } }
public ShapeLayerClass(string string_1, string string_2, ICoLayer icoLayer_1) { this.method_0(string_1); this.list_0.Clear(); this.string_0 = string_1.ToUpper(); if (this.string_0.EndsWith(".SHP")) { this.string_0 = this.string_0.Substring(0, this.string_0.Length - 4); } if (string_2.ToLower().Trim() == "point") { this.shapeType_0 = ShapeLib.ShapeType.Point; } if (string_2.ToLower().Trim() == "line") { this.shapeType_0 = ShapeLib.ShapeType.PolyLine; } if (string_2.ToLower().Trim() == "polygon") { this.shapeType_0 = ShapeLib.ShapeType.Polygon; } if (string_2.ToLower().Trim() == "text") { this.shapeType_0 = ShapeLib.ShapeType.Point; } this.intptr_0 = ShapeLib.SHPCreate(this.string_0, this.shapeType_0); if (!this.intptr_0.Equals(IntPtr.Zero)) { this.intptr_1 = ShapeLib.DBFCreate(this.string_0); if (!this.intptr_1.Equals(IntPtr.Zero)) { this.method_1(icoLayer_1); } } }
/// <summary> /// Returns an OraShape object /// </summary> /// <param name="geom_info"></param> /// <param name="shape_type"></param> /// <param name="pkVal"></param> /// <returns></returns> public OraShape getOraShape(GeoInfo geom_info, ShapeLib.ShapeType shape_type, Int32 pkVal) { //Console.Write("Getting coordinates....\n"); Dictionary <string, OraShape> allShapes = new Dictionary <string, OraShape>(); OraShape shp = new OraShape(); bool isM = false; bool isZ = false; List <double[]> coordLists = new List <double[]>(); List <double> XList = new List <double>(); List <double> YList = new List <double>(); List <double> WList = new List <double>(); bool is3D = false; List <int> listParts = new List <int>(); string sqlstring = string.Empty; if (geom_info.Geo.Sdo_Gtype.ToString().StartsWith("33")) { isM = true; } if (geom_info.Geo.Sdo_Gtype.ToString().StartsWith("3") && !geom_info.Geo.Sdo_Gtype.ToString().StartsWith("33")) { isZ = true; } try { string prevID = string.Empty; shp = new OraShape(); shp.ShapePK = pkVal.ToString(); XList.Clear(); YList.Clear(); WList.Clear(); shp.XList = getCoordArrayFromGeom(geom_info, 0).ToArray(); shp.YList = getCoordArrayFromGeom(geom_info, 1).ToArray(); if (isM) { shp.MList = getCoordArrayFromGeom(geom_info, 2).ToArray(); } if (isZ) { shp.ZList = getCoordArrayFromGeom(geom_info, 2).ToArray(); } shp.nVertices = shp.XList.Length; } catch (Exception ex) { string s = ex.Message; } finally { } return(shp); }
public OraShape CreatePointShape(GeoInfo geom_info, ShapeLib.ShapeType shape_type, string pkVal) { OraShape shp = new OraShape(); shp.ShapePK = pkVal.ToString(); double[] x = new double[1]; x[0] = Convert.ToDouble(geom_info.Geo.Point.X); double[] y = new double[1]; y[0] = Convert.ToDouble(geom_info.Geo.Point.X); shp.XList = x; shp.YList = y; if (shape_type == ShapeLib.ShapeType.PointM) { double[] m = new double[1]; m[0] = Convert.ToDouble(geom_info.Geo.Point.M); shp.MList = m; } shp.nParts = 1; shp.nVertices = 1; shp.PartType = null; shp.ShapeType = shape_type; int[] p = new int[1]; shp.PartStarts = p; return(shp); }
public void Dispose() { if (selectedTransportQuadtreeItem != null) { selectedTransportQuadtreeItem.Delete(); ShapeLib.ShapeType shapeType = selectedTransportQuadtreeItem.Parent.Type; if (shapeType == ShapeLib.ShapeType.MultiPoint) { layerManager.TransportPointLayer.removePoint(selectedTransportQuadtreeItem.Parent); } else if (shapeType == ShapeLib.ShapeType.PolyLine) { layerManager.TransportPolylineLayer.removePolyline(selectedTransportQuadtreeItem.Parent); } else if (shapeType == ShapeLib.ShapeType.PolyLine) { layerManager.TransportPolygonLayer.removePolygon(selectedTransportQuadtreeItem.Parent); } selectedTransportQuadtreeItem = null; } }
public static void ConvertToOra(string[] args) { string pkValue = string.Empty; if (args == null || args.Length < 4) { Console.Write("\nUsage: shape2ora <username/password>@dbalias> <spatial_table_name> <shape_col> <shapefile> <srid> \n\nPress any key to exit"); Console.ReadLine(); return; } string connectionstring = Utils.ParseConnectionString(args[0].ToString()); string spatial_table = args[1].ToString(); string shape_col = args[2].ToString(); string inShapeFile = args[3].ToString(); string strSRID = "NULL"; if (args.Length == 5) { strSRID = args[4].ToString(); } if (inShapeFile.ToUpper().EndsWith(".SHP")) { inShapeFile = inShapeFile.Substring(0, inShapeFile.Length - 4); } IntPtr hShp = ShapeLib.SHPOpen(inShapeFile, "rb"); IntPtr hDbf = ShapeLib.DBFOpen(inShapeFile, "rb"); if (hDbf.Equals(IntPtr.Zero)) { Console.WriteLine("\nCould not open {0}.dbf\nProbable cause: You do not have permissions or filename is incorrect\n\nPress any key to exit", inShapeFile); Console.ReadLine(); return; } OracleConnection oracon = new OracleConnection(connectionstring); oracon.Open(); try { //Check if table exists bool tabExists = TabExists(oracon, spatial_table); //Get dbf info int recCount = ShapeLib.DBFGetRecordCount(hDbf); // get shape info double[] minXY = new double[4]; double[] maxXY = new double[4]; int nEntities = 0; ShapeLib.ShapeType shapeType = 0; ShapeLib.SHPGetInfo(hShp, ref nEntities, ref shapeType, minXY, maxXY); string sqlCreateTab = @"CREATE TABLE " + spatial_table.ToUpper() + "("; bool flag = true; for (int i = 0; i < nEntities; i++) { if (flag) { sqlCreateTab = sqlCreateTab + GetShapeColumnNames(ref hDbf); sqlCreateTab = sqlCreateTab + shape_col + "\tMDSYS.SDO_GEOMETRY\n)"; if (!tabExists) { //EXECUTE table creation sql ExecuteStatement(oracon, sqlCreateTab); } flag = false; } #region Deal With Geometry IntPtr pshpObj = ShapeLib.SHPReadObject(hShp, i); // Get the SHPObject associated with our IntPtr pshpObj // We create a new SHPObject in managed code, then use Marshal.PtrToStructure // to copy the unmanaged memory pointed to by pshpObj into our managed copy. ShapeLib.SHPObject shpObj = new ShapeLib.SHPObject(); Marshal.PtrToStructure(pshpObj, shpObj); //Number of parts int nParts = shpObj.nParts; //Part starts List int[] partStarts = new int[nParts]; //Coordinate arrays double[] xCoord = new double[shpObj.nVertices]; double[] yCoord = new double[shpObj.nVertices]; double[] zCoord = new double[shpObj.nVertices]; double[] MCoord = new double[shpObj.nVertices]; // Use Marshal.Copy to copy the memory pointed // to by shpObj.padfX and shpObj.padfX (each an IntPtr) to an actual array. Marshal.Copy(shpObj.padfX, xCoord, 0, shpObj.nVertices); Marshal.Copy(shpObj.padfY, yCoord, 0, shpObj.nVertices); if (shapeType == ShapeLib.ShapeType.MultiPointM || shapeType == ShapeLib.ShapeType.PointM || shapeType == ShapeLib.ShapeType.PolygonM || shapeType == ShapeLib.ShapeType.PolyLineM) { Marshal.Copy(shpObj.padfM, zCoord, 0, shpObj.nVertices); } if (shapeType == ShapeLib.ShapeType.MultiPointZ || shapeType == ShapeLib.ShapeType.PointZ || shapeType == ShapeLib.ShapeType.PolygonZ || shapeType == ShapeLib.ShapeType.PolyLineZ) { Marshal.Copy(shpObj.padfZ, zCoord, 0, shpObj.nVertices); } if (nParts > 0) { Marshal.Copy(shpObj.paPartStart, partStarts, 0, nParts); } string sqlInsertShape = " MDSYS.SDO_GEOMETRY("; string gType = GetGTYPE(shapeType, nParts); string elem_info = "NULL"; string sdo_point = "NULL"; if (shapeType == ShapeLib.ShapeType.Point || shapeType == ShapeLib.ShapeType.PointM || shapeType == ShapeLib.ShapeType.PointZ) { sdo_point = "MDSYS.SDO_POINT_TYPE(" + xCoord[0].ToString() + "," + yCoord[0].ToString(); if (shapeType == ShapeLib.ShapeType.PointZ) { sdo_point = sdo_point + "," + zCoord[0].ToString(); } else if (shapeType == ShapeLib.ShapeType.PointM) { sdo_point = sdo_point + "," + MCoord[0].ToString(); } else { sdo_point = sdo_point + ", NULL"; } sdo_point = sdo_point + ")"; } else { elem_info = GetElemInfoString(shapeType, nParts, partStarts, shpObj.nVertices); } string vert_String = GetVerticesString(shapeType, xCoord, yCoord, zCoord, MCoord); //Construct the geometry statement sqlInsertShape = sqlInsertShape + gType + "," + strSRID + "," + sdo_point + "," + elem_info + "," + vert_String + ")"; # endregion #region Deal with Attributes string[] attrs = InsAttrSQL(ref hDbf, i); string insStatement = "INSERT INTO " + spatial_table.ToUpper() + "\n" + "(" + attrs[0] + "," + shape_col + ")\n" + " VALUES (" + attrs[1] + "," + sqlInsertShape + ")"; //Do the insert ExecuteStatement(oracon, insStatement); #endregion } //Create user_sdo_geom_metadata and spatial index for a new table if (!tabExists) { string usgm = GetUSGMString(shapeType, spatial_table, shape_col, minXY, maxXY); ExecuteStatement(oracon, usgm); string spidx = GetSPIDXString(spatial_table, shape_col); ExecuteStatement(oracon, spidx); } // free resources ShapeLib.SHPClose(hShp); ShapeLib.DBFClose(hDbf); Console.Write("Done.\nPress any key to exit"); Console.ReadLine(); }
public static void CreateShapeFile(string[] args) { string pkValue = string.Empty; bool pkValIsString = false; bool isSdoPoint = false; if (args == null || args.Length < 5) { Console.Write("\nUsage: sdo2shp <username/password>@dbalias> <spatial_table_name> <PK_col> <shape_col> <shapefile> [\"optional_where_clause\"]\n\nPress any key to exit"); Console.ReadLine(); return; } System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); string version = assembly.GetName().Version.ToString(); Console.Write("\nORA2SHP Oracle SDO to Shapefile Utility. Version: " + version + "\n"); Console.Write("====================================================================\n"); string connectionstring = Utils.ParseConnectionString(args[0].ToString()); string where_clause = string.Empty; try { where_clause = args[5].ToString().Trim('"'); } catch (Exception) { } if (where_clause != string.Empty) { if (!where_clause.ToUpper().StartsWith("WHERE")) { where_clause = " where " + where_clause; } } string outShpFile = args[4].ToString(); string tab_name = args[1].ToString(); string pk_column = args[2].ToString(); string sdo_column = args[3].ToString(); if (outShpFile.ToUpper().EndsWith(".SHP")) { outShpFile = outShpFile.Substring(0, outShpFile.Length - 4); } OracleConnection oracon = new OracleConnection(connectionstring); List <GeoInfo> lShpInfo = new List <GeoInfo>(); try { oracon.Open(); string selFirstShp = string.Empty; if (where_clause == string.Empty) { selFirstShp = "select " + args[2].ToString() + "," + args[3].ToString() + " from " + args[1] + " where rownum = 1"; } else { selFirstShp = "select " + pk_column + "," + sdo_column + " from " + tab_name + " " + where_clause + " and rownum = 1"; } try { lShpInfo = getGeomInfo(oracon, selFirstShp, sdo_column); if (lShpInfo.Count == 0) { Console.WriteLine("\nNo rows found it table {0}", args[1]); Console.ReadLine(); oracon.Close(); oracon.Dispose(); return; } } catch (Exception ex) { Console.WriteLine("\nORA2SHP ERROR:\n" + ex.Message + "\n" + ex.StackTrace); } finally { } //Check if its an SDO point geometry GeoInfo geomInfo = lShpInfo[0]; isSdoPoint = isSDOPointType(geomInfo); //Initialize shape type ShapeLib.ShapeType shpType = ShapeLib.ShapeType.Point; try { shpType = GetShapeType(geomInfo); } catch (Exception ex) { Console.Write(ex.Message); Console.ReadLine(); return; } IntPtr hShp = ShapeLib.SHPCreate(outShpFile, shpType); if (hShp.Equals(IntPtr.Zero)) { Console.WriteLine("\nCould not create {0}.shp\nProbable cause: You do not have permissions or file is in use by another process\n\nPress any key to exit", outShpFile); Console.ReadLine(); return; } string sqlselect = string.Empty; if (where_clause == string.Empty) { sqlselect = @"SELECT " + GetColumnNames(oracon, tab_name) + ", " + sdo_column + " from " + tab_name; } else { sqlselect = @"SELECT " + GetColumnNames(oracon, tab_name) + ", " + sdo_column + " from " + tab_name + " " + where_clause; } OracleCommand command1 = oracon.CreateCommand(); command1.CommandText = sqlselect; OracleDataReader dr = command1.ExecuteReader(); int iShape = 0; IntPtr hDbf = IntPtr.Zero; DataTable dt = new DataTable(); System.Collections.Hashtable ht = new System.Collections.Hashtable(); //#if (DEBUG==true) // Console.WriteLine("Before Loop Elapsed Time: " + (DateTime.Now - tstart).ToString()); tstart = DateTime.Now; //#endif #region create dbf // create dbase file hDbf = ShapeLib.DBFCreate(outShpFile); if (!hDbf.Equals(IntPtr.Zero)) { dt = dr.GetSchemaTable(); //Get table metadata dt.Columns.Add("dBaseName"); } int ordinal1 = 0; foreach (DataRow row in dt.Rows) { string name = row["ColumnName"].ToString().ToUpper(); if (name.Length > 10) //Truncate column name to 10 chars { name = name.Substring(0, 10); } int i = 0; while (ht.ContainsKey(name)) //Check if column name exists after truncation { string iVal = (i++).ToString(); if (name.Length + iVal.Length > 10) { name = name.Substring(0, 10 - iVal.Length) + iVal; } else { name = name + iVal; } } ht.Add(name, ordinal1++); row["dBaseName"] = name; string type = row["DataType"].ToString(); switch (type) { case "System.Int32": case "System.Int16": ShapeLib.DBFAddField(hDbf, name, ShapeLib.DBFFieldType.FTInteger, 16, 0); break; case "System.String": int len = Math.Min(255, int.Parse(row["ColumnSize"].ToString())); ShapeLib.DBFAddField(hDbf, name, ShapeLib.DBFFieldType.FTString, len, 0); if (name == args[1].ToString()) { pkValIsString = true; } break; case "System.Boolean": ShapeLib.DBFAddField(hDbf, name, ShapeLib.DBFFieldType.FTLogical, 5, 0); break; case "System.Double": case "System.Float": case "System.Decimal": int prec = int.Parse(row["NumericPrecision"].ToString()); int scale = int.Parse(row["NumericScale"].ToString()); ShapeLib.DBFAddField(hDbf, name, ShapeLib.DBFFieldType.FTDouble, prec, scale); break; case "System.DateTime": ShapeLib.DBFAddField(hDbf, name, ShapeLib.DBFFieldType.FTDate, 8, 0); break; default: ht.Remove(name); row["dBaseName"] = null; ordinal1--; break; } } #endregion create dbf ShapeCreator sc = new ShapeCreator(); IntPtr pShp = new IntPtr(); while (dr.Read()) { //Console.Write("Processing record ..." + iShape.ToString() +"."); pkValue = dr[args[2]].ToString(); OraShape shp = new OraShape(); ShapePartInfo shpInfo = new ShapePartInfo(); try { GeoInfo geoInfo = new GeoInfo(); geoInfo.Geo = (SdoGeometry)dr[sdo_column]; shp = sc.getOraShape(geoInfo, shpType, Convert.ToInt32(dr[pk_column])); } catch (Exception) { continue; } if (!isSdoPoint) { try { shpInfo = sc.getShapePartInfo(geomInfo); } catch (Exception) { continue; } shp.nParts = shpInfo.nParts; shp.PartType = null; shp.PartStarts = shpInfo.PartStarts; if (shp.MList == null || shp.MList.Length == 0) { if (shp.ZList == null || shp.ZList.Length == 0) { pShp = ShapeLib.SHPCreateObject(shpType, -1, shp.nParts, shp.PartStarts, null, shp.nVertices, shp.XList, shp.YList, null, null); } else { pShp = ShapeLib.SHPCreateObject(shpType, -1, shp.nParts, shp.PartStarts, null, shp.nVertices, shp.XList, shp.YList, shp.ZList, null); } } else { pShp = ShapeLib.SHPCreateObject(shpType, -1, shp.nParts, shp.PartStarts, null, shp.nVertices, shp.XList, shp.YList, null, shp.MList); } } else { shp = sc.CreatePointShape(geomInfo, shpType, pkValue); if (shpType == ShapeLib.ShapeType.PointM) { pShp = ShapeLib.SHPCreateObject(shpType, -1, 0, null, null, 1, shp.XList, shp.YList, null, shp.MList); } else if (shpType == ShapeLib.ShapeType.PointZ) { pShp = ShapeLib.SHPCreateObject(shpType, -1, 0, null, null, 1, shp.XList, shp.YList, shp.ZList, null); } else { pShp = ShapeLib.SHPCreateObject(shpType, -1, 0, null, null, 1, shp.XList, shp.YList, null, null); } } try //In case of invalid shapes { ShapeLib.SHPWriteObject(hShp, -1, pShp); } catch (Exception) { Console.WriteLine("Shape with " + args[2].ToString().ToUpper() + "= " + pkValue + " is invalid. Number of vertices: " + shp.nVertices.ToString() + " Number of parts: " + shp.nParts.ToString()); continue; } ShapeLib.SHPDestroyObject(pShp); foreach (DataRow row in dt.Rows) { if (row["dBaseName"] == null || row["dBaseName"].ToString() == string.Empty) { continue; } int ordinal = (int)ht[row["dBaseName"].ToString()]; string fieldName = row["ColumnName"].ToString(); if (dr[fieldName] is DBNull) { continue; } switch (row["DataType"].ToString()) { case "System.Int32": case "System.Int16": ShapeLib.DBFWriteIntegerAttribute(hDbf, iShape, ordinal, int.Parse(dr[fieldName].ToString())); break; case "System.String": ShapeLib.DBFWriteStringAttribute(hDbf, iShape, ordinal, dr[fieldName].ToString()); break; case "System.Boolean": ShapeLib.DBFWriteLogicalAttribute(hDbf, iShape, ordinal, bool.Parse(dr[fieldName].ToString())); break; case "System.Double": case "System.Float": case "System.Decimal": ShapeLib.DBFWriteDoubleAttribute(hDbf, iShape, ordinal, double.Parse(dr[fieldName].ToString())); break; case "System.DateTime": DateTime date = DateTime.Parse(dr[fieldName].ToString()); ShapeLib.DBFWriteDateAttribute(hDbf, iShape, ordinal, date); break; } } iShape++; //dr.NextResult(); } Console.WriteLine("Converted " + iShape.ToString() + " shapes in: " + (DateTime.Now - tstart).ToString()); // free resources ShapeLib.SHPClose(hShp); ShapeLib.DBFClose(hDbf); //Create projection file if needed CreatePrjFile(oracon, args[1].ToString(), args[3].ToString(), outShpFile); //Console.Write("Done.\n"); Console.Write("\nCreated shapefile " + args[4].ToString() + " with " + iShape.ToString() + " records.\nTotal Elapsed Time: " + (DateTime.Now - tProgramstart).ToString() + "\nPress any key to exit."); Console.ReadLine(); } catch (Exception ex) { Console.Write("ERROR: " + ex.Message + "\nPress any key to exit"); Utils.WriteErrLog(ex); Console.ReadLine(); } finally { //Close and free connection oracon.Close(); oracon.Dispose(); } }
/// <summary> /// Creates the database file that contains meta data about the shapes. /// </summary> /// <param name="shapetype"></param> /// <param name="SHPFile"></param> private void WriteDBF(ShapeLib.ShapeType shapetype, string SHPFile, bool convertTags) { string filename; int shapes = 0; List <MetaData> elementData; List <string> fields = new List <string>(); switch (shapetype) { case ShapeLib.ShapeType.Polygon: filename = SHPFile + "-polygons"; shapes = areas; elementData = polygonsData; break; case ShapeLib.ShapeType.PolyLine: filename = SHPFile + "-lines"; shapes = ways; elementData = linesData; break; case ShapeLib.ShapeType.Point: filename = SHPFile + "-points"; shapes = points; elementData = pointsData; break; default: return; } IntPtr hDbf = ShapeLib.DBFCreate(filename); if (hDbf.Equals(IntPtr.Zero)) { Console.WriteLine("Error: Unable to create {0}.dbf!", filename); return; } // add some fields. Fields have to be initialized before data is added int iRet = ShapeLib.DBFAddField(hDbf, "shapeID", ShapeLib.DBFFieldType.FTInteger, 4, 0); iRet = ShapeLib.DBFAddField(hDbf, "shapeName", ShapeLib.DBFFieldType.FTString, 50, 0); // if tags have to be converted, collect the names of all tags if (convertTags) { for (int iShape = 0; iShape < shapes; iShape++) { foreach (KeyValuePair <string, string> entry in elementData[iShape].Tags) { // Make sure that fields are only added once if (!fields.Contains(entry.Key)) { fields.Add(entry.Key); } } } // create fields in the DB for all tags foreach (string field in fields) { iRet = ShapeLib.DBFAddField(hDbf, field, ShapeLib.DBFFieldType.FTString, 128, 0); } } // populate for (int iShape = 0; iShape < shapes; iShape++) { iRet = (ShapeLib.DBFWriteIntegerAttribute(hDbf, iShape, 0, iShape)); iRet = (ShapeLib.DBFWriteStringAttribute(hDbf, iShape, 1, elementData[iShape].Name)); // If tags should be converted, write their values to the appropriate fields if (convertTags) { foreach (KeyValuePair <string, string> entry in elementData[iShape].Tags) { // Cut the entry after 128 characters int stringLength = entry.Value.Length; if (stringLength > 127) { stringLength = 127; } iRet = ShapeLib.DBFWriteStringAttribute(hDbf, iShape, fields.IndexOf(entry.Key) + 2, entry.Value.Substring(0, stringLength)); } } } ShapeLib.DBFClose(hDbf); }
public void Write(GeoRefData geodata) { double[] Xs = null; double[] Ys = null; ShapeLib.ShapeType type = ShapeLib.ShapeType.NullShape; if (geodata.Geometry is IXYPoint) { IXYPoint p = (IXYPoint)geodata.Geometry; type = ShapeLib.ShapeType.Point; Xs = new double[] { p.X }; Ys = new double[] { p.Y }; } else if (geodata.Geometry.GetType().Equals(typeof(XYPolyline))) { XYPolyline p = (XYPolyline)geodata.Geometry; type = ShapeLib.ShapeType.PolyLine; int npoints = p.Points.Count; Xs = new double[npoints]; Ys = new double[npoints]; for (int i = 0; i < npoints; i++) { Xs[i] = p.Points[i].X; Ys[i] = p.Points[i].Y; } } else if (geodata.Geometry.GetType().Equals(typeof(XYLine))) { XYLine p = (XYLine)geodata.Geometry; type = ShapeLib.ShapeType.PolyLine; int npoints = 2; Xs = new double[] { p.P1.X, p.P2.X }; Ys = new double[] { p.P1.Y, p.P2.Y };; } else if (geodata.Geometry.GetType().Equals(typeof(XYPolygon))) { XYPolygon p = (XYPolygon)geodata.Geometry; type = ShapeLib.ShapeType.Polygon; int npoints = p.Points.Count; Xs = new double[npoints]; Ys = new double[npoints]; p.Points.Reverse(); for (int i = 0; i < npoints; i++) { Xs[i] = p.Points[i].X; Ys[i] = p.Points[i].Y; } p.Points.Reverse(); } else if (geodata.Geometry.GetType().Equals(typeof(MultiPartPolygon))) { MultiPartPolygon p = (MultiPartPolygon)geodata.Geometry; type = ShapeLib.ShapeType.Polygon; int npoints = p.Polygons.Sum(pol => pol.Points.Count); foreach (var poly in p.Polygons) { poly.Points.Reverse(); } Xs = new double[npoints]; Ys = new double[npoints]; int i = 0; foreach (var point in p.Polygons.SelectMany(pol => pol.Points)) { Xs[i] = point.X; Ys[i] = point.Y; i++; } foreach (var poly in p.Polygons) { poly.Points.Reverse(); } } if (_shapePointer == IntPtr.Zero) { _shapePointer = ShapeLib.SHPCreate(_fileName, type); } if (_shapePointer == IntPtr.Zero) { throw new Exception("Could not create: " + Path.GetFullPath(_fileName) + "\nMake sure directory exists."); } IntPtr obj; if (geodata.Geometry.GetType().Equals(typeof(MultiPartPolygon))) { MultiPartPolygon p = (MultiPartPolygon)geodata.Geometry; int[] partstarts = new int[p.Polygons.Count]; partstarts[0] = 0; ShapeLib.PartType[] partype = new ShapeLib.PartType[p.Polygons.Count]; for (int i = 0; i < partype.Count(); i++) { partype[i] = ShapeLib.PartType.Ring; } for (int i = 1; i < partstarts.Count(); i++) { partstarts[i] = partstarts[i - 1] + p.Polygons[i - 1].Points.Count; } obj = ShapeLib.SHPCreateObject(type, -1, partstarts.Count(), partstarts, partype, Xs.Count(), Xs, Ys, null, null); } else { obj = ShapeLib.SHPCreateSimpleObject(type, Xs.Count(), Xs, Ys, null); } ShapeLib.SHPWriteObject(_shapePointer, -1, obj); ShapeLib.SHPDestroyObject(obj); _dbf.WriteData(geodata.Data); NoOfEntries++; }
private void generateShapeInfo() { if (!this.hShpIsOpen) hShp = ShapeLib.SHPOpenW(this.filePath, this.access); if (hShp.Equals(IntPtr.Zero)) MessageBox.Show("Oops - hShp = 0"); else { // get shape info and verify shapes were created correctly double[] minB = new double[4]; double[] maxB = new double[4]; int nEntities = 0; ShapeLib.ShapeType shapeType = ShapeLib.ShapeType.PolyLine; ShapeLib.SHPGetInfo(hShp, ref nEntities, ref shapeType, minB, maxB); this.numberOfShapes = nEntities; this.shapeType = shapeType; this.minB = minB; this.maxB = maxB; ShapeLib.SHPClose(hShp); this.hShpIsOpen = false; this.isShapeInfoRead = true; } }
public bool CreatePointFile(string path, string[] pointJson) { if (pointJson == null || pointJson.Length == 0) { return(false); } if (System.IO.Directory.Exists(path) == false) { Directory.CreateDirectory(path); } ShapeLib.ShapeType shpType = ShapeLib.ShapeType.Point; hShpPoint = ShapeLib.SHPCreate(path + "\\poi", shpType); DbfFile odbf = CreateAttr(path, pointJson); DbfRecord orec = new DbfRecord(odbf.Header) { AllowDecimalTruncate = true }; //逐个点录入属性信息及提取坐标 for (int i = 0; i < pointJson.Length; i++) { //取出JSON中的属性信息 JObject obj = (JObject)JsonConvert.DeserializeObject(pointJson[i]); string attrs = obj["attr"].ToString(); string attrtypes = obj["attrtype"].ToString(); string geometry = obj["geometry"].ToString(); //将该点属性信息记录为List<PointInf> List <PointInf> pointinf = new List <PointInf>(); List <string> values = new List <string>(); List <string> types = new List <string>(); JToken attrname = (JToken)JsonConvert.DeserializeObject(attrs); int listLenhth = 0; foreach (JProperty jp in attrname) { values.Add(jp.Value.ToString()); listLenhth++; } JToken attrtype = (JToken)JsonConvert.DeserializeObject(attrtypes); foreach (JProperty jp in attrtype) { types.Add(jp.Value.ToString()); } for (int a = 0; a < listLenhth - 1; a++) { pointinf.Add(new PointInf(values[a], types[a])); } try { //生成坐标点 List <Point> geo = CreatePointFilePointList(geometry); double[] xCoord = new double[1]; double[] yCoord = new double[1]; xCoord[0] = geo[0].X; yCoord[0] = geo[0].Y; IntPtr pShp = ShapeLib.SHPCreateSimpleObject(shpType, 1, xCoord, yCoord, null); ShapeLib.SHPWriteObject(hShpPoint, -1, pShp); ShapeLib.SHPDestroyObject(pShp); //录入属性信息 for (int a = 0; a < listLenhth - 1; a++) { if (pointinf[a].Type == "text") { orec[a] = pointinf[a].Value; } else { string c = pointinf[a].Value.ToString(); orec[a] = c; } } odbf.Write(orec, true); } catch { string c = pointinf[0].Value.ToString(); } } //关闭 odbf.Close(); if (hShpPoint != IntPtr.Zero) { ShapeLib.SHPClose(hShpPoint); } return(true); }
public static extern string SHPTypeName(ShapeLib.ShapeType shapeType_0);
public static extern void SHPGetInfo(IntPtr intptr_0, ref int int_0, ref ShapeLib.ShapeType shapeType_0, double[] double_0, double[] double_1);
public static extern IntPtr SHPCreateSimpleObject(ShapeLib.ShapeType shapeType_0, int int_0, double[] double_0, double[] double_1, double[] double_2);
public static extern IntPtr SHPCreateObject(ShapeLib.ShapeType shapeType_0, int int_0, int int_1, int[] int_2, ShapeLib.PartType[] partType_0, int int_3, double[] double_0, double[] double_1, double[] double_2, double[] double_3);
public static extern IntPtr SHPCreate(string string_0, ShapeLib.ShapeType shapeType_0);