最近公司的地图业务数据换了供应商,由于在进行路径规划的时候需 要使用到道路结点进行图的构建,因而需要根据道路图层提取出道路的节点。因为经常使用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的研究。

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

  1. 基于OpenCV制作道路车辆计数应用程序

    基于OpenCV制作道路车辆计数应用程序 发展前景 随着科学技术的进步和工业的发展,城市中交通量激增,原始的交通方式已不能满足要求:同时,由于工业发展为城市交通提供的各种交通工具越来越多,从而加速了城 ...

  2. Python深度学习:基于TensorFlow

    作者:吴茂贵,王冬,李涛,杨本法 出版社:机械工业出版社 品牌:机工出版 出版时间:2018-10-01 Python深度学习:基于TensorFlow

  3. Python深度学习:基于PyTorch [Deep Learning with Python and PyTorch]

    作者:吴茂贵,郁明敏,杨本法,李涛,张粤磊 著 出版社:机械工业出版社 品牌:机工出版 出版时间:2019-11-01 Python深度学习:基于PyTorch [Deep Learning with ...

  4. python监控错误语句,基于Python的关键字监控及告警

    基于Python的关键字监控及告警 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  基于Python的关键字监控及告警.txt ] (友情提示:右键点上行txt文档 ...

  5. Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能

    Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...

  6. Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习、深度学习、大数据、云计算等)推荐系统(包括语音生成、识别等前沿黑科技)

    Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习.深度学习.大数据.云计算等)推荐系统(包括语音生成.识别等前沿黑科技) 导读 基于Python的GUI界面设计的一套 ...

  7. 机器学习 聚类篇——python实现DBSCAN(基于密度的聚类方法)

    机器学习 聚类篇--python实现DBSCAN(基于密度的聚类方法) 摘要 python实现代码 计算实例 摘要 DBSCAN(Density-Based Spatial Clustering of ...

  8. Python地信专题 |基于geopandas的空间数据分析-深入浅出分层设色

    点击蓝字关注我,有干货领取! 本文对应代码和数据已上传至我的Github仓库: https://github.com/CNFeffery/DataScienceStudyNotes[1] 已发布: P ...

  9. Python地信专题 | 基于geopandas玩转地图可视化

    文章来源于Python大数据分析,作者费弗里 本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes[1] ...

最新文章

  1. Adam 又要“退休”了?耶鲁大学团队提出 AdaBelief,却引来网友质疑
  2. adv7842自定义方式
  3. 关于Xcode6编译变更 “Implicit declaration of function 'sysctl' is invalid in C99” 报错问题
  4. 竟然被尤雨溪点赞了:我给Vue生态贡献代码的这一年
  5. Java基础__Integer类型中的自动装箱
  6. 解决initializing java tooling(1%)
  7. Hindex--华为Hbase二级索引
  8. Zookeeper 集群的安装与部署
  9. QTTabBar 汉化 给资源管理器添加标签、文件批量重命名依据扩展名选中等功能
  10. 数据的正态性检验汇总
  11. 【iOS】解决UITextField输入限制受中文自动联想影响的问题
  12. 电脑变卡,电脑一直很流畅一夜之间变卡
  13. 学号在java是什么意思_在JAVA程序中增加姓名学号
  14. 原生js的e.target.closest()方法
  15. png 微软ppt 透明度_完美PNG半透明窗体解决方案
  16. 企业微信防撤回插件 WeChatICU v1.0.1中文版
  17. 卡在DSMOS has arrived的解决办法
  18. Java + 腾讯企业邮箱 + javamail + SSL 发送邮件(转载:http://www.cnblogs.com/LUA123/p/5575134.html)
  19. elementUI中el-table每行异常高度原因排查,累死
  20. Go 反射机制详解及实例 【Go语言圣经笔记】

热门文章

  1. 祝大家狗年家庭事业旺旺旺
  2. 综述:编程语言的发展趋势及未来方向
  3. java实现关键词云_Java synchronized 关键词详细说明
  4. java nio epoll_Java NIO 选择器(Selector)的内部实现(poll epoll)
  5. 【BIM入门实战】Win11平台上Revit 2018_x64简体中文版图文安装与卸载完整教程
  6. 【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版)
  7. linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
  8. Android之android studio如何把项目分享到github并提修改的代码到Github
  9. centos 7下安装mysql_Centos7下安装MySQL5.7(数据库的最全安装方法)
  10. 我的世界java版月步教程_《我的世界》月步?幻影剑?大神才会的骚操作 第一个我就跪了!...