Follow Me: ArcPy(2)
木有想到隔了这么长时间才开始写这个系列的第二篇。2014年就这样过去了。在这段时间里,我在开篇中谈到的使用arcpy的项目已经上线,用户非常满意,邀请我们参加他们的board meeting,在会上狠狠的把我们表扬了一番。主席指着我们说:“你看,他们居然用XX万就作出了这么好的app!”。说实话,我怎么感觉他在骂我,还居然?也许是主席大人也意识到了这个问题,会后专程来和我攀谈,最后握着我的手说:“你放心,我们决定上二期。合同肯定还是你们的!由于funding cycle和fiscal year的原因,金额暂时无法确定,细节让我的小弟和你们老板谈。”听到这里,我觉得他其实可以再侮辱我一次。。。
这个项目中的arcpy完全是由小弟完成的。我只是在最开始时给了他一个用model builder生成的网络分析prototype。后来被他改的面目全非,性能奇差无比。最后不得不逐句打印每个arcpy调用的执行时间。还好,我们发现了原因:是线段截断这个本不该消耗太多时间的函数成了瓶颈!找了一个alternative后,性能大幅提升!至于为毛会这样,借用黄西在RTCA年会上的一句话:who care!木有办法啊,谁叫小笨懒呢!
貌似读者也发现了,其实俺还是没有能够有hands on的使用arcpy!那我们这个系列是不是就要说the end了呢?还好,我找到了一本讲arcpy的书《Programming ArcGIS 10.1 with Python Cookbook》。我决定就结合着这本书的结构和例子,用我自己的方式给大家来播讲这本书。所以首先对Eric Pimpler先生对这个系列提供素材表示感谢。
什么?我听见你在喊:“那是读书笔记而已!” 真的吗?你看了就知道了。Follow me and I won't fail you!
令人困惑的Python Import系统
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
小笨认为第一行import需要一些额外的解释。首先,请记牢:如果import在最前面,import后面跟着的的只能是模块!(考试必背)
import arcpy.mapping
mxd = arcpy.mapping.MapDocument("CURRENT")
from arcpy import mapping
mxd = mapping.MapDocument("CURRENT")
- (ELF only) Using the DT_RPATH dynamic section attribute of the binary if present and DT_RUNPATH attribute does not exist. Use of DT_RPATH is deprecated.
- Using the environment variable LD_LIBRARY_PATH. Except if the executable is a set-user-ID/set-group-ID binary, in which case it is ignored.
- (ELF only) Using the DT_RUNPATH dynamic section attribute of the binary if present.
- From the cache file /etc/ld.so.cache which contains a compiled list of candidate libraries previously found in the augmented library path. If, however, the binary was linked with -z node-flib linker option, libraries in the default library paths are skipped.
- In the default path /lib, and then /usr/lib. If the binary was linked with -z nodeflib linker option, this step is skipped.
#include <iostream>
using namespace std;
像这样,只有iostream这个头文件中定义在std这个名空间之内的类型,函数,变量,才会被引入当前代码文件。如果木有第二行的声明,引入定义在ostream中的标准输出流实例cout,就只能使用包含名空间的全名:
std::cout<<"hello!"
其中的“::“就是C++作用域操作符。
import java.util.ArrayList;
有上面的import撑腰,在代码中可以直接引用ArrayList:
ArrayList<String> list = new ArrayList<String>
和C++一样,如果不显式引入ArrayList,定义一个ArrayList就必须使用全名:
java.util.ArrayList<String> list = new java.util.ArrayList<String>
是不是多敲了很多字符啊?所以Java的import,其实就是个“语法糖“。小笨比较懒,木有深入过Java编译器,但据小笨猜测,这个全名的替换过程也是在预处理阶段完成的。在运行时木有作用。 那Java里库是如何被加载的呢?当然是运行时呗!大家都知道Java程序的byte code是由虚拟机加载执行的。在虚拟机执行程序之前,class loader会得到一个需要加载的包的名单,然后根据预先指定的包路径按图索骥。如果啥都木有发现,jvm就会抛给你一个经典的运行时异常:ClassNotFoundException。。。这个过程和import没有半毛钱的关系!
package Barfoo;
public class Foobar{
......
}
这就意味着Barfoo中的类Foobar可以被任何其他类import(引用),无论是Barfoo包内还是包外。反之,如果我们忽略访问修饰符:
package Barfoo;
class Foobar{
......
}
- Bootstrap class loader // 负责加载 JAVA_HOME/jre/lib 内的包包
- Extensions class loader // 负责加载 JAVA_HOME/jre/lib/ext 或者 java.ext.dirs 内指定的包包
- System class loader/Application class loader // 负责加载 CLASSPATH (java.class.path) 上的包包
T::bar * p;
上面的代码歧义不?
typename T::bar * p;
- import <module/package, full qualified name>
- from <module/package, full qualified name> import whatever_the_shit_might_be
- import <module/package, full qualified name> as whatever_local_variable_u_want_to_call_this_module
- from <module/package, full qualified name> import whatever_the_shit_might_be as whatever_local_variable_u_want_to_call_this_whatever_shit
- from <module/package, full qualified name> import *
import Foo
import Foo.Foobar
from Foo import Foobar
import Foo.Foobar as foobar
from Foo import Foobar as foobar
from Foo.Foobar import SB
from Foo.Foobar import SB as sb
from Foo.Foobar import DSB
from Foo.Foobar import DSB as dsb
from Foo.Foobar import SB, DSB
from Foo.Foobar import SB as sb, DSB as dsb
from Foo.Foobar import *
以下是非法的引用:
import Foo.Foobar.SB
import Foo.Foobar.DSB
为啥呢?老师叫你背过了嘛:如果import在最前面,import后面跟着的的只能是模块!SB不是模块,只能通过from...import...来引入。
import arcpy.mapping
mxd = arcpy.mapping.MapDocument("CURRENT")
from arcpy import mapping
mxd = arcpy.mapping.MapDocument("CURRENT")
以上的语句等价于:
import arcpy.mapping
mapping=arcpy.mapping
mxd = mapping.MapDocument("CURRENT")
#module:Bar.pyA=10
B=[1,10]
下面用from..import...来引入A和B,并改变其值:
#script1.py
from Bar import A, BA=100
B[0]=1000
如果你再次引入Bar through import Bar,pring Bar.A, Bar.B,你会发现A的值没有改变,而B变为了[1000,10]。在参数传递上,Python也是号称“传值”的。这个坑爹啊!传值是不假,但只在primitive type和string上100%正确(string是因为它的常量性, immutable)。其他的变量,包括List,传递的是变量引用的值,其实就是变量本身!(我听见了C++在偷笑)。再看上面的例子,通过from...import...A作为script1.py的一个本地变量被赋予了Module1.A的值,B作为script1.py的一个本地变量被赋予了Module1.B的引用(Python貌似叫mutable object)。改变A的值只会影响本地变量;改变B的值,由于是引用,Module1中B也会被改变。
import sysfor name in sys.builtin_module_names:print name
得到一个长长的名单:
__main__
_ast
_bisect
_codecs
_codecs_cn
_codecs_hk
_codecs_iso2022
_codecs_jp
_codecs_kr
_codecs_tw
_collections
_csv
_functools
_heapq
_hotshot
_io
_json
_locale
_lsprof
_md5
_multibytecodec
_random
_sha
_sha256
_sha512
_sre
_struct
_subprocess
_symtable
_warnings
_weakref
_winreg
array
audioop
binascii
cPickle
cStringIO
cmath
datetime
errno
exceptions
future_builtins
gc
imageop
imp
itertools
marshal
math
mmap
msvcrt
nt
operator
parser
signal
strop
sys
thread
time
xxsubtype
zipimport
zlib
- the directory containing the input script (or the current directory). #调用import的当前脚本所在的文件夹
- PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH). #如果没有,就按PYTHONPATH这个环境变量中指定的路径去寻找
- the installation-dependent default. #如果PYTHONPATH 木有,就按操作系统默认的Python安装路径下去寻找。在小笨的机器上,这个路径在“C:\\Windows\\system32\\python27.zip“
- _single_leading_underscore : weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.
- __double_leading_and_trailing_underscore__ : "magic" objects or attributes that live in user-controlled namespaces. E.g. __init__ , __import__ or __file__
Follow Me: ArcPy(2)相关推荐
- python爬取晋江_[Arcpy] 爬取高德地图面状地物(半自动化)—获取任意地区的行政边界...
# -*- coding: utf-8 -*- # @Time : 2019/07/30 # @Author : PasserQi # @Email : passerqi@gmail.com # @F ...
- python中没有arcpy怎么办_Arcpy学习笔记(一)—无中生有(上)
一.前言 最近学习状态不是很好,理论学习进展缓慢.于是决定换换脑子,开始真正进行GIS与Python结合的相关学习,之后的文章会逐步记录学习路径与心得. 二.为什么要学习Arcpy?别问,问就是梦想 ...
- arcpy 批量投影_使用ArcPy对栅格数据进行批量投影坐标转换
# -*- coding:utf-8 -*- ##======================== ##批量栅格数据投影转换 import arcpy,os,os.path,init def proj ...
- FIRST集与FOLLOW集构造步骤
首先,这两个集主语是候选式,是V*中的一个终结符/非终结符. 由于FOLLOW集的定义和构造步骤里面都涉及FIRST集,故先介绍FIRST集. 一.FIRST集的定义如下: FIRST(α)={a|α ...
- 【306】通过ArcPy编写ArcToolbox
参考:使用 Python 创建工具 参考:在 Python 工具箱中定义参数数据类型 基本步骤如下: (1)创建一个 Python 脚本,并保存成 .py 文件. (2)创建一个自定义工具箱(.tbx ...
- arcpy 批量投影_怎样用arcgis中的python进行批量投影
展开全部 接到的需求是对文件62616964757a686964616fe4b893e5b19e31333363393638夹下包括子目录所有影像进行投影变换,在网上找了找,大家的代码好像和需求不太一 ...
- I need to follow my heart.
"I need to follow my heart." 这是李开复到Google报道时说的第一句话,如果Google真如他所言,那真是全人类的幸运:如果Google真如他所言,那 ...
- arcgis 经纬度转大地坐标_土地报备坐标txt(坐标交换数据)转shp遇到的坑及其Python(ArcPy/ArcGIS)实现...
目录 土地报备坐标txt文件(坐标交换数据)转shp遇到的坑以及该功能的Python(ArcPy/ArcGIS)实现 一. 使用 Python(ArcPy) 绘制shp 什么是ArcPy 如何构造sh ...
- arcgis python脚本实现从界面选择输入输出_arcgis python脚本实现从界面选择输入输出_ArcGIS Python编程案例(2)-使用ArcPy编写脚本......
本章将涉及以下案例: 使用ArcGIS Python窗体 访问ArcPy 从脚本中执行工具 使用ArcGIS桌面软件帮助系统 使用变量存储数据 访问ArcPy中的模块 引言 地理处理任务往往是耗时且重 ...
最新文章
- 糟心!苹果无人车裁员190人,程序员却首当其冲
- linux mysql换成_把 SQL Server 迁移到 Linux?不如换成 MySQL
- 拯救“没常识”的GPT-3得靠它了,交大ACM班校友提出“Voken” 无监督学习 | EMNLP 2020...
- javascript Windows对象(BOM)
- matlab小波变换边缘检测,在matlab 下 实现 用小波变换对图像进行边缘检测 程序代码...
- 分别用顺序表和链表实现队列
- c语言教程的辅导书,清华大学出版社-图书详情-《C语言程序设计案例教程学习辅导》...
- rgb颜色判断语句_如何判断一张照片的曝光是否准确
- 无线电频段属国家资源,不是你想用就能用
- 【Tensorflow】深度学习实战04——Tensorflow实现VGGNet
- mongodb聚合操作之group
- Nginx的主要函数调用关系分析
- 19【推荐系统9】WideDeep和DeepCross模型
- usb芯片+android+驱动,PL2303芯片驱动
- 深度linux双系统切换快捷键,苹果 Mac双系统如何切换?用Option键切换双系统的步骤分享...
- guzzle 请求本地地址
- 京东商品详情API、通过商品ID获得京东商品详情
- openstack-stein.noarch(S版)环境搭建
- 【tio-websocket】4、tio-websocket-server实现自定义集群模式
- 失业在家:有工作能力但是没有工作机会
热门文章
- AIO-3399J重新安装Ubuntu系统-刷新固件
- 蓝牙BQB认证的过程与方式(SIG)
- 《HelloGitHub》第 60 期,你喜欢玩游戏吗?
- 解决vue-admin-template插件element UI组件默认英文改中文
- VS Code 的常用快捷键和插件(一)
- centos 7.6—— Apache网页压缩——网页缓存
- PDMS二次开发产品Naki.CI(二):升级到1.0.1版本
- python+selenium+pycharm安装
- 程序员进阶!阿里P7级别面试经验总结,深度好文
- JavaScript去除字符串中所有的标点符号,只保留中文、英文和数字