python如何使用geotools_基于GeoTools实现道路结点的提取

最近公司的地图业务数据换了供应商,由于在进行路径规划的时候需 要使用到道路结点进行图的构建,因而需要根据道路图层提取出道路的节点。因为经常使用arcpy,所以先用python写了个版本,通常将数据放在地理数据库中会有更高的运行效率,这里是之前的代码,并未存到文件地理数据库中运行,代码如下:

import arcpy

import time,os

import math

print '程序开始: ' + str(time.ctime())

#设置工作环境 地理数据库

from arcpy import env

env.workspace = r'E:\data\import'

#新建要素输出路径 地理数据库

out_path = r'E:\data\import'

#输入要素 地理数据库中的文件

input_name = 'Road.shp'

start_name = 'Starts.shp'

end_name = 'Ends.shp'

node_name = 'Node.shp'

field_name = 'NodeID'

try:

arcpy.FeatureVerticesToPoints_management(input_name,start_name,"START")

print arcpy.GetMessages()

arcpy.AddField_management(start_name, field_name, "LONG", "", "")

print arcpy.GetMessages()

arcpy.CalculateField_management(start_name, field_name, "!SNodeID!","PYTHON_9.3")

print arcpy.GetMessages()

arcpy.FeatureVerticesToPoints_management(input_name,end_name,"END")

print arcpy.GetMessages()

arcpy.AddField_management(end_name, field_name, "LONG", "", "")

print arcpy.GetMessages()

arcpy.CalculateField_management(end_name, field_name, "!ENodeID!","PYTHON_9.3")

print arcpy.GetMessages()

arcpy.Merge_management([start_name, end_name], node_name)

print arcpy.GetMessages()

arcpy.DeleteIdentical_management(node_name, field_name)

print arcpy.GetMessages()

except Exception as e:

print(e)

finally:

print('Success!')

但是为了和公司保持统一,于是使用java基于geotools又实现了一遍,可视化界面的代码就不贴了,就放一些节点提取的代码,以作备份。

/**

* 道路结点提取

*

* @param fileName

*/

private void extractNode(String fileName) throws IOException {

if (Strings.isNullOrEmpty(fileName)) return;

String temp[] = fileName.split("\\\\");

String shpName = "";

if (temp.length > 1) {

for (int j = 0; j < temp.length - 1; j++) {

shpName = shpName + temp[j] + "\\";

}

}

String shpFileName = shpName + "Node.shp";

File newFile =new File(shpFileName);

//设置要生成的shp文件的属性

//下面是定义要素的字段(属性)

//第一个参数是要素类型,第二个参数是字段名

//下面对应SHP文件的dbf表中的Shape、name和number字段,FID字段默认生成

//其中srid=4326是定义地理坐标系WGS_84,与ESRI的WKID一样,因为都是OGC定义的

SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();

tb.setCRS(DefaultGeographicCRS.WGS84);

tb.setName("shapefile");

tb.add("the_geom", com.vividsolutions.jts.geom.Point.class);

tb.add("NODEID", Long.class);

//SHP数据存储工厂

ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

//定义生成时的属性

Map params = new HashMap();

params.put("url", newFile.toURI().toURL());

params.put("create spatial index", Boolean.TRUE);

//生成SHP

ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);

newDataStore.createSchema(tb.buildFeatureType());

newDataStore.setCharset(Charset.forName("GBK"));

//设置Writer

FeatureWriter writer = newDataStore.getFeatureWriter(newDataStore.getTypeNames()[0], Transaction.AUTO_COMMIT);

//加载shapefile

SimpleFeatureSource featureSource = loadShapeFile(fileName);

//检查shapefile字段信息

checkShapeFileSchema(featureSource.getSchema(), fileName, "SNodeID","ENodeID");

try {

mainController.setStatus("正在进行道路结点提取...");

String finalNodeID = null;

try {

//总笔数

int count = DataUtilities.count(featureSource.getFeatures());

Map map = new HashMap();

//逐笔写入数据库

try (SimpleFeatureIterator iterator = featureSource.getFeatures().features()) {

int index = 0;

while (iterator.hasNext()) {

SimpleFeature feature = iterator.next();

Object attribute = feature.getAttribute("SNodeID");

if (attribute != null && !Strings.isNullOrEmpty(attribute.toString()))

finalNodeID = attribute.toString();

Geometry geometry = getNode(feature,"start");

if (geometry != null) {

geometry.setSRID(SRID);

map.put(finalNodeID,geometry);

}

attribute = feature.getAttribute("ENodeID");

if (attribute != null && !Strings.isNullOrEmpty(attribute.toString()))

finalNodeID = attribute.toString();

geometry = getNode(feature,"end");

if (geometry != null) {

geometry.setSRID(SRID);

map.put(finalNodeID,geometry);

}

index++;

}

SimpleFeature newFeature = null;

Iterator iter = map.entrySet().iterator();

while (iter.hasNext()) {

newFeature = writer.next();

Map.Entry entry = (Map.Entry) iter.next();

String key = (String) entry.getKey();

Geometry geom = (Geometry) entry.getValue();

newFeature.setAttribute("NODEID",key);

newFeature.setAttribute("the_geom",geom);

}

writer.write();

writer.close();

newDataStore.dispose();

}

} catch (Exception e) {

throw new IllegalStateException(String.format("shapefile 文件: %s 数据处理出错!\n错误信息: %s", fileName, e.getMessage()), e);

}

} finally {

mainController.setStatus(null);

mainController.setProgress(0);

featureSource.getDataStore().dispose();

}

}

