问题

  • 根据给定的gps点point(x,y)和北京的shape数据,关联出 AOI ID

IO

  • 输入

    • gps点表
    • create table gps
      (
         x double, //经度
         y double //纬度
      )
      

      +------------+------------+
      | x | y |
      +------------+------------+
      | 113.570517 | 22.149751 |
      | 113.57431 | 22.152167 |
      | 113.544971 | 22.190477 |
      | 113.546035 | 22.203194 |
      | 113.568557 | 22.168465 |

    • shape文件
    • ogrinfo -ro -al beijing_20160122152124568.shp
      
      OGRFeature(beijing_20160122152124568):
        AOIID (String) = G00AOI000001ZIQ3
        POIID (String) = B0FFFTLAU4
        Name (String) = ˮѧԺԺ
        Type (String) =
        Disp_Class (Integer) =
        Reference (String) = (null)
        ParentID (String) = (null)
        CenterX (Real) = 116.322184
        CenterY (Real) = 39.931526
        Area (Real) = 19187.288500
        CreateTime (String) = -- :
        UpdateTime (String) = -- :
        Update (String) = u
        CityName (String) =   Memo (String) =   POLYGON ((418756.3848 143755.6608,418756.5396 143755.7688,418759.47 143755.7688,418760.8884 143755.7616,418760.8884 143754.616799999989,418761.9324 143754.5628,418763.556 143754.5376,418763.624399999972 143753.8716,418763.9304 143753.810399999988,418763.898 143751.5064,418756.395599999989 143751.733199999988,418756.395599999989 143753.263199999987,418756.3848 143755.6608))
  • 输出  
    • 根据gps表中点,判断是否内含与shape文件的polygon中,关联出AOIID
    • 输出表
    • +------------+------------+--------+
      | x          | y          | aoi_id |
      +------------+------------+--------+
      | 419217.2568 | 143807.9436 | NULL   |
      | 418659.14879999997 | 143630.046 | NULL   |
      | 418659.6312 | 143629.9848 | NULL   |
      | 418024.2636 | 143054.75519999999 | NULL   |
      | 419875.88399999996 | 143947.60199999998 | NULL   |
      | 418042.9692 | 143037.2556 | NULL   |
      | 418469.9436 | 144192.348 | NULL   |
      | 418469.9436 | 144192.348 | G00AOI000001WBC2 |
      | 420292.3248 | 143810.84879999998 | NULL   |
      | 418509.26279999997 | 143762.994 | NULL   |

知识点

  • GDAL/ogr2ogr使用
  • JTS geometry内含判断
  • JTS Rtree使用

数据准备

  • shape文件

    • 提取wkt和aoiid字段
    • ogr2ogr -lco "GEOMETRY=AS_WKT" -lco "SEPARATOR=SEMICOLON" -f CSV beijing_20160122152124568.csv -sql "select AOIID from beijing_20160122152124568" beijing_20160122152124568.shp 
    • 去掉文件中的双引号
    • sed -e '/"/s/"//g' beijing_20160122152124568.csv > beijing.csv
    • odps中创建表
    • create table beijing(wkt string,lua_id bigint);
    • 上传文件
    • tunnel u -fd ';' beijing.csv.csv autonavi_tinfo_dev.exercise_land_user_area; //列之间按照";"分割 
    • 将表作为资源文件加入odps
    • add table beijing

