使用wcf编写坐标字符串生成shapefile文件,在iis发布供前端调用
项目有一需求,需要由坐标字符串(格式:x,y,点名)生成shapefile,由于在前台开发类似功能比较麻烦而且也不适用,最终决定使用WCF来实现,不借助现有GIS软件,基于GDAL实现。
实现过程如下:
编写坐标对生成shapefile的坐标,并使用zipHelper将shapefile压缩成zip文件,返回前端下载,整个代码如下:
(1)编写坐标转换服务代码
[Description("坐标服务接口")]
[ServiceContract]
public interface ICoord2Shapefile
{
//[WebGet(UriTemplate = "{points}", ResponseFormat = WebMessageFormat.Json)]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json,UriTemplate="/")]
[Description("将坐标生成shapefile,并压缩打包")]
[OperationContract]
string point2zip(string points);
}
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Coord2ShapefileService : ICoord2Shapefile
{
public string point2zip(string points)
{
LogHelper.Info(points);
string zip = "";
//List<Location> locs = JsonHelper.DeserializeJsonToList<Location>(points);
try
{
List<Location> locs = new List<Location>();
string[] pps = points.Split(';');
for (int i = ; i < pps.Length; i++)
{
string[] pp = pps[i].Split(',');
double x = Convert.ToDouble(pp[]);
double y = Convert.ToDouble(pp[]);
Location loc = new Location() { X = x, Y = y, Name = pp[] };
locs.Add(loc);
}
if (locs != null && locs.Count > )
{
LogHelper.Info(string.Format("{0} 个点",locs.Count));
string shpfile = Path.GetTempFileName();
shpfile = shpfile.Substring(, shpfile.Length - ) + "shp";
LogHelper.Info(shpfile);
//shpfile = "e:\\aa.shp";
WriteVectorFileShp(shpfile, locs);
if (File.Exists(shpfile))
{
FileInfo fileinfo = new FileInfo(shpfile);
DirectoryInfo dirInfo = fileinfo.Directory;
string shpName = Path.GetFileNameWithoutExtension(shpfile);
List<string> files = new List<string>();
files.Add(shpfile);
files.Add(Path.Combine(dirInfo.FullName, shpName + ".prj"));
files.Add(Path.Combine(dirInfo.FullName, shpName + ".dbf"));
files.Add(Path.Combine(dirInfo.FullName, shpName + ".shx"));
//string zipFile = "d:\\point.zip";
string id = Guid.NewGuid().ToString();
string zipFile = string.Format("d:\\update\\temp\\{0}{1}{2}{3}{4}{5}{6}.zip", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);
//string zipFile = string.Format("d:\\{0}{1}{2}{3}{4}{5}{6}.zip", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);
//string zipFile = "www.simplemap.com.cn/update/temp";
int ret = ZipHelper.ZipFiles(zipFile, files.ToArray(), "data");
if (ret > )
{
foreach (var file in files)
{
try
{
File.Delete(file);
}
catch (Exception)
{
}
}
if (File.Exists(zipFile))
{
FileInfo ff = new FileInfo(zipFile);zip = "http://localhost/temp" + ff.Name;
}
}
}
else
{
LogHelper.Info(string.Format("{0} 不存在!", shpfile));
}
}
}
catch (Exception ex)
{
LogHelper.Error(ex.Message, ex);
}
return zip;
}
static void WriteVectorFileShp(String shapefile_path, List<Location> locs) //创建算法生产的边界矢量图
{
// 为了支持中文路径,请添加下面这句代码
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
// 为了使属性表字段支持中文,请添加下面这句
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");
// 注册所有的驱动
Ogr.RegisterAll();
LogHelper.Info("注册GDAL成功");
//创建数据,创建ESRI的shp文件
string strDriverName = "ESRI Shapefile";
Driver oDriver = Ogr.GetDriverByName(strDriverName);
if (oDriver == null)
{
Debug.WriteLine("%s 驱动不可用!\n", shapefile_path);
return;
}
// 步骤1、创建数据源
DataSource oDS = oDriver.CreateDataSource(shapefile_path, null);
if (oDS == null)
{
Debug.WriteLine("创建矢量文件【%s】失败!", shapefile_path);
return;
}
LogHelper.Info("创建矢量文件成功");
//步骤2、创建空间坐标系
OSGeo.OSR.SpatialReference oSRS = new OSGeo.OSR.SpatialReference("");
oSRS.SetWellKnownGeogCS("WGS84");
//步骤3、创建图层,并添加坐标系,创建一个多边形图层(wkbGeometryType.wkbUnknown,存放任意几何特征)
Layer oLayer = oDS.CreateLayer("地名", oSRS, wkbGeometryType.wkbPoint, null);
if (oLayer == null)
{
Debug.WriteLine("图层创建失败!");
return;
}
// 步骤4、下面创建属性表
FieldDefn oFieldPlotArea = new FieldDefn("Name", FieldType.OFTString); // 先创建一个叫PlotArea的属性
oFieldPlotArea.SetWidth();
// 步骤5、将创建的属性表添加到图层中
oLayer.CreateField(oFieldPlotArea, );
//步骤6、定义一个特征要素oFeature(特征要素包含两个方面1.属性特征2.几何特征)
foreach (var loc in locs)
{
FeatureDefn oDefn = oLayer.GetLayerDefn();
Feature oFeature = new Feature(oDefn); //建立了一个特征要素并将指向图层oLayer的属性表
//步骤7、设置属性特征的值
oFeature.SetField(, loc.Name);
OSGeo.OGR.Geometry pt = new Geometry(wkbGeometryType.wkbPoint);
pt.AddPoint(loc.X, loc.Y, );
oFeature.SetGeometry(pt);
//OSGeo.OGR.Geometry geomTriangle = OSGeo.OGR.Geometry.CreateFromWkt(wkt);//创建一个几何特征
//步骤8、设置几何特征
//oFeature.SetGeometry(geomTriangle);
//步骤9、将特征要素添加到图层中
oLayer.CreateFeature(oFeature);
}
oDS.Dispose();
LogHelper.Info("数据集创建完成!");
//Debug.WriteLine("数据集创建完成!");
}
}
public class Location
{
public double X { get; set; }
public double Y { get; set; }
public string Name { get; set; }
}
(2)由于GDAL只能在x86下使用,将目标平台编译成x86。
(3)创建一个空网站,添加Service.svc服务文件,内容如下:
<%@ ServiceHost Language="C#" Debug="true" Service="CoordService.Coord2ShapefileService" %>
(4)设置web.config的配置文件
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="%logger\%date{yyyy-MM-dd}\log.txt"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %message%newline"/>
</layout>
</appender>
<root>
<appender-ref ref="LogFileAppender"/>
</root>
<logger name="Logger" additivity="false">
<level value="All"/>
<appender-ref ref="LogFileAppender"/>
</logger>
</log4net> <system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web> <system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
<services>
<!--behaviorConfiguration属性开通服务的元数据发布服务,无此属性,服务的元数据发布无法使用,但服务中的功能可以调用-->
<service name="CoordService.Coord2ShapefileService" behaviorConfiguration="metadataExchange">
<!--终结点不加behaviorConfiguration属性,无法调用服务中的功能,会出现“由于 AddressFilter 在 EndpointDispatcher 不匹配”的错误-->
<endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBinding_Default" contract="CoordService.ICoord2Shapefile" behaviorConfiguration="webHttp"/>
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="webHttpBinding_Default" maxReceivedMessageSize="" />
</webHttpBinding>
</bindings>
<behaviors>
<!--开通服务的元数据发布-->
<serviceBehaviors>
<behavior name="metadataExchange">
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp helpEnabled="True"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
(5)创建IIS宿主服务
a.创建应用程序池,目标平台.net4.0,应用32位应用程序=True,这个很重要,因为服务是32位的。
b.在默认网站下,添加应用程序目标,指向网站目录。
(6)测试
a.由于坐标字符串生成shapefile文件时,前台给生成传入的字符串比较多,只能使用POST请求,而且还需要在配置文件中添加如下配置信息:
<webHttpBinding>
<binding name="webHttpBinding_Default" maxReceivedMessageSize="" />
</webHttpBinding>
b.使用fiddler测试,选择Composer页,见下图:

