flex 中GML转换_iteye_17466的博客-程序员秘密

技术标签: 技术杂绘  

  package org.openscales.core.format
  {
  import flash.utils.getQualifiedClassName;
  import flash.xml.XMLNode;
  import org.openscales.core.Util;
  import org.openscales.core.feature.Feature;
  import org.openscales.core.geometry.Collection;
  import org.openscales.core.geometry.LineString;
  import org.openscales.core.geometry.LinearRing;
  import org.openscales.core.geometry.MultiLineString;
  import org.openscales.core.geometry.MultiPoint;
  import org.openscales.core.geometry.MultiPolygon;
  import org.openscales.core.geometry.Point;
  import org.openscales.core.geometry.Polygon;
  import org.openscales.proj4as.Proj4as;
  import org.openscales.proj4as.ProjPoint;
  import org.openscales.proj4as.ProjProjection;
  import org.openscales.core.feature.Feature;
  import org.openscales.core.feature.PointFeature;
  import org.openscales.core.feature.MultiPointFeature;
  import org.openscales.core.feature.LineStringFeature;
  import org.openscales.core.feature.MultiLineStringFeature ;
  import org.openscales.core.feature.PolygonFeature;
  import org.openscales.core.feature.MultiPolygonFeature;
  import org.openscales.core.Trace;
  /**
  * Read/Write GML. Supports the GML simple features profile.
  */
  public class GMLFormat extends Format
  {
  protected var _featureNS:String = "http://openscales.org/OpenScales";
  protected var _featureName:String = "featureMember";
  protected var _featurePrefix:String = "OpenScales";
  protected var _layerName:String = "features";
  protected var _geometryName:String = "geometry";
  protected var _collectionName:String = "FeatureCollection";
  protected var _gmlns:String = "http://www.opengis.net/gml";
  protected var _gmlprefix:String = "gml";
  protected var _wfsns:String = "http://www.opengis.net/wfs";
  protected var _wfsprefix:String = "wfs";
  private var _extractAttributes:Boolean = true;
  private var _dim:Number;
  /**
  * GMLFormat constructor
  *
  * @param extractAttributes
  *
  */
  public function GMLFormat(extractAttributes:Boolean = true) {
  this.extractAttributes = extractAttributes;
  }
  /**
  * Read data
  *
  * @param data data to read/parse.
  *
  * @return features.
  */
  override public function read(data:Object):Object {
  var dataXML:XML = null;
  if (typeof data == "string") {
  dataXML = new XML(data);
  } else {
  dataXML = XML(data);
  }
  var featureNodes:XMLList = dataXML..*::featureMember;
  if (featureNodes.length() == 0) { return []; }
  var dim:int;
  var coordNodes:XMLList = featureNodes[0].*::posList;
  if (coordNodes.length() == 0) {
  coordNodes = featureNodes[0].*::pos;
  }
  if (coordNodes.length() > 0) {
  dim = coordNodes[0][email protected]*::srsDimension;
  }
  this.dim = (dim == 3) ? 3 : 2;
  var features:Array = [];
  for (var i:int = 0; i Array = new Array();
  var feature:Feature = null;
  if (xmlNode..*::MultiPolygon.length() > 0) {
  var multipolygon:XML = xmlNode..*::MultiPolygon[0];
  geom = new MultiPolygon();
  var polygons:XMLList = multipolygon..*::Polygon;
  for (var i:int = 0; i 0) {
  var multilinestring:XML = xmlNode..*::MultiLineString[0];
  geom = new MultiLineString();
  var lineStrings:XMLList = multilinestring..*::LineString;
  for (i = 0; i 0) {
  var multiPoint:XML = xmlNode..*::MultiPoint[0];
  geom = new MultiPoint();
  var points:XMLList = multiPoint..*::Point;
  for (i = 0; i 0) {
  var polygon2:XML = xmlNode..*::Polygon[0];
  geom = this.parsePolygonNode(polygon2);
  } else if (xmlNode..*::LineString.length() > 0) {
  var lineString2:XML = xmlNode..*::LineString[0];
  p = this.parseCoords(lineString2);
  if (p) {
  geom = new LineString(p);
  }
  } else if (xmlNode..*::Point.length() > 0) {
  var point:XML = xmlNode..*::Point[0];
  geom = new MultiPoint();
  p = this.parseCoords(point);
  if (p) {
  geom.addComponent(p[0]);
  }
  }
  if (geom) {
  // Test more specific geom before because for is operator, a lineString is a multipoint for example (inheritance)
  if (geom is MultiPolygon) {
  feature = new MultiPolygonFeature(geom as MultiPolygon);
  } else if (geom is Polygon) {
  feature = new PolygonFeature(geom as Polygon);
  } else if (geom is MultiLineString) {
  feature = new MultiLineStringFeature(geom as MultiLineString);
  } else if (geom is LineString) {
  feature = new LineStringFeature(geom as LineString);
  } else if (geom is MultiPoint) {
  feature = new MultiPointFeature(geom as MultiPoint);
  } else if (geom is Point) {
  feature = new PointFeature(geom as Point);
  } else {
  Trace.warning("GMLFormat.parseFeature: unrecognized geometry);");
  return null;
  }
  feature.name = [email protected];
  if (this.extractAttributes) {
  feature.attributes = this.parseAttributes(xmlNode);
  }
  return feature;
  } else {
  return null;
  }
  }
  /**
  * Parse attributes
  *
  * @param node A XML feature node.
  *
  * @return An attributes object.
  */
  public function parseAttributes(xmlNode:XML):Object {
  var nodes:XMLList = xmlNode.children();
  var attributes:Object = {};
  for(var i:int = 0; i array size
  var rings:Array = new Array(linearRings.length());
  for (var i:int = 0; i array of coords
  */
  public function parseCoords(xmlNode:XML):Array {
  var x:Number, y:Number, left:Number, bottom:Number, right:Number, top:Number;
  var points:Array = new Array();
  if (xmlNode) {
  var coordNodes:XMLList = xmlNode.*::posList;
  if (coordNodes.length() == 0) {
  coordNodes = xmlNode.*::pos;
  }
  if (coordNodes.length() == 0) {
  coordNodes = xmlNode.*::coordinates;
  }
  var coordString:String = coordNodes[0].text();
  var nums:Array = (coordString) ? coordString.split(/[, \n\t]+/) : [];
  while (nums[0] == "")
  nums.shift();
  while (nums[nums.length-1] == "")
  nums.pop();
  for(var i:int = 0; i ");
  for (var i:int=0; i ");
  geomContainer.appendChild(geometryNode);
  var featureNode:XML = new XML("");
  var featureContainer:XML = new XML("");
  featureContainer.appendChild(geomContainer);
  for(var attr:String in feature.attributes) {
  var attrText:XMLNode = new XMLNode(2, feature.attributes[attr]);
  var nodename:String = attr;
  if (attr.search(":") != -1) {
  nodename = attr.split(":")[1];
  }
  var attrContainer:XML = new XML("");
  attrContainer.appendChild(attrText);
  featureContainer.appendChild(attrContainer);
  }
  featureNode.appendChild(featureContainer);
  return featureNode;
  }
  /**
  * create a GML Object
  *
  * @param geometry
  *
  * @return an XML
  */
  public function buildGeometryNode(geometry:Object):XML {
  var gml:XML;
  if (getQualifiedClassName(geometry) == "org.openscales.core.geometry::MultiPolygon"
  || getQualifiedClassName(geometry) == "org.openscales.core.geometry::Polygon") {
  gml = new XML("");
  var polygonMember:XML = new XML("");
  var polygon:XML = new XML("");
  var outerRing:XML = new XML("");
  var linearRing:XML = new XML("");
  linearRing.appendChild(this.buildCoordinatesNode(g eometry.components[0]));
  outerRing.appendChild(linearRing);
  polygon.appendChild(outerRing);
  polygonMember.appendChild(polygon);
  gml.appendChild(polygonMember);
  }
  else if (getQualifiedClassName(geometry) == "org.openscales.core.geometry::MultiLineString"
  || getQualifiedClassName(geometry) == "org.openscales.core.geometry::LineString") {
  gml = new XML("");
  var lineStringMember:XML = new XML("");
  var lineString:XML = new XML("");
  lineString.appendChild(this.buildCoordinatesNode(g eometry));
  lineStringMember.appendChild(lineString);
  gml.appendChild(lineStringMember);
  }
  else if (getQualifiedClassName(geometry) == "org.openscales.core.geometry::MultiPoint") {
  gml = new XML("");
  var parts:Object = "";
  parts = geometry.components;
  for (var i:int = 0; i ");
  var point:XML = new XML("");
  point.appendChild(this.buildCoordinatesNode(parts[ i]));
  pointMember.appendChild(point);
  gml.appendChild(pointMember);
  }
  } else if (getQualifiedClassName(geometry) == "org.openscales.core.geometry::Point") {
  parts = geometry;
  gml = new XML("");
  gml.appendChild(this.buildCoordinatesNode(parts));
  }
  return gml;
  }
  /**
  * Builds the coordinates XmlNode
  *
  * @param geometry
  *
  * @return created xmlNode
  */
  public function buildCoordinatesNode(geometry:Object):XML {
  var coordinatesNode:XML = new XML("");
  [email protected] = ".";
  [email protected] = ",";
  [email protected] = " ";
  var points:Array = null;
  if (geometry.components) {
  if (geometry.components.length > 0) {
  points = geometry.components;
  }
  }
  var path:String = "";
  if (points) {
  for (var i:int = 0; i < points.length; i++) {
  if (this.internalProj != null && this.externalProj != null)
  (points[i] as Point).transform(this.internalProj, this.externalProj);
  path += points[i].x + "," + points[i].y + " ";
  }
  } else {
  if (this.internalProj != null && this.externalProj != null) {
  var p:ProjPoint = new ProjPoint(geometry.x, geometry.y);
  Proj4as.transform(internalProj, externalProj, p);
  geometry.x = p.x;
  geometry.y = p.y;
  }
  path += geometry.x + "," + geometry.y + " ";
  }
  coordinatesNode.appendChild(path);
  return coordinatesNode;
  }
  //Getters and Setters
  public function get extractAttributes():Boolean {
  return this._extractAttributes;
  }
  public function set extractAttributes(value:Boolean):void {
  this._extractAttributes = value;
  }
  public function get dim():Number {
  return this._dim;
  }
  public function set dim(value:Number):void {
  this._dim = value;
  }
  public function get internalProj():ProjProjection {
  return this._internalProj;
  }
  public function set internalProj(value:ProjProjection):void {
  this._internalProj = value;
  }
  public function get externalProj():ProjProjection {
  return this._externalProj;
  }
  public function set externalProj(value:ProjProjection):void {
  this._externalProj = value;
  }
  }
  }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_17466/article/details/82362588

智能推荐

对5G的认识_认识5g发展5g_即使不为人所道的博客-程序员秘密

认识5G一、5G性能指标流量密度达到10Mbps/m2以上连接数密度达到100万/Km2空中接口时延低至1ms,满足自动驾驶、远程医疗等实时应用。移动性支持500km/h的高速移动。每消耗单位能量可以传送的数据量达到100倍单位时间内用户获得MAC层用户面数据传送量,连续广域覆盖和高移动性下,用户体验速率达到100Mbit/s每小区或单位面积内,单位频谱资源提供的吞吐量,.频谱效率要比LTE提升3倍以上峰值速率需要达到10-20Gbit/s二、5G与4

Opencv学习笔记(一)_码农潘少的博客-程序员秘密

什么是OpenCVOpenCV是一个开源的计算机视觉库,可以从http://opencv.org获取。OpenCV库用C和C++语言编写,可以在Windows、Linux、MacOS等系统运行。同时也积极开发Python、Java、Matlab以及其他一些语言的接口。从Git获取最新的OpenCV在Windows上,如果想要从Git获取OpenCV最新版本,你需要访问https://gitbub.com/opencv/opencv.git在linux上,只需要输入如下指令:git clone ht

[RK3399][Android7.1] 调试笔记 --- Android7.1 Launcher选择位置_KrisFei的博客-程序员秘密

Platform: RK3399OS: Android 7.1Kernel: v4.4.83一开始没找到在哪选择切换Launcher,记录下。步骤:1. 进入Settings app2. Apps3. Settings4. Home app参考:How to set home launcher in Android 7.0 Nougat and 8.0 Oreo...

进程间通信之信号讲解_sa_siginfo_IT女孩儿的博客-程序员秘密

信号进程间通信的另外一种方式-----信号文章目录信号前言一、终端shell命令发送信号二、信号的种类三、相关的接口函数1.信号的发送2.捕捉信号并改变信号的响应动作(重点)3.另外一组信号的收发函数总结前言kill -l 查看linux系统中定义的所有信号,程序员是不可以自定义信号提示:以下是本篇文章正文内容,下面案例可供参考一、终端shell命令发送信号1)kill -信号的序号 进程的id例如 kill -9 20000kill -KILL 20000kill -

python 自动登录CJLU校园网_portal2 cjlu edu_Arckal的博客-程序员秘密

python 自动登录CJLU校园网现在很多高校学生公寓上网采用校园网认证+运营商认证的方案,每次电脑开机都需要先连校园网,再连外网,很麻烦,所以我写了个自动联网的程序,简化联网步骤。具体思路是先在本地电脑上进行抓包,捕捉浏览器登录流量,分析校园网认证过程。然后通过程序模拟浏览器行为,提交认证表单给服务器,完成认证。下面贴出源代码:#!/usr/bin/env python# coding=utf

qt 分辨率问题 安卓_Qt移动应用开发(一):适配不同的屏幕_weixin_39611546的博客-程序员秘密

Qt移动应用开发(一):适配不同的屏幕到眼下为止。Qt5.3已经出现非常长一段时间了。而且已经有一些应用使用Qt进行构建了。我自己也完毕了第一款使用Qt构建的手机游戏《吃药了》。那么接下来的几篇文章主要向大家分享我是如何使用Qt进行移动开发的。Qt移动应用开发分为多篇博客文章,每一篇文章都力求精简不罗嗦。力求为大家提供一个快捷的參考。我在这里也主要将使用Qt制作《吃药了》的方法技巧一一分享给大家。...

随便推点

tcpserver_tcp server_BillyJue的博客-程序员秘密

libevent VS下的编译参考:https://blog.csdn.net/swartz_lubel/article/details/55809970直接进入代码目录,输入nmake /f Makefile.nmake报如下错误:需要在 #include &lt;stdint.h&gt; 然后编译成功,生成libevent_core.lib libevent_extras.lib libevent.lib导入如下库#pragma comment(lib, "Iphlpapi.lib")

[扫描线-线段树] [CQOI2017]Day2 T1 老C的任务_锑元素使者的博客-程序员秘密

题目描述传送门老C是个程序员。最近老C从老板那里接到了一个任务——给城市中的手机基站写个管理系统。作为经验丰富的程序员,老C轻松地完成了系统的大部分功能,并把其中一个功能交给你来实现。由于一个基站的面积相对于整个城市面积来说非常的小,因此每个的基站都可以看作坐标系中的一个点,其位置可以用坐标(x,y)来表示。此外,每个基站还有很多属性,例如高度、功率等。运营商经常会划定一个区域,并查询区域中所有基站的信息。现在你需要实现的功能就是,对于一个给定的矩形区域,回答该区域中(包括区域边界上的)所有基站的

凸优化:邻近点梯度法、交替方向乘子法、次梯度法 matlab实现_交叉方向乘子法matlab代码_无聊的小把戏的博客-程序员秘密

问题描述考虑线性测量 b=Ax+e,其中 b 为 50 维的测量值,A 为 50ⅹ100 维的测量矩阵,x 为 100维的未知稀疏向量且稀疏度为 5,e 为 50 维的测量噪声。从 b 与 A 中恢复 x 的一范数规范化最小二乘模型如下:min&nbsp;12∣∣Ax−b∣∣22+p∣∣x∣∣1min \ \frac{1}{2}||Ax-b||_2^2 + p||x||_1min&nbsp...

potplay alist(alist+potplayer打造个人高清影视)_叶涛网站推广优化的博客-程序员秘密

alist+potplayer打造个人影音仓库,实现网盘本地播放,potplay alist高清影视在线观看.配置PotPlayer时先部署Alist及挂载存储打开播放器,再打开播放列表,点击【新建专辑】

ViewPager,ScrollView 嵌套ViewPager滑动冲突解决_Luyifei666的博客-程序员秘密

ViewPager,ScrollView 嵌套ViewPager滑动冲突解决本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布这篇博客主要讲解一下几个问题 - 粗略地介绍一下View的事件分发机制 - 解决事件滑动冲突的思路及方法 - ScrollView 里面嵌套ViewPager导致的滑动冲突 - ViewPager里面嵌套ViewPager 导

【函数】wm_concat包的订制_weixin_30516243的博客-程序员秘密

【函数】wm_concat包的订制 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 利用系统包创建WM_CONCAT函数(重点) ② ORA-00904: "wm_concat":invalid identifier错误解决 ③...