编码

  • udtf
  • import java.util.Iterator;
    import java.util.List;
    
    import com.aliyun.odps.udf.ExecutionContext;
    import com.aliyun.odps.udf.UDFException;
    import com.aliyun.odps.udf.UDTF;
    import com.aliyun.odps.udf.annotation.Resolve;
    import com.vividsolutions.jts.geom.Coordinate;
    import com.vividsolutions.jts.geom.Envelope;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.Point;
    import com.vividsolutions.jts.geom.Polygon;
    import com.vividsolutions.jts.index.strtree.STRtree;
    import com.vividsolutions.jts.io.WKTReader;
    
    /**
     * 加载table中的资源,字段如: wkt string ,bigint lua_id 参数: x,y,tableName,idxWkt,idxId
     *
     * @author xingxing.dxx double,double,string,bigint,bigint->double,double,string
     *
     */
    @Resolve({ "double,double->double,double,string" })
    public class ExerciseWithinUDTF extends UDTF {
    
        /*
         * private Logger LOGGER =
         * LoggerFactory.getLogger(ExerciseWithinUDTF.class);
         */
    
        private GeometryFactory geometryFactory = new GeometryFactory();
        private WKTReader reader = new WKTReader(geometryFactory);
        private STRtree strtree;
        private ExecutionContext ctx;
    
        public void setup(ExecutionContext ctx) throws UDFException {
            this.ctx = ctx;
        }
    
        @Override
        public void process(Object[] args) throws UDFException {
    
            final double x = (double) args[0];
            final double y = (double) args[1];
            String tableName = (String) args[2];
            int idxWkt = ((Long) args[3]).intValue();
            int idxId = ((Long) args[4]).intValue();
    
            // 1.初始化,第一次才加载表资源
            if (strtree == null) {
                strtree = new STRtree();
                try {
                    Iterator<Object[]> iterator = this.ctx.readResourceTable(tableName).iterator();
                    while (iterator.hasNext()) {
                        Object[] o = iterator.next();
                        String wkt = (String) o[idxWkt];
                        String id = (String) o[idxId];
                        Polygon polygon = (Polygon) reader.read(wkt);
                        GeometryBean gb = new GeometryBean(polygon, id);
                        strtree.insert(polygon.getEnvelopeInternal(), gb);
                    }
    
                } catch (Exception e) {
                    /* LOGGER.error("资源加载出现问题",e); */
                    e.printStackTrace();
                    throw new RuntimeException(e.getMessage());
    
                }
            }
    
            Coordinate coord = new Coordinate(x, y);
            Point point = geometryFactory.createPoint(coord);
            Envelope envelope = new Envelope(coord);
            List<GeometryBean> items = strtree.query(envelope);
            String luaId = null;
            if (items != null && items.size() > 0) {
                for (Object o : items) {
                    GeometryBean geometryBean = (GeometryBean) o;
                    if (point.within(geometryBean.getPolygon())) {
                        luaId = geometryBean.getId();
                    }
                    forward(x, y, luaId);
                }
            } else {
                forward(x, y, luaId);
            }
    
        }
    
        public void close() throws UDFException {
    
        }
    
    }
  • sql
  • CREATE TABLE result_gps_within
    AS
    SELECT
        udtf_exercise_within(x,y,,)
        as(x,y,aoi_id)
       FROM gps 
  • SELECT a.aoi_id,count(distinct x,y) num
      FROM
         (
          SELECT
              udtf_exercise_within(x*,y*,,)
              as(x,y,aoi_id)
            FROM gps
         ) a where aoi_id is not null
     GROUP BY a.aoi_id 

碰到的坑

  • shape文件是秒的格式,需要转换成度
  • ogr2ogr转成的csv文件需要去掉双引号,否则不能反序列化为polygon
  • udtf读取资源文件需要把表当做资源添加