使用wcf编写坐标字符串生成shapefile文件,在iis发布供前端调用的更多相关文章
- java读取字符串,生成txt文件
/** * 读取字符串,生成txt 文件 已解决未设置编码时,在项目中直接打开文件,中文乱码问题 * WriteText.writeToText(musicInfo,fileName)直接调用 * * ...
- asp.net MVC设计模式中使用iTextSharp实现html字符串生成PDF文件
因个人需求,需要将html格式转换成PDF并加上水印图片.于是乎第一次接触这种需求的小菜鸟博主我,在某度搜索引擎上不断的查阅关键字资料.踩坑,终于有了一个相应的解决方案.以下是解决步骤,记录下来方便以 ...
- C#调用exe文件,IIS发布后无法掉用本地exe程序的解决方法
http://blog.csdn.net/junjieking/article/details/6277836?reload这位楼主的问题,我也遇到了,但是我按照他那样操作并没有解决问题,弄了好久终于 ...
- Asciidoctor-pdf生成pdf文件
本文使用asciidoc语法编写. = Asciidoctor-pdf生成pdf文件 Pinnsvin Pinnsvin@163.com v1.0 {docdate} :plantuml-server ...
- bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢?
bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢? 如果用sublime的话如何实现代码保存后浏览器刷新成最新的代码样式? 或者有什么其他好用的工具? 从网上找了很多方法 ...
- Shapefile文件中的坐标绘制到屏幕时的映射模式设置
pDC->SetMapMode(MM_ANISOTROPIC ); //首先选择MM_ANISOTROPIC映射模式,其它映射模式都不合适 pDC->SetWindowExt( max(a ...
- 用eclipse编写Android程序时怎样生成apk文件
转载请注明出处:http://blog.csdn.net/ns_code/article/details/16828449 APK是Android Package的缩写,即Android安装包.通过将 ...
- 在visual studio code和visual studio中编写TypeScript文件自动生成JavaScript文件
注:此处的自动生成都为保存ts文件时自动生成js文件 VS CODE 只需要在TypeScript的终端控制台中输入如下命令即可,并注意需要将其中的*换成对应的文件名,此处的*似乎不能作为通用匹配. ...
- Android NDK 初探,生成so文件以及调用so文件方法
因为最近业务上涉及安全的问题 然后有一些加密解密的方法和key的存储问题 本来想存储到手机里面,但是网上说一般敏感信息不要存储到手机Sdcard上 而且我这个如果从网络建立通信获取的话,又太耗时,所以 ...
随机推荐
- 四大组件之一---------activity的知识
activity的生命活动 activity的四种启动模式 Android中以一个任务栈用来管理activity 一个栈的形式进行管理 在清单文件中,通过<activity>标签的andr ...
- Java单例模式的各种实现(饿汉、懒汉、静态内部类、static代码块、enum枚举类型)
饿汉模式 饿汉模式就是立即加载,在方法调用前,实例就已经被创建了,所以是线程安全的. public class MyObject1 { private static MyObject1 myObjec ...
- 修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!
内容提要:复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!在电脑里装了VMware后,再要装xampp,十有八九就会出现这个问题: 复 ...
- 为什么你应该抛弃Express的视图渲染引擎
Nodejs Express框架的一个被人们广为使用的特性是它的渲染引擎.Express视图渲染引擎允许Controller提供一个视图名称和视图模型对象给Express,然后返回由HTTP响应流输出 ...
- C++ 网络爬虫实现
最近有个概念吵得很火,网络爬虫,但是基本都是用什么python或者JAVA写,貌似很少看到用c++写的,我在网上找了一个,看到其实还是很简单的算法 算法讲解:1.遍历资源网站 2.获取html信息 ...
- 关于bootstrap原理及优缺点
网格系统的实现原理,是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统.Bootstrap框架中的网格系统 ...
- CentOS 7 Root用户密码重置 2017-04-02
跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 开机的时候按e (如果正在使用,你可以输入reboot,然后赶紧按回车键,也可 ...
- [android] 手机卫士黑名单功能(ListView结合SQLite增删改)
修改界面,在顶部横条上增加一个添加按钮,点击打开一个自定义对话框,输入电话号码和拦截模式保存到数据库 自定义对话框看这篇http://www.cnblogs.com/taoshihan/p/53703 ...
- iOS 文件下载和打开
最近的项目要用到一个在线报告的下载,于是完成后自己在理一下思路,大体的实现了我要得需求. 话不多说,直接上代码 首先,取到网络文件的链接,进行判段是否需求再次下载还是直接打开 #pragma mark ...
- Myeclipse8.5开发-安装一:Myeclipse8.5注册码生成程序
环境:Myeclipces8.5 1.安装Myeclipces8.5. 2.打开Myeclipces新建任意项目. 3.新建MyEclipseKeyGen.java类.点击运行,控制台输入您的注册名, ...