在GIS领域,数据筛选和查询是日常工作中不可或缺的一部分。对于ArcGIS用户而言,这一操作通常通过“筛选”和“定义查询”来实现。在ArcGIS Desktop中,定义查询使用的是SQL语句,这些语句虽然功能强大,但对于不熟悉SQL语法的用户来说,理解和使用起来往往让人感到困惑和烧脑。相反,在ArcGIS Pro中,这些定义查询已经翻译成了中文,使得普通用户更容易上手。这种变化大大降低了使用门槛,让更多人可以方便地使用这一功能。
ArcGIS Pro的中文定义查询大大简化了操作。例如,用户只需选择“等于”、“不等于”、“大于”等中文选项,而不再需要记忆复杂的SQL语法。相比之下,ArcGIS Desktop的用户则需要输入类似 field_name = 'value' 这样的SQL语句。虽然对资深用户来说,SQL语句的灵活性和功能性不可替代,但对于普通用户或刚接触GIS的新人来说,中文操作无疑更加直观和易于理解。
为了帮助那些仍然使用ArcGIS Desktop的用户,我编写了一个脚本工具,能够将常见的SQL语句翻译成更易懂的中文表达。这样,即使在ArcGIS Desktop中,我们也可以享受类似ArcGIS Pro的便利。
以下是脚本的核心代码:
# -*- coding: gbk -*-
import arcpy
import sys
# 设置默认编码为utf-8
reload(sys)
sys.setdefaultencoding('utf-8')
def translate_to_sql(operator):
"""
将中文操作符翻译为SQL语法
"""
translations = {
u"等于": "=",
u"不等于": "<>",
u"大于": ">",
u"小于": "<",
u"大于等于": ">=",
u"小于等于": "<=",
u"类似于": "LIKE",
u"不类似于": "NOT LIKE",
u"包含值": "IN",
u"不包含值": "NOT IN",
u"为空": "IS NULL",
u"不为空": "IS NOT NULL",
u"开头是": "LIKE",
u"开头不能为": "NOT LIKE",
u"结尾是": "LIKE",
u"结尾不能为": "NOT LIKE",
u"包含文本": "LIKE",
u"不包含文本": "NOT LIKE",
u"介于": "BETWEEN",
u"不介于": "NOT BETWEEN"
}
return translations.get(operator, "=")
def format_expression(operator_sql, operator_chinese, expression_suffix):
"""
根据操作符类型格式化SQL表达式
"""
if operator_sql in ["IN", "NOT IN"]:
# 处理 "IN (value1, value2, ...)" 的情况
if not expression_suffix.startswith("(") and not expression_suffix.endswith(")"):
expression_suffix = u"({})".format(expression_suffix)
elif operator_sql in ["LIKE", "NOT LIKE"]:
# 根据操作符处理 LIKE 或 NOT LIKE 的不同情况
if operator_chinese == u"包含文本":
expression_suffix = u"'%{}%'".format(expression_suffix) # "LIKE '%value%'"
elif operator_chinese == u"开头是":
expression_suffix = u"'{}%'".format(expression_suffix) # "LIKE 'value%'"
elif operator_chinese == u"结尾是":
expression_suffix = u"'%{}'".format(expression_suffix) # "LIKE '%value'"
elif operator_chinese == u"开头不能为":
expression_suffix = u"'{}%'".format(expression_suffix) # "NOT LIKE 'value%'"
elif operator_chinese == u"结尾不能为":
expression_suffix = u"'%{}'".format(expression_suffix) # "NOT LIKE '%value'"
elif operator_sql in ["IS NULL", "IS NOT NULL"]:
# "IS NULL" 或 "IS NOT NULL" 不需要值
expression_suffix = ""
elif operator_sql == "BETWEEN" or operator_sql == "NOT BETWEEN":
# 处理 "BETWEEN value1 AND value2" 的情况
if "AND" not in expression_suffix:
raise ValueError(u"对于'介于'或'不介于'操作符,表达式需要包含'AND',例如:'1 AND 10'")
expression_suffix = u"{}".format(expression_suffix)
else:
# 其他操作符,例如 "=", "<>", ">", "<", ">=", "<="
expression_suffix = u"'{}'".format(expression_suffix) if isinstance(expression_suffix, basestring) else expression_suffix
return expression_suffix
def main():
# 获取参数
in_features = arcpy.GetParameterAsText(0) # 输入要素
out_feature_class = arcpy.GetParameterAsText(1) # 输出要素类
select_field = arcpy.GetParameterAsText(2) # 选择字段
operator_chinese = arcpy.GetParameterAsText(3) # 中文操作符
expression_suffix = arcpy.GetParameterAsText(4) # 表达式的后半部分
# 将中文操作符翻译为SQL操作符
operator_sql = translate_to_sql(operator_chinese)
# 格式化表达式的后半部分
try:
formatted_expression_suffix = format_expression(operator_sql, operator_chinese, expression_suffix)
except ValueError as e:
arcpy.AddError(unicode(e))
return
# 创建SQL表达式
sql_expression = u'"{}" {} {}'.format(select_field, operator_sql, formatted_expression_suffix)
# 显示SQL表达式和翻译的内容
arcpy.AddMessage(u"SQL 表达式: {}".format(sql_expression))
arcpy.AddMessage(u"选择的操作: {}".format(operator_chinese))
# 执行选择操作
arcpy.Select_analysis(in_features, out_feature_class, sql_expression)
if __name__ == '__main__':
main()
怎么自己建就不讲了想学自己查或者去看我的那那那那那篇(我懒得找了)文章学。这个脚本工具接收用户输入的中文操作符,并将其转换为对应的SQL语句。通过这种方式,即使是ArcGIS Desktop用户,也可以使用中文进行查询操作,极大地方便了日常使用。
随着GIS技术的不断发展,如何让工具更加易用和直观成为一个重要的方向。ArcGIS Pro在这方面的改进,无疑为用户带来了更好的体验。而通过类似的脚本工具,我们可以让更多仍在使用ArcGIS Desktop的用户享受到简化操作的便利。希望未来会有更多的改进,让GIS工具更适合人类使用。需要做好的脚本工具在后台回复“人类SQL”获取。