UDF2的更多相关文章

  1. DB2 嵌入式应用中定义游标(开放平台上)

    DECLARE CURSOR statement The DECLARE CURSOR statement defines a cursor. Invocation Although an inter ...

  2. AnonymousType匿名类型和对象之间的转换

    本文转载:http://www.cnblogs.com/dean-Wei/p/3150553.html 一.匿名对象转换为对象. 1.问题: 2.解决方案:强制指定类型. 解决之. 二. 对象转换为匿 ...

  3. mysql常用的提权方法

    一,利用MOF提权 Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件: 方法 1: 运行 MOF 文件指定为命令行参数将 Mofcomp. ...

  4. 【Spark篇】---SparkSql之UDF函数和UDAF函数

    一.前述 SparkSql中自定义函数包括UDF和UDAF UDF:一进一出  UDAF:多进一出 (联想Sum函数) 二.UDF函数 UDF:用户自定义函数,user defined functio ...

  5. Spark SQL UDF示例

    UDF即用户自定函数,注册之后,在sql语句中使用. 基于scala-sdk-2.10.7,Spark2.0.0. package UDF_UDAF import java.util import o ...

  6. 【Spark篇】---SparkSQL中自定义UDF和UDAF,开窗函数的应用

    一.前述 SparkSQL中的UDF相当于是1进1出,UDAF相当于是多进一出,类似于聚合函数. 开窗函数一般分组取topn时常用. 二.UDF和UDAF函数 1.UDF函数 java代码: Spar ...

  7. 【Spark-SQL学习之三】 UDF、UDAF、开窗函数

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  8. Windows XP UDF 2.5 补丁,播放蓝光ISO光盘必备

    蓝光光盘的文件系统是UDF2.5,Windows XP及以下的操作系统默认不能支持这个文件系统.当我们在XP系统中使用蓝光光盘或蓝光ISO文件时,就会提示“Windows不能从此盘读取,此盘可能已损坏 ...

  9. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十五)Spark编写UDF、UDAF、Agg函数

    Spark Sql提供了丰富的内置函数让开发者来使用,但实际开发业务场景可能很复杂,内置函数不能够满足业务需求,因此spark sql提供了可扩展的内置函数. UDF:是普通函数,输入一个或多个参数, ...

随机推荐

  1. 基于SWFUpload的angular上传组件

    回顾 由于工作内容比较多,特别是架构方面,需要耗费很多的时间调整.重构,因此很久没有写文章了. 话就不多说了,直接进入主题. 实现 首先分析一下SWFUpload初始化的时候,需要传入当前触发上传的元 ...

  2. Raspberry Pi 3 Model B 安装 OSMC

    Raspberry Pi 3 Model B 自身搭载 WIFI 芯片,可直接连接无线网络. 准备 NOOBS 你可以购买预装有 NOOBS 的 SD 卡,或者从树莓派官网 下载 NOOBS.zip ...

  3. JS事件委托的原理和应用

    js事件委托也叫事件代理,实际上事件委托就是通过事件冒泡实现的,所谓的事件就是onclick,onmouseover,ondown等等,那么委托呢?委托就是指本来这个事是要你自己做的,但是你却让别人帮 ...

  4. 浅析I/O模型及其设计模式

    前言 I/O在软件开发中的重要性无需多言,无论是在操作系统.网络协议.DBMS这种底层支撑软件还是在移动APP,大型网站服务器等应用软件的开发中都是最核心最重要的部分.特别是现在软件服务使用量和数据量 ...

  5. [mysql]brew 安装 配置 操作 mysql(中文问题)

    mac 下卸载mysqldmg mac下mysql的DMG格式安装内有安装文件,却没有卸载文件--很郁闷的事. 网上搜了一下,发现给的方法原来得手动去删. 很多文章记述要删的文件不完整,后来在stac ...

  6. 开放产品开发(OPD):OPD框架

    在 开放产品开发(OPD):开篇 中讲了一下OPD是什么,以及它主要指引的方法,这篇文字将给大家介绍一下OPD框架. 一个公司有三种经营模式,像游戏代理的属于运营型,做企业定制项目管理软件的属于项目型 ...

  7. HT for Web中3D流动效果的实现与应用

    流动效果在3D领域有着广泛的应用场景,如上图中医学领域可通过3D的流动直观的观察人体血液的流动,燃气领域可用于监控管道内流动的液体或气体的流向.流速和温度等指标. 如今企业数据中心机房普遍面临着设备散 ...

  8. 《构建之法》第8、9、10章的读后感和第一个sprint总结

    第八章——主要介绍软件需求. 主要步骤:1.获取和引导需求.2.分析和定义需求.3.验证需求.4.在软件产品的生命周期中管理需求. 对软件需求的划分:1.对产品功能性的需求.2.对产品开发过程的需求. ...

  9. SQL Server中的连接查询【内连接,左连接,右连接,。。。】

    在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...

  10. .net reflector激活

    1.断网 2. 运行.NET Reflector,点击Help -> Activate 3. 运行注册机,复制注册机生成的序列号,粘贴到.NET Reflector中的激活输入框 4. 点击激活 ...