找到的一个读取shape数据的代码

简介: 其实在这里可以看到更多的:http://nettopologysuite.googlecode.com/svn/branches/GenericsWork/NetTopologySuite/IO/using System; using System.
其实在这里可以看到更多的:http://nettopologysuite.googlecode.com/svn/branches/GenericsWork/NetTopologySuite/IO/

using System; using System.Collections; using System.IO; using GeoAPI.Geometries; using GisSharpBlog.NetTopologySuite.Algorithm; using GisSharpBlog.NetTopologySuite.Geometries; namespace GisSharpBlog.NetTopologySuite.IO { /// <summary> /// Contains methods for reading a single <c>Geometry</c> in binary ESRI shapefile format. /// </summary> public class ShapeReader { /// <summary> /// Geometry creator. /// </summary> private GeometryFactory factory = null; /// <summary> /// /// </summary> public GeometryFactory Factory { get { return factory; } } /// <summary> /// Initialize reader with a standard <c>GeometryFactory</c>. /// </summary> public ShapeReader() : this(new GeometryFactory()) { } /// <summary> /// Initialize reader with the given <c>GeometryFactory</c>. /// </summary> /// <param name="factory"></param> public ShapeReader(GeometryFactory factory) { this.factory = factory; } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public IGeometry ReadPoint(BinaryReader reader) { ICoordinate coordinate = ReadCoordinate(reader); IGeometry point = CreatePoint(coordinate); return point; } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public IGeometry ReadLineString(BinaryReader reader) { ReadBoundingBox(reader); // Jump boundingbox int numParts = ReadNumParts(reader); int numPoints = ReadNumPoints(reader); int[] indexParts = ReadIndexParts(reader, numParts); ICoordinate[] coords = ReadCoordinates(reader, numPoints); if (numParts == 1) return CreateLineString(coords); else return CreateMultiLineString(numPoints, indexParts, coords); } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public IGeometry ReadPolygon(BinaryReader reader) { ReadBoundingBox(reader); // Jump boundingbox int numParts = ReadNumParts(reader); int numPoints = ReadNumPoints(reader); int[] indexParts = ReadIndexParts(reader, numParts); ICoordinate[] coords = ReadCoordinates(reader, numPoints); if (numParts == 1) return CreateSimpleSinglePolygon(coords); else return CreateSingleOrMultiPolygon(numPoints, indexParts, coords); } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public IGeometry ReadMultiPoint(BinaryReader reader) { ReadBoundingBox(reader); // Jump boundingbox int numPoints = ReadNumPoints(reader); ICoordinate[] coords = new ICoordinate[numPoints]; for (int i = 0; i < numPoints; i++) coords[i] = ReadCoordinate(reader); return CreateMultiPoint(coords); } /// <summary> /// /// </summary> /// <param name="coordinate"></param> /// <returns></returns> public IPoint CreatePoint(ICoordinate coordinate) { return Factory.CreatePoint(coordinate); } /// <summary> /// Creates a single LineString. /// </summary> /// <param name="coords"></param> /// <returns></returns> public ILineString CreateLineString(ICoordinate[] coords) { return Factory.CreateLineString(coords); } /// <summary> /// Creates a MultiLineString. /// </summary> /// <param name="numPoints"></param> /// <param name="indexParts"></param> /// <param name="coords"></param> /// <returns></returns> public IGeometry CreateMultiLineString(int numPoints, int[] indexParts, ICoordinate[] coords) { // Support vars ILineString[] strings = new ILineString[indexParts.Length]; ICoordinate[] destCoords = null; int index = 0; int length = 0; int partIndex = 1; // Create parts for (int i = 0; i < coords.Length - 1; i++) { if (partIndex == indexParts.Length) break; // Exit and add manually last part if (i == indexParts[partIndex]) { length = indexParts[partIndex] - indexParts[partIndex - 1]; destCoords = new ICoordinate[length]; Array.Copy(coords, indexParts[partIndex - 1], destCoords, 0, length); partIndex++; strings[index++] = Factory.CreateLineString(destCoords); } } // Create last part int lastIndex = indexParts.Length - 1; length = numPoints - indexParts[lastIndex]; destCoords = new ICoordinate[length]; Array.Copy(coords, indexParts[lastIndex], destCoords, 0, length); strings[index] = Factory.CreateLineString(destCoords); // Create geometryString return Factory.CreateMultiLineString(strings); } /// <summary> /// Creates a single Polygon with holes. /// </summary> /// <param name="numPoints"></param> /// <param name="indexParts"></param> /// <param name="coords"></param> /// <returns></returns> public IGeometry CreateSingleOrMultiPolygon(int numPoints, int[] indexParts, ICoordinate[] coords) { // Support vars int i = 0; int index = 0; int shellLength = 0; ICoordinate[] shellCoords = null; ILinearRing[] shells = new ILinearRing[indexParts.Length]; ArrayList polygonIndex = new ArrayList(); // Reading shells for (i = 0; i < indexParts.Length - 1; i++) { // Init vars shellLength = indexParts[i + 1] - indexParts[i]; shellCoords = new ICoordinate[shellLength]; Array.Copy(coords, indexParts[i], shellCoords, 0, shellLength); // Verify polygon area if (!CGAlgorithms.IsCCW(shellCoords)) polygonIndex.Add(i); // Adding shell to array shells[index++] = Factory.CreateLinearRing(shellCoords); } // Adding last shell int lastIndex = indexParts.Length - 1; shellLength = numPoints - indexParts[lastIndex]; shellCoords = new ICoordinate[shellLength]; Array.Copy(coords, indexParts[lastIndex], shellCoords, 0, shellLength); if (!CGAlgorithms.IsCCW(shellCoords)) polygonIndex.Add(lastIndex); shells[index] = Factory.CreateLinearRing(shellCoords); // Create geometryString if (polygonIndex.Count == 1) { // Single Polygon building ILinearRing shell = shells[(int) polygonIndex[0]]; ILinearRing[] holes = new ILinearRing[shells.Length - 1]; Array.Copy(shells, 1, holes, 0, shells.Length - 1); // Create Polygon point return Factory.CreatePolygon(shell, holes); } else { // MultiPolygon building: At this time i have all Linear Rings (shells and holes) undifferenceds into shells[] array, // and in polygonIndex ArrayList i have all index for all shells (not holes!). // Support vars index = 0; int start = 0; int end = 0; int length = 0; ILinearRing shell = null; // Contains Polygon Shell ILinearRing[] holes = null; // Contains Polygon Holes IPolygon[] polygons = new IPolygon[polygonIndex.Count]; // Array containing all Polygons // Building procedure for (i = 0; i < polygonIndex.Count - 1; i++) { start = (int )polygonIndex[i]; // First element of polygon (Shell) end = ((int )polygonIndex[i + 1] - 1); // Index of last Hole length = end - start; // Holes shell = shells[start]; // Shell holes = new ILinearRing[length]; // Holes Array.Copy(shells, start + 1, holes, 0, length); // (start + 1) because i jump the Shell and keep only the Holes! polygons[index++] = Factory.CreatePolygon(shell, holes); } // Add manually last polygon start = (int) polygonIndex[polygonIndex.Count - 1]; // First element of polygon (Shell) end = shells.Length - 1; // Index of last Hole length = end - start; // Holes shell = shells[start]; // Shell holes = new ILinearRing[length]; // Holes Array.Copy(shells, start + 1, holes, 0, length); // (start + 1) because i jump the Shell and keep only the Holes! polygons[index++] = Factory.CreatePolygon(shell, holes); // Create MultiPolygon point return Factory.CreateMultiPolygon(polygons); } } /// <summary> /// Creates a single Polygon without holes. /// </summary> /// <param name="coords"></param> /// <returns></returns> public IPolygon CreateSimpleSinglePolygon(ICoordinate[] coords) { return Factory.CreatePolygon(Factory.CreateLinearRing(coords), null); } /// <summary> /// Creates a MultiPoint. /// </summary> /// <param name="coords"></param> /// <returns></returns> public IMultiPoint CreateMultiPoint(ICoordinate[] coords) { return Factory.CreateMultiPoint(coords); } /// <summary> /// Jump values for VeDEx BoundingBox /// </summary> /// <param name="reader"></param> public void ReadBoundingBox(BinaryReader reader) { for (int i = 0; i < 4; i++) reader.ReadDouble(); } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public int ReadNumParts(BinaryReader reader) { return reader.ReadInt32(); } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public int ReadNumPoints(BinaryReader reader) { return reader.ReadInt32(); } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="numParts"></param> /// <returns></returns> public int[] ReadIndexParts(BinaryReader reader, int numParts) { int[] indexParts = new int[numParts]; for (int i = 0; i < numParts; i++) indexParts[i] = reader.ReadInt32(); return indexParts; } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="numPoints"></param> /// <returns></returns> public ICoordinate[] ReadCoordinates(BinaryReader reader, int numPoints) { ICoordinate[] coords = new ICoordinate[numPoints]; for (int i = 0; i < numPoints; i++) coords[i] = ReadCoordinate(reader); return coords; } /// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public ICoordinate ReadCoordinate(BinaryReader reader) { return new Coordinate(reader.ReadDouble(), reader.ReadDouble()); } /// <summary> /// /// </summary> /// <param name="list"></param> /// <returns></returns> public IGeometryCollection CreateGeometryCollection(IList list) { IGeometry[] geometries = (IGeometry[]) (new ArrayList(list).ToArray(typeof(IGeometry))); return Factory.CreateGeometryCollection(geometries); } } }

 

相关文章
|
8天前
|
机器学习/深度学习 监控 物联网
函数计算操作报错合集之调用接口提示Cannot copy out of meta tensor; no data! 是什么原因
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
11月前
Tensorboard存数据代码解释
Tensorboard存数据代码解释
|
存储 设计模式 测试技术
08 测试数据:是不是可以把所有的参数都保存到Excel中?
08 测试数据:是不是可以把所有的参数都保存到Excel中?
|
Python
numpy重新学习系列(9)---如何用np.empty_like创建一个新的和原来array形状一样的,但是未初始化的array
numpy重新学习系列(9)---如何用np.empty_like创建一个新的和原来array形状一样的,但是未初始化的array
98 0
numpy重新学习系列(9)---如何用np.empty_like创建一个新的和原来array形状一样的,但是未初始化的array
|
PyTorch 算法框架/工具
如何将x_data和y_data利用torch转换成小批量数据,并要求打乱数据,如何处理?
首先,使用TensorDataset将x_data和y_data合并到一个数据集中。然后,使用DataLoader创建一个迭代器,以便逐个处理每个小批量数据。在这里,batch_size设置为2,这意味着每个小批量将包含2个样本。shuffle参数设置为True,表示要对数据进行随机打乱。在遍历每个小批量数据时,可以在循环体内执行训练或评估操作。
158 0
|
Python
numpy重新学习系列(8)---如何用np.empty创建一个未初始化的array
numpy重新学习系列(8)---如何用np.empty创建一个未初始化的array
63 0
numpy重新学习系列(8)---如何用np.empty创建一个未初始化的array
读取文件结束的判定的概念,使用方法和文件缓冲区的位置
读取文件结束的判定的概念,使用方法和文件缓冲区的位置
111 0
|
Python
如何读取保存一些list信息的txt,生成有一组名字有规律的list
如何读取保存一些list信息的txt,生成有一组名字有规律的list
159 0
如何读取保存一些list信息的txt,生成有一组名字有规律的list
|
数据采集 JavaScript
puppeteer 清空input原本的值
puppeteer 中 使用 page 输入 input 的时候,有可能需要清除 input 原本就有的值。
|
存储 缓存 TensorFlow
Tensorflow |(3)变量的的创建、初始化、保存和加载
Tensorflow |(3)变量的的创建、初始化、保存和加载
210 0