/**

* 根据Feature要素获取geometry并重新设置geometry

*

*/

private Geometry getNode(SimpleFeature feature,String str){

Geometry geo = (Geometry) feature.getDefaultGeometry();

if(geo == null)

return null;

if (geo == null) return null;

if(geo.getGeometryType().equals("LineString")){

return geometryFactory.createLineString(formatSingleGeometryCorrdinate(geo));

}else if(geo.getGeometryType().equals("MultiLineString")){

return geometryFactory.createPoint(formatMultiLineStringCorrdinate(geo,str));

}else {

return geo;

}

}

最终完成道路结点的提取,随着需求越来越多,后期会逐步加深对geotools的研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware:为中国中小企业建立“外部云计算”

在11月4日举行的VMware 2008用户大会上&#xff0c;记者了解到&#xff0c;VMware正在致力为中小企业提供“外部云计算”平台。据VMware公司大中华区技术总监张振伦介绍&#xff0c;目前云计算是最受用户关注的理念之一&#xff0c;这样的计算到底怎么实现&#xff0c;怎么落地…

php中sql删除,学习猿地-php sql删除语句是什么

php sql删除语句是“DELETE FROM”&#xff0c;该语句用于从数据库表中删除行&#xff0c;其语法是“DELETE FROM table_name WHERE column_name some_value”。PHP MySQL Delete FromDELETE FROM 语句用于从数据库表中删除行。删除数据库中的数据DELETE FROM 语句用于从数据库…

一张图看懂新一代人工智能知识体系

关于人工智能的前世今生、内涵意义&#xff0c;下图可以说是相当清楚全面了。人工智能是未来一大热点&#xff0c;连腾讯、阿里、百度这些科技公司都各自成立了人工智能实验室&#xff0c;如果你也看好这一趋势&#xff0c;不妨把这张图收藏起来慢慢看。 来源&#xff1a;智能…

IA-32系统编程指南 - 第三章 保护模式的内存管理【2】

第三章 保护模式的内存管理【2】【作者&#xff1a;lion3875 原创文章 参考文献《Intel 64 and IA-32 system programming guide》】 3.6分页概述在IA-32架构的保护模式中&#xff0c;处理器要么将线性地址空间直接映射至物理内存空间&#xff08;当拥有4GB物理内存时&#xff…

android java 面试题,Android java 高级面试题库

(一) java基础面试知识点1&#xff0c;java中和equals和hashCode的区别&#xff1f;1、“”是运算符&#xff0c;用来比较两个值、两个对象的内存地址是否相等。2、“equals()”&#xff1a;equals是Object类的方法&#xff0c;默认情况下比较两个对象是否是同一个对象&#xf…

促进新一代人工智能产业发展三年行动计划_工信部新一代人工智能产业创新重点揭榜任务——中国联通智能化网络基础设施及开放平台启动会成功召开...

4月2日&#xff0c;工信部新一代人工智能产业创新重点揭榜任务(下称“人工智能重点揭榜任务”)——中国联通智能化网络基础设施及开放平台在线启动会成功召开。来自中国联通网络技术研究院、联通集团智能网络中心网络AI中心、中国联通智能城市研究院、广东联通、中讯邮电咨询设…

数学家破解婚恋网站配对程序,90天找到灵魂伴侣

找个合适或者善良的另一半比什么都强&#xff0c;谁说搞技术的情商低&#xff1f;他们可以靠高超的技能来弥补&#xff0c;照样能找到优秀的灵魂伴侣&#xff01; 凌晨三点&#xff0c;在加州大学洛杉矶分校&#xff08;UCLA&#xff09;数学系大楼五楼的一个拥挤小隔间里&…

Appointment over SMS on Windows Mobile

设想这样一个场景&#xff0c;早上出门的时候&#xff0c;手机里一个Appointment提醒弹了出来&#xff0c;恰好昨天还没有来得及通知参与该会议的几个重要成员&#xff0c;而这时候身边又没有可以接入的Wi-Fi。这时&#xff0c;给成员们发送一条短信提醒一下&#xff0c;也算是…

oracle grid需要安装,Oracle 11g Grid for Linux安装指南

Oracle 11g Grid for Linux安装指南1、创建oracle用户及用户组groupadd oinstallgroupadd dbauseradd -g oinstall -G dba -m oracle设置oracle用户的口令:passwd oracle我这里设置为oracle2、创建相关目录mkdir -p /u01chown -R oracle.oinstall /u013、修改oracle用户环境变量…

uc3842开关电源电路图_UC3842 的原理及应用详解 (上)

▲ 点击上方 21Dianyuan 关注我们本文是 21Dianyuan 社区 原创 技术文章&#xff0c;作者伟林电源&#xff0c;感谢作者的辛苦付出。 UC3842内部工作原理图1 示出了 UC3842 内部框图和引脚图。图1 UC3842 内部原理框图UC3842 采用固定工作频率脉冲宽度可控调制方式&#xff0c;…

谁的代码注释我都不服,就服你的!

什么是代码注释&#xff0c;如何在代码中添加注释&#xff0c;相信每一位了解编程的人并不陌生。注释里往往有很多有趣的脑洞和「真心话」。今天我们一起去看看那些6到飞起&#xff0c;被玩坏了的幽默注释吧。 信息量太大的注释系列—— 01 你造么&#xff1f;我是菜鸟&#xf…

为自己打气

最近觉得自己有点气馁。 为自己打气用的&#xff0c;Just go ahead! 有很多东西需要三思而后行&#xff0c;真的一定需要三思&#xff0c;三思&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 转载于:https://www.cnblogs.com/Carrie_Liang/archive…

墨迹天气语音包_小米有品“智能AI翻译机”评测,还内置了语音助手,随身WiFi功能...

出国旅游时&#xff0c;我们需要面对的最大问题应该就是言语沟通了&#xff0c;毕竟想要掌握一门新的语言不是什么容易的事情。近期&#xff0c;小米科技旗下的小米有品平台上线了一款新品&#xff1a;Langogo智能AI翻译机&#xff0c;对于想出国游玩或工作的朋友们而言&#x…

如何解读决策树和随机森林的内部工作机制?

随机森林在过去几年里得到了蓬勃的发展。它是一种非线性的基于树的模型&#xff0c;往往可以得到准确的结果。但是&#xff0c;随机森林的工作过程大都处于黑箱状态&#xff0c;往往难以解读和完全理解。近日&#xff0c;Pivotal Engineering Journal 网站发表了一篇文章&#…

sql datetime 排序_超全的数据库建表/SQL/索引规范,建议贴在工位上!

作者&#xff1a;浮雷来源&#xff1a;juejin.im/post/6871969929365553165「背景」因为工作岗位的原因&#xff0c;负责制定了关于后端组数据库的规约规范&#xff0c;作为所有产品线的规范&#xff0c;历经几版的修改&#xff0c;最终形成下边的文本。规范在整个后端执行也有…

大一的时候我上铺一哥们天天说梦话,一夜,他羞涩的说:“我怀孕了。”我们全体晕倒。...

大一的时候我上铺一哥们天天说梦话&#xff0c;一夜&#xff0c;他羞涩的说&#xff1a;“我怀孕了。”我们全体晕倒。转载于:https://blog.51cto.com/275007/115108

Oracle选择填空题中英文,oracle中英文分开排序

中英文分开排序http://hi.baidu.com/flowerhacker/blog/item/dfb0961e383662154034174f.html我同事问了个问题&#xff1a;是将中文和英文分开排序。是先排中文&#xff0c;再排英文的&#xff0c;都按照拼音abc那样排的&#xff1b;字段都是英文打头算作英文&#xff0c;中文打…

有了它,从此成为自带BGM的主角~

有了它 自带BGM不是事儿 这还是一篇卖货的文章 welcome 炎热的夏天&#xff0c;一场雷阵雨也浇灭不了的躁动&#xff0c;何不来点音乐啤酒&#xff0c;点燃内心的蠢蠢欲动&#xff0c; 放肆的音乐节奏&#xff0c;张扬的夏日心情。 然而单独用手机音乐播放器听&#xff0c;单薄…

oracle导入视图报错,exp/imp 报错处理(EXP-00003 / IMP-00019 / IMP-00058)

MOS 文章参考OERR: EXP 3 "no storage definition found for segment(%lu, %lu)" (文档 ID 21599.1)EXP-00003 When Exporting From 9.2.0.5.0 Or Any Higher Release With A Pre-9.2.0.5.0 Export Client (文档 ID 274076.1)一、EXP 导出报错(数据库版本 11.2.0.4.0…

python加油视频教程_TensorFlow 视频教程

###欢迎加入&#xff0c;TensorFlow机器学习社区 232113779TensorFlow / Deep Learning Tutorial in Chinese 中文教程Open Source Technology means to be shared across the world.While TensorFlow is a piece of super advanced technology, there are mostly English supp…