ArcGIS中适合人类使用的“筛选”or“定义查询”SQL语句翻译为中文

2024-09-05 09:01   陕西  

在GIS领域,数据筛选和查询是日常工作中不可或缺的一部分。对于ArcGIS用户而言,这一操作通常通过“筛选”和“定义查询”来实现。在ArcGIS Desktop中,定义查询使用的是SQL语句,这些语句虽然功能强大,但对于不熟悉SQL语法的用户来说,理解和使用起来往往让人感到困惑和烧脑。相反,在ArcGIS Pro中,这些定义查询已经翻译成了中文,使得普通用户更容易上手。这种变化大大降低了使用门槛,让更多人可以方便地使用这一功能。


ArcGIS Pro的优势

ArcGIS Pro的中文定义查询大大简化了操作。例如,用户只需选择“等于”、“不等于”、“大于”等中文选项,而不再需要记忆复杂的SQL语法。相比之下,ArcGIS Desktop的用户则需要输入类似 field_name = 'value' 这样的SQL语句。虽然对资深用户来说,SQL语句的灵活性和功能性不可替代,但对于普通用户或刚接触GIS的新人来说,中文操作无疑更加直观和易于理解。

让SQL语句更“亲民”

为了帮助那些仍然使用ArcGIS Desktop的用户,我编写了一个脚本工具,能够将常见的SQL语句翻译成更易懂的中文表达。这样,即使在ArcGIS Desktop中,我们也可以享受类似ArcGIS Pro的便利。

以下是脚本的核心代码:

# -*- coding: gbk -*-import arcpyimport sys
# 设置默认编码为utf-8reload(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”获取。



--THE END--


GIS民工
记录、分享、思考、求知、求是!
 最新文章