问题
尝试写一个UDF,参数支持输入x,y与一个Polygon,返回结果是(x,y)是否在输入的Geometry之内?
环境
- eclipse
- odps 插件
- jts包:jts-1.8.jar
解法
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.aliyun.odps.udf.UDF;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader; /**
*
* @author xingxing.dxx
*
*/
public class WithinUDF extends UDF { private GeometryFactory geometryFactory = new GeometryFactory(); /*private Logger LOGGER = LoggerFactory.getLogger(WithinUDF.class);*/ /**
* 判断以x,y为坐标的点point(x,y)是否在geometry表示的Polygon中
* @param x
* @param y
* @param geometry wkt格式
* @return
*/
public Boolean evaluate(Double x, Double y, String geometry){ Coordinate coord = new Coordinate(x, y);
Point point = geometryFactory.createPoint(coord); WKTReader reader = new WKTReader(geometryFactory);
try {
Polygon polygon = (Polygon) reader.read(geometry);
return point.within(polygon);
} catch (ParseException e) {
/*LOGGER.error("geometry 格式错误",e);*/
throw new RuntimeException(e.getMessage());
}
} }
测试步骤
- 新建表
odpscmd
create table dual(x double,y double,geometry string);
2. 准备数据(dual.txt),内容如下:
5;5;POLYGON((0 0, 10 0, 10 10, 0 10,0 0))
3. 上传
tunnel u -fd ';' dual.txt project名称.dual; //列之间按照";"分割
4. 运行
true
可以看到结果为true,执行成功