AE太重型,还收费,如果只是加载地图作为底图,可以用纯C#实现。线类型用得最多,以下是线类型的数据结构:

总体架构

文件头

记录头

记录内容

记录头

记录内容

。。。。。。。。。。。。

记录头

记录内容

文件头

位置 类型 字段 说明
Byte 0 int File Code 文件代码
Byte 4 int 无用  
Byte 8 int 无用  
Byte 12 int 无用  
Byte 16 int 无用  
Byte 20 int 无用  
Byte 24 int File Length 文件长度
Byte 28 int Version 版本
Byte 32 int Shape Type

图形类型

1:Point,点类型

3:PolyLine,线类型

5:Polygon,面类型

Byte 36 double Xmin 整图的X轴坐标最小值
Byte 44 double Ymin 整图的Y轴坐标最小值
Byte 52 double Xmax 整图的X轴坐标最大值
Byte 60 double Ymax 整图的Y轴坐标最大值
Byte 68* double Zmin  
Byte 76* double Zmax  
Byte 84* double Mmin  
Byte 92* double Mmax  

记录头

位置 类型 字段 说明
Byte 0 int Record Number 记录号,从1开始
Byte 4 int Content Length 内容长度,内容的16位字数,不包括记录号。

记录内容

点类型:

位置 类型 字段 说明
Byte 0 int ShapeType Shape类型=1
Byte 4 double X 点的X坐标
Byte 12 double Y 点的Y坐标

线类型:

位置 类型 字段 说明
Byte 0 int ShapeType Shape类型=3
Byte 4 double [4] Box 该线条的边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储
Byte 36 int NumParts 是PolyLine中部分的数目
Byte 40 int NumPoints 是PolyLine中的数目
Byte 44 int [NumParts] Parts 每条PolyLine存储它在点数列中的第一个点的索引。数列索引是从0开始的。Parts[NumParts]数组是Points[NumPoints]数组的目录
X Point[NumPoints] Points 本条记录的所有点。Struct Point {Double  X;Double  Y;}

PartsPoints之间的关系:

如果Parts [0]=0Parts [1]=3Parts [2]=11Parts [3]=15那么

第0条线:(Points[0], Points[1] , Points[2])三个点依次连结

第1条线:(Points[3], Points[4] , Points[5] , Points[6] , Points[7] , Points[8] , Points[9] , Points[10])这几个点依次连结

第3条线:(Points[11], Points[12] , Points[13] , Points[14])四个点依次连结

ClassShp类:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO; namespace SDD
{
  struct StructShapePoint
{
public double X;
public double Y;
} struct StructShapePolyline
{
public int RecordNumber;//记录号
public int ContentLength;//内容长度
public int ShapeType;
public double[] Box;//长度为4
public int PartsCount;
public int PointsCount;
public List<int> Parts;//在部分中第一个点的索引
public List<StructShapePoint> Points;//所有部分的点
public List<StructShapePoint[]> Lines;//把点按线组织好
} class ClassShp
{
public string FileName;
public int FileLength;
public int FileVersion;
public int ShapeType;//绘图类型:1-点,3-线,5-面
public double Xmin, Ymin, Xmax, Ymax;//地图边界尺寸
public double RawWidth, RawHeight;//地图大小,原始值
public double RawCenterX, RawCenterY;//shp原始坐标系的中心点
public List<StructShapePoint> ListPoints = new List<StructShapePoint>();//点集合
public List<StructShapePolyline> ListPolylines = new List<StructShapePolyline>();//线集合 public double Scale = ;//放大倍数,原始数据中1表示的像素数
public double CenterX, CenterY;//地图缩放后的中心点在控件坐标系中的位置 public double WindowWidth;//显示控件大小
public double WindowHeight; public Bitmap Bmp = null;//用于显示的画布,大小等于显示控件
public Pen ThePen = new Pen(Color.White, ); public ClassShp()
{ } public ClassShp(string pmtShpPathName, double pmtVisibleWidth, double pmtVisibleHeight)
{
if (File.Exists(pmtShpPathName) == false) return;
if (Init(pmtShpPathName, pmtVisibleWidth, pmtVisibleHeight))
{
SaveAsTxt(); //把数据保存成文本文档
}
} //################################################################################
// 由Xmin等四个值计算出基本成员参数
//################################################################################
public void SetBaseParameter(double pmtXmin,double pmtYmin,double pmtXmax,double pmtYmax)
{
Xmin = pmtXmin;
Ymin = pmtYmin;
Xmax = pmtXmax;
Ymax = pmtYmax; RawWidth = Xmax - Xmin;
RawHeight = Ymax - Ymin;
RawCenterX = (Xmin + Xmax) / ;
RawCenterY = (Ymin + Ymax) / ; CenterX = WindowWidth / ;
CenterY = WindowHeight / ; SetRelativityScale(, WindowWidth, WindowHeight); Console.WriteLine("绘图类型:{0}", ShapeType);
Console.WriteLine("地图边界:({0}, {1}), ({2}, {3})", Xmin, Ymin, Xmax, Ymax);
Console.WriteLine("地图大小:{0} * {1}", RawWidth, RawHeight);
Console.WriteLine("地图中心:({0}, {1})", RawCenterX, RawCenterY);
} //################################################################################
// 初始化
//################################################################################
public bool Init(string pmtShpPathName, double pmtVisibleWidth, double pmtVisibleHeight)
{
if (File.Exists(pmtShpPathName) == false) return false; int nameIndex = pmtShpPathName.LastIndexOf("\\")+;
int nameLenght = pmtShpPathName.Length--pmtShpPathName.LastIndexOf("\\"); FileName = pmtShpPathName.Substring(nameIndex, nameLenght); WindowWidth = pmtVisibleWidth;
WindowHeight = pmtVisibleHeight; try
{
FileStream fs = new FileStream(pmtShpPathName, FileMode.Open);
BinaryReader br = new BinaryReader(fs, Encoding.Default); br.ReadBytes();
FileLength = br.ReadInt32();
FileVersion = br.ReadInt32();
ShapeType = br.ReadInt32(); Xmin = br.ReadDouble();
Ymin = br.ReadDouble();
Xmax = br.ReadDouble();
Ymax = br.ReadDouble(); br.ReadBytes(); if (ShapeType == )
{
ListPoints.Clear();
while (br.PeekChar() != -)
{
StructShapePoint shapePoint = new StructShapePoint();
uint recordNum = br.ReadUInt32();
int dataLength = br.ReadInt32();
br.ReadInt32();
shapePoint.X = br.ReadDouble();
shapePoint.Y = br.ReadDouble();
ListPoints.Add(shapePoint);
}
}//end of : if (ShpType==1)
else if (ShapeType == || ShapeType == )
{
ListPolylines.Clear();
while (br.PeekChar() != -)
{
StructShapePolyline shapePolyline = new StructShapePolyline();
shapePolyline.Box = new double[];
shapePolyline.Parts = new List<int>();
shapePolyline.Points = new List<StructShapePoint>();
shapePolyline.Lines = new List<StructShapePoint[]>();
shapePolyline.RecordNumber = br.ReadInt32();
shapePolyline.ContentLength = br.ReadInt32();
shapePolyline.ShapeType = br.ReadInt32();
shapePolyline.Box[] = br.ReadDouble();
shapePolyline.Box[] = br.ReadDouble();
shapePolyline.Box[] = br.ReadDouble();
shapePolyline.Box[] = br.ReadDouble();
shapePolyline.PartsCount = br.ReadInt32();
shapePolyline.PointsCount = br.ReadInt32(); //把每一段线的开始点偏移读进Parts队列
for (int i = ; i < shapePolyline.PartsCount; i++)
{
int tmpPart = br.ReadInt32();
shapePolyline.Parts.Add(tmpPart);
}
//把所有点读进Points队列
for (int i = ; i < shapePolyline.PointsCount; i++)
{
StructShapePoint tmpPoint = new StructShapePoint();
tmpPoint.X = br.ReadDouble();
tmpPoint.Y = br.ReadDouble();
shapePolyline.Points.Add(tmpPoint);
}
//把该线的点读进Lines队列
for (int i = ; i < shapePolyline.PartsCount; i++)
{
int startpoint;
int endpoint; if (i == shapePolyline.PartsCount - )
{
startpoint = (int)shapePolyline.Parts[i];
endpoint = shapePolyline.PointsCount;
}
else
{
startpoint = (int)shapePolyline.Parts[i];
endpoint = (int)shapePolyline.Parts[i + ];
}
StructShapePoint[] shpPointArray = new StructShapePoint[endpoint - startpoint];
for (int j = , k = startpoint; k < endpoint; j++, k++)
{
shpPointArray[j].X = shapePolyline.Points[k].X;
shpPointArray[j].Y = shapePolyline.Points[k].Y;
}
shapePolyline.Lines.Add(shpPointArray);
}
//把该线条加进m_polylines队列
ListPolylines.Add(shapePolyline);
}
}//end of : else if (ShpType == 3)
SetBaseParameter(Xmin, Ymin, Xmax, Ymax);
return true;
}
catch (System.Exception ex)
{
Console.WriteLine("异常:ClassShp.Init()" + ex.ToString());
return false;
}
} //################################################################################
// 把数据写成txt文本
//################################################################################
public void SaveAsTxt()
{
StreamWriter swLine = new StreamWriter(FileName+".txt");
swLine.WriteLine("绘图类型:{0}", ShapeType);
swLine.WriteLine("地图边界:({0}, {1}), ({2}, {3})", Xmin, Ymin, Xmax, Ymax);
swLine.WriteLine("地图大小:{0} * {1}", RawWidth, RawHeight);
swLine.WriteLine("地图中心:({0}, {1})", RawCenterX, RawCenterY); int recordCount = ;
if (ShapeType==)
{
foreach (StructShapePoint p in ListPoints)
{
swLine.WriteLine("点{0}: ({1}, {2})", recordCount, p.X, p.Y);
recordCount++;
}
}
else if (ShapeType== || ShapeType==)
{
foreach (StructShapePolyline p in ListPolylines)
{
for (int i = ; i < p.Lines.Count; i++)
{
swLine.WriteLine("记录内容{0}:########################################################", recordCount, i);
for (int j = ; j < p.Lines[i].Length; j++)
{
StructShapePoint ps = p.Lines[i][j];
swLine.WriteLine("线{0}: ({1}, {2})", j, ps.X, ps.Y);
}
}
recordCount++;
}//end of :foreach
}
swLine.Close();
} //################################################################################
// 把图绘进Bmp中
//################################################################################
public bool DrawBmp(int pmtWidth, int pmtHeight)
{
double screenWidth = RawWidth * Scale;
double screenHeight = RawHeight * Scale; try
{
Bmp = new Bitmap(pmtWidth, pmtHeight);//创建画布
Graphics g = Graphics.FromImage(Bmp); g.TranslateTransform((float), (float)pmtHeight);//变换坐标系,把左下角置为原点
g.ScaleTransform((float), (float)-); if (ShapeType == ) //点类型
{
foreach (StructShapePoint p in ListPoints)
{
PointF pf = new PointF();
double offsetX = CenterX - screenWidth / 2.0;
double offsetY = CenterY - screenHeight / 2.0;
pf.X = (float)((p.X - Xmin) * Scale + offsetX);
pf.Y = (float)((p.Y - Ymin) * Scale + offsetY);
float r = ;
//g.DrawEllipse(ThePen, pf.X - r / 2, pf.Y + r / 2, r * 2, r * 2);//画点
Brush bs = new SolidBrush(Color.Green);//填充的颜色
g.FillEllipse(bs, pf.X - r / , pf.Y + r / , r * , r * );
}
}
else if (ShapeType == 3 || ShapeType == 5) //线类型和面类型是一样的
{
//Console.WriteLine("线类型");
foreach (StructShapePolyline p in ListPolylines)
{
for (int i = ; i < p.Lines.Count; i++)
{
PointF[] pfArray = new PointF[p.Lines[i].Length];
for (int j = ; j < p.Lines[i].Length; j++)
{
StructShapePoint ps = p.Lines[i][j];
double offsetX = CenterX - screenWidth / 2.0;
double offsetY = CenterY - screenHeight / 2.0;
pfArray[j].X = (float)((ps.X - Xmin) * Scale + offsetX);
pfArray[j].Y = (float)((ps.Y - Ymin) * Scale + offsetY);
}
g.DrawLines(ThePen, pfArray);
}
}
} return true;
}
catch (System.Exception ex)
{
Console.WriteLine("异常:ClassShp.drawBmp" + ex.ToString());
return false;
}
}
}
}

在主窗口放置一个pictureBox控件,名为pictureBoxMap.

主函数:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging; namespace SDD
{
public partial class FormMain : Form
{
ClassShp ShapeChina; public FormMain()
{
InitializeComponent(); string mapChinaPathName = new ClassShp(@"D:\map\地图\国界.shp", pictureBoxMap.Width, pictureBoxMap.Height);
pictureBoxMap.Refresh();
}
private void pictureBoxMap_Paint(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap(pictureBoxMap.Width, pictureBoxMap.Height);//创建画布
ShapeChina.DrawBmp(pictureBoxMap.Width, pictureBoxMap.Height);
e.Graphics.DrawImage(ShapeChina.Bmp, , );
}
}
}

shp地图解析(不用AE)的更多相关文章

  1. 全国SHP地图数据赠送

    百度搜索:GIS之家获取全国SHP图层数据的方式:收藏(ArcGIS地图全国电子地图shp格式版本GIS地图数据.GIS开发顺德政府GIS公共服务共享平台),并且截图验证,验证通过后,收下邮箱,我把下 ...

  2. arcgis将图片转成shp地图

    打开arcMap 1.右键[图层]-[属性]-[坐标系]-[地理坐标系]-双击"WGS 1984" 2.右键[图层]-[添加数据],打开图片文件-Band_2 3.右键图片-[属性 ...

  3. C#读取shapefile文件(不用AE)

    1.创建工程文件,选窗体应用程序,命名为:EsriShpReader 2.添加SplitContainer控件到窗体 3.在SplitContainer.panel1中添加两个按钮Button,tex ...

  4. LocationCoder 地图经纬度解析

    LocationCoder 地图经纬度解析 其实,在地图里面将地图解析成有意义的地址,或者把地址转换成有意义的经纬度都是很容易的事情,只是我将其封装了支持KVO,通知中心,block取结果,代理取结果 ...

  5. 如何使用highmaps制作中国地图

    如何使用highmaps制作中国地图 文章目录 Highmaps 所需文件 地图初始化代码 highmaps 渲染讲解 highmaps 中国各城市坐标的json文件 highmaps 线上DEMO ...

  6. 将AE开发的专题图制作功能发布为WPS

    AE开发可以定制化实现ArcGIS的地理处理功能,并实际运用于其他方面的工作,有时候我们还希望将AE开发的功能发布为网络地理信息处理服务(WPS),从而能在Web端更自由便利地调用所需要的地学处理算法 ...

  7. 使用highmaps制作中国地图

    Highmaps 所需文件 http://code.highcharts.com/maps/highmaps.js(地图渲染的核心文件 必须引用)http://code.highcharts.com/ ...

  8. 使用R画地图数据

    用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...

  9. 只写104行代码!在nopCommerce中如何实现自动生成网站地图

    表告诉我说你不知道nopCommerce是什么.它是目前.NET中最流行的完全开源网上商城,由俄罗斯的团队在2008年开始立项一直开发到现在已经是3.3版本了.代码目前托管在codeplex上,有兴趣 ...

随机推荐

  1. JAVA 类中方法参数与返回值

    无参无返回值的方法,用public void 方法名,来声明: 有参无返回值的方法,用public void 方法名,来声明: 有参有返回值的方法,用public int 方法名(int i,int ...

  2. LInux SSH远程文件/目录传输命令scp(转载)

    From:http://www.vpser.net/manage/scp.html 相信各位VPSer在使用VPS是经常会在不同VPS间相互备份数据或转移数据.一般情况下VPS都已安装了Ngnix或者 ...

  3. 在VMware虚拟机中配置DOS汇编开发环境!!

    操作系统:win7 32位 DOS环境:DosBox  下载:http://www.dosbox.com/ 选择当前适合自己版本,下载就可以了. 汇编编译器:MASM 5.0 下载:http://do ...

  4. Python标准库的学习准备

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准 ...

  5. PDF按模板出力,多个PDF合并

                 const string   TEMP_PREXFIX = "Temp_";                                       ...

  6. iOS 程序打包,安装流程

    一.发布测试,是指将你的程序给   * 你的测试人员,因为程序总归是要测试的   * 你的客户,在正式发布之前,客户肯定是要先看(验收)的 在他们的iOS设备(iphone,ipod, ipad)安装 ...

  7. C++学习9 this指针详解

    this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址).通过 this,可以访问当前对象的成员变量和成员函数. 所谓当前对象,就是正在使用的对象,例如对于stu. ...

  8. [ActionScript 3.0] AS3 用于拖动对象时跟随鼠标的缓动效果

    package com.fylibs.components.effects { import flash.display.DisplayObject; import flash.events.Even ...

  9. [ActionScript 3.0] AS3 3D双圆环贴图

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieCl ...

  10. winmail安装完成后,SMTP/POP3/ADMIN/HTTP/IMAP/LDAP服务不能启动?

    问题原因: 1.特殊端口被占用,可以用命令netstat -ano 查看 2.阿帕奇网络服务 httpd 未开启 解决方案:开启服务后,登录管理工具,点注册,它会自动跳出"httpd通过防火 ...