# coding: utf-8
"""
Source Name: generatepointsfromlines.py
Version: ArcGIS 10.4/Pro 1.2
Author: Environmental Systems Research Institute Inc.
Description: Source for Generate Points From Line geoprocessing tool.
""" import arcpy
import os
from collections import namedtuple unit_conversion = dict(CENTIMETERS=0.01, DECIMETERS=0.1, FEET=0.3048,
INCHES=0.0254, KILOMETERS=1000.0, METERS=1.0,
MILES=1609.347218694438, MILLIMETERS=0.001,
NAUTICALMILES=1852.0, POINTS=0.000352777778,
UNKNOWN=1.0, YARDS=0.9144) point_placement = dict(DISTANCE=False, PERCENTAGE=True) def create_points_from_lines(input_fc, output_fc, spatial_ref, percent=False,
dist=True, add_end_points=False):
"""Convert line features to feature class of points :param input_fc: Input line features
:param output_fc: Output point feature class
:param spatial_ref: The spatial reference of the input
:param percent: If creating points by percentage (or distance)
:param dist: The distance used to create points (if percentage == False).
The distance should be in units of the input (see convert_units)
:param add_end_points: If True, an extra point will be added from start
and end point of each line feature
:return: None
""" if percent:
is_percentage = True
else:
is_percentage = False # Create output feature class
arcpy.CreateFeatureclass_management(
os.path.dirname(output_fc),
os.path.basename(output_fc),
geometry_type="POINT",
spatial_reference=spatial_ref) # Add a field to transfer FID from input
fid_name = 'ORIG_FID'
arcpy.AddField_management(output_fc, fid_name, 'LONG') # Create new points based on input lines
in_fields = ['SHAPE@', 'OID@']
out_fields = ['SHAPE@', fid_name] with arcpy.da.SearchCursor(input_fc, in_fields) as search_cursor:
with arcpy.da.InsertCursor(output_fc, out_fields) as insert_cursor:
for row in search_cursor:
line = row[0] if line: # if null geometry--skip
if line.type == 'polygon':
line = line.boundary() if add_end_points:
insert_cursor.insertRow([line.firstPoint, row[1]]) increment = (percent or dist)
cur_length = increment if is_percentage:
max_position = 1.0
else:
max_position = line.length while cur_length < max_position:
new_point = line.positionAlongLine(cur_length,
is_percentage)
insert_cursor.insertRow([new_point, row[1]])
cur_length += increment if add_end_points:
end_point = line.positionAlongLine(1, True)
insert_cursor.insertRow([end_point, row[1]]) try:
arcpy.JoinField_management(out_fc,
fid_name,
input_fc,
arcpy.Describe(input_fc).OIDFieldName)
except arcpy.ExecuteError:
# In unlikely event that JoinField fails, proceed regardless,
# as spatial and join field are already complete
pass return def convert_units(dist, param_units, spatial_info):
"""Base unit conversion :param dist: Distance
:param param_units: The units as supplied from tool parameter
:param spatial_info: arcpy.SpatialReference object
:return: Distance after converted to new units
""" param_units = param_units.upper() if param_units in ['', None, 'UNKNOWN']:
return dist
else:
if param_units != 'DECIMALDEGREES':
p_conversion = unit_conversion[param_units]
else:
p_conversion = 111319.8 try:
sr_conversion = spatial_info.spatialReference.metersPerUnit
except AttributeError:
try:
input_extent = spatial_info.extent centroid = input_extent.polygon.centroid
point1 = centroid.Y, centroid.X - 0.5
point2 = centroid.Y, centroid.X + 0.5
sr_conversion = haversine(point1, point2) * 1000
except Exception as err:
# Fallback
sr_conversion = 111319.8 return dist * (p_conversion / sr_conversion) def get_distance_and_units(dist):
""" Pull distance and units from a linear unit. If units are not
specified, return UNKNOWN. :param dist: Linear units
:return: Tuple of distance (float) and units (string)
"""
try:
dist, units = dist.split(' ', 1)
except ValueError:
# ValueError occurs if units are not specified, use 'UNKNOWN'
units = 'UNKNOWN' dist = dist.replace(',', '.') return float(dist), units def haversine(point1, point2):
""" Calculate the distance between two points on the Earth surface around its curvature.
Does not account for changes in elevation (datum) :param point1 Tuple - Tuple of (Lat, Long) for the first point
:param point2 Tuple - Tuple of (Lat, Long) for the second point
:return Float - The distance between the two points about the surface of the globe in kilometers.
"""
from math import radians, sin, cos, asin, sqrt
radius_of_earth_km = 6371
lat1, lng1, lat2, lng2 = list(map(radians, list(point1 + point2)))
d = sin((lat2 - lat1) / 2) ** 2 + cos(lat1) * cos(lat2) * sin((lng2 - lng1) / 2) ** 2
return 2 * radius_of_earth_km * asin(sqrt(d)) if __name__ == '__main__':
in_features = arcpy.GetParameterAsText(0) # String
out_fc = arcpy.GetParameterAsText(1) # String
use_percent = point_placement[arcpy.GetParameter(2)] # Str -> Bool
end_points = arcpy.GetParameter(5) # Boolean describe = arcpy.Describe(in_features)
spatial_info = namedtuple('spatial_info', 'spatialReference extent')
sp_info = spatial_info(spatialReference=describe.spatialReference,
extent=describe.extent) if use_percent:
percentage = arcpy.GetParameter(4) / 100 # Float
create_points_from_lines(in_features, out_fc, sp_info.spatialReference,
percent=percentage, add_end_points=end_points)
else:
distance = arcpy.GetParameterAsText(3) # String
distance, param_linear_units = get_distance_and_units(distance)
distance = convert_units(distance, param_linear_units,
sp_info) create_points_from_lines(in_features, out_fc, sp_info.spatialReference,
dist=distance, add_end_points=end_points) try:
arcpy.AddSpatialIndex_management(out_fc)
except arcpy.ExecuteError:
pass

arcgis python 沿线生成点的更多相关文章

  1. ArcGIS Python人门到精通目录基于ArcGIS10.2,100以上案例15章42个视频806分钟,51GIS网站上线

    ArcGIS Python人门到精通目录 闫老师 QQ:276529800 微信13108507190 1.  ArcGIS Python基础 1.1  ArcGIS为什么学习Python 1.2 A ...

  2. arcgis python arcpy add data script添加数据脚本

    arcgis python arcpy add data script添加数据脚本mxd = arcpy.mapping.MapDocument("CURRENT")... df ...

  3. ArcGIS Python编程案例-电子资料链接

    ArcGIS Python编程案例(1)-Python语言基础 https://www.jianshu.com/p/dd90816d019b ArcGIS Python编程案例(2)-使用ArcPy编 ...

  4. arcgis python脚本工具实例教程—栅格范围提取至多边形要素类

    arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...

  5. arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算)

    arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算) 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 此地理处理工具 ...

  6. arcgis python获得字段唯一值

    arcgis python获得字段唯一值 # Import native arcgisscripting moduleimport arcgisscripting, sys# Create the g ...

  7. ArcGis Python常用脚本

    ArcGis Python脚本——ArcGIS 中使用的 Python 是什么版本 ArcGis Python脚本——批量添加字段 ArcGis Python脚本——批量删除字段 ArcGis Pyt ...

  8. 【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录

    目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 Python语言是目前很火热的语言,极大的促进了人工智能发展.你知道在ArcGIS中也会有python的身影吗?事实上,在ArcG ...

  9. ArcGis Python脚本——遍历输出面或折线要素的折点坐标

    有示例要素类如下 经过下面代码处理 #遍历输出面或折线要素的折点坐标 #infc:输入要素类 # code source: https://www.cnblogs.com/yzhyingcool/# ...

随机推荐

  1. **iOS发JSON请求中字符串加转义,返回的JSON去转义

    iOS中使用NSSerialization把对象转为JSON字符串后,多出来反斜杠的问题 http://segmentfault.com/q/1010000000576646 NSDictionary ...

  2. JavaScript工程师都应懂的33个概念

    最近福利发的有点多啊,各种硬干货,小伙伴们是不是觉得很爽啊.Github真的蕴含着各种各样的宝藏,难怪各个大厂也都纷纷贡献自己的代码到Github上. 所以各种干货还是会源源不断的po给大家,觉得有帮 ...

  3. HBase(九)HBase表以及Rowkey的设计

    一 命名空间 1 命名空间的结构 1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定, 则在 default 默认的命名空间中. 2) RegionServer g ...

  4. 学习Nodejs的第一步

    最近看了几本关于Node.js的书,本来个人技术分享网站http://yuanbo88.com/是打算用Node.js作为服务器端语言来处理后台的,后来又改成了PHP(也是自己研究,毕竟网上DEMO多 ...

  5. Django实战(17):ajax !

    现在让我们来通过ajax请求后台服务.当然首选要实现后台服务.关于“加入购物车”,我们需要的服务是这样定义的: url:    http://localhost:8000/depotapp/API/c ...

  6. php中empty和isset函数

    函数使用格式 empty bool empty ( mixed $var ) 判断变量是否为空. isset bool isset ( mixed $var [ , mixed $... ] ) 判断 ...

  7. 关于谷歌浏览器62版本之后引用video.js不能自动播放的问题(Cross-origin plugin content from http://vjs.zencdn.net/swf/5.0.0-rc1/video-js.swf must have a visible size larger than 400 x 300 pixels, or it will be blocked.)

    Cross-origin plugin content from http://vjs.zencdn.net/swf/5.0.0-rc1/video-js.swf must have a visibl ...

  8. 创建NuGet包

    创建NuGet包 在创建一个NuGet包之前我们应该先创建一个以.nuspec为后缀的xml清单文件,这个清单文件描述了包的内容,在安装NuGet包的过程中这个清单文件扮演者很重要的角色.实际上它的作 ...

  9. POJ - 2456 Aggressive cows 二分 最大化最小值

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18099   Accepted: 8619 ...

  10. 二、django rest_framework源码之认证流程剖析

    1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...