SuperMap sqlserver数据库中点数据集到AutoCAD文本的转换

转载请注明出处,谢谢合作

#!/usr/bin/env python
# -*- coding: cp936 -*-
'''
@brief 功能说明:
实现从supermap后台的mssql里点数据集到AutoCAD里文本型的转换。
要是改为多线程的效果可能会更好。但现在的处理量很小,用不着给自己找麻烦
@author 施峰<sf.cumt@163.com>
2011-10-4~2011-10-5
'''

import pyodbc
import logging
import comtypes.client
import numbers
import array
import re
import ConfigParser

def getconnect(db_type=None,db_arg=None):
    '''
    sql server:
        connector=pyodbc.connect('DRIVER={SQL SERVER};SERVER=LUOBO\\SQLEXPRESS;DATABASE=chengguuo')
    '''
    if db_type in ('MSSQL','JET'):
        try:
            connector = pyodbc.connect(db_arg)
        except :
            logging.error("数据库连接错误!")
            raise
        return connector

def getdrawscript(f=None):
    '''
    如果给定文件名则打开该CAD文件。
    如果没有给定文件名则认为待编辑的CAD文件已经打开。
    '''
    if not f:
        try:
            cad=comtypes.client.GetActiveObject('AutoCAD.Application') #这个可能有点问题
            cad.Visible=False
            drawingscript=cad.ActiveDocument
        except :
            logging.error("获得活动cad文件失败。请查看草稿文件是否已经打开,或请关闭除了草稿文件以外的所有cad文件。")
            raise
    else:
        try:
            cad=comtypes.client.CreateObject('AutoCAD.Application')
        except :
            logging.error("请确定本机上安装了autocad")
            raise
        try:
            drawingscript=cad.Documents.Open(f)
        except :
            logging.error("cad文件打开失败。")
            cad.Quit()
            raise
    return drawingscript

def getrows(sqlstring,connect=None,*args,**kargs):
    '''
    当返回大量记录时可以要占用大量内存空间
    >>> sqlstring = 'SELECT SmX,SmY,name FROM SMDTV_93'
    >>> connect = pyodbc.connect('DRIVER={SQL SERVER};SERVER=LUOBO\\SQLEXPRESS;DATABASE=chengguuo')
    >>> rows = getrows(sqlstring,connect)
    >>> isinstance(rows,list)
    True
    >>> row=rows[1]
    >>> isinstance(row[0],numbers.Real)
    True
    >>> isinstance(row[1],numbers.Real)
    True
    >>> isinstance(row[2],str)
    True
    '''
    cursor=connect.cursor()
    try:
        cursor.execute(sqlstring)
        rows = cursor.fetchall()
    except :
        logging.error("数据库进行sql查寻时出错")
        raise
    finally:
        connect.close()
    return rows # 返回引用,注意防止修改

def drawtext(x=None,y=None,text='什么都没有',draw=None,size=50):
    '''
    @brief 在cad里输入文字。
    >>> drawtext(x=36395514.9324,y=3250445.33498,text=r'\A1;T{\H0.7x;\S^3;}x',draw=getdrawscript('D:\\Drawing11.dwg')) == 0
    True
    '''
    if isinstance(x,numbers.Real) and isinstance(y,numbers.Real) and text: #无文字则不绘
        point=array.array('d',[x,y,0])
        try:
            ms=draw.ModelSpace #draw必须没有关闭
            #draw.ModelSpace.AddText(text,point,size) #单行文本
            ms.AddMText(point,size,text) #多行文本
        except:
            logging.error("绘制文字出错!")
            logging.error("\nx:%s\ny:%s\ntext:%s\npoint:%s\ndraw:%s\nms:\s"%(x,y,text,point,draw,ms))
            draw.Application.Quit()
            raise
        return 0
    return 1

def removesharp(text):
    '''
    @brief 去掉text中的表示supermap标签专题图上下标的特殊符号
    >>> removesharp("T#-3#=x")
    'T3x'
    >>> removesharp("J#-2#=S#+2")
    'J2S2'
    >>> removesharp("")
    ''
    >>> removesharp(None)
    ''
    '''
    if text:
        sharppattern=re.compile(r'#[+-=]')
        modifiedtext=sharppattern.sub(r"",text,count=0)
    else:
        modifiedtext=""
    return modifiedtext

def addchinesenote(test):
    pass


def sharp2mtext(text):
    '''
    >>> text1 = 'T#-3#=x'
    >>> text2 = 'J#-2#=S#+2'
    >>> text3 = None
    >>> sharp2mtext(text1) == '\\A1;T{\H0.7x;\\\\S^3;}x'
    True
    >>> #注意这是用的是repr()函数输出。
    >>> print sharp2mtext(text1)
    \A1;T{\H0.7x;\\S^3;}x
    >>> sharp2mtext(text2) == '\\A1;J{\H0.7x;\\S^2;}S{\H0.7x;\\S2^;}'
    True
    >>> sharp2mtext(text3) == ''
    True
    '''
    if not text:
        return ''
    else:
        ws=text.split('#')
        logging.info(ws)
        ws_conved=[]
        for w in ws[1:]:
            w_tem=''
            if w[0] == '+':
                w_tem = r'{\H0.7x;\S' + w[1:] + r'^;}'
            elif w[0] == '-':
                w_tem = r'{\H0.7x;\S^' + w[1:] + r';}'
            elif w[0] == '=':
                w_tem = w[1:]
            ws_conved.append(w_tem)
        text_conved = r'\A1;'+ws[0]+''.join(ws_conved)
        return text_conved

def main(*args,**kargs):
    '''
    >>> #main(filename="D:\\Drawing1.dwg",sqlstring="SELECT SmX,SmY,name FROM SMDTV_93")
    0
    >>> # main(filename="D:\\Drawing2.dwg",sqlstring="SELECT SmX,SmY,name FROM SMDTV_93") 失败,由于Drawing2.dwg还不存在
    >>> # 0
    >>> config = ConfigParser.ConfigParser()
    >>> config.read('dot2text.cfg')
    ['dot2text.cfg']
    >>> connectstring = config.get('APPLICATION','connectstring')
    >>> connectstring='DRIVER={SQL SERVER};SERVER=LUOBO\\SQLEXPRESS;DATABASE=chengguuo'
    >>> filename = config.get('APPLICATION','outputfile')
    >>> sqlstring = config.get('APPLICATION','sqlstring')
    >>> dbtype =config.get('APPLICATION','dbtype')
    >>> main(filename=filename,sqlstring=sqlstring,dbtype=dbtype,connectstring=connectstring)
    0
    '''
    try:
        filename=kargs['filename']
        sqlstring=kargs['sqlstring']
        dbtype=kargs['dbtype']
        connectstring=kargs['connectstring']
    except:
        logging.info("请给出正确的关键字参数")
        return 1
    if not filename:
        draw=getdrawscript()
    else:
        draw=getdrawscript(filename)

    try:
        layer=draw.Layers.Add("DOT_2_TEXT") #新增图层
        draw.ActiveLayer=layer
    except :
        logging.error("添加新图层出错")
        draw.Application.Quit()
        raise
    # 这里出过大bug,主要是异常的处理
    #try:
    #    dbconnect=getconnect(db_type=dbtype,db_arg=connectstring)
    #except:
    #    raise
    #finally:
    #    draw.Application.Quit()
    try:
        dbconnect=getconnect(db_type=dbtype,db_arg=connectstring)
    except:
        draw.Application.Quit()
        raise
    try:
        rows=getrows(sqlstring,dbconnect)
    except:
        return 1
    try:
        for row in rows:
            #drawtext(x=row[0],y=row[1],text=removesharp(row[2]),draw=draw)
            drawtext(x=row[0],y=row[1],text=sharp2mtext(row[2]),draw=draw)
        draw.save()
    except:
        logging.error("主函数中的drawtext操作出错")
        logging.error("drawtext:\nrow[0]:%s\nrow[1]:%s\nrow[2]:%s\n"%(row[0],row[1],row[2]))
        return 1
    draw.Application.Quit()
    return 0

if __name__ == "__main__":
    #filename = raw_input("请输入文件名\n") # D:\Drawing1.dwg
    #sqlstring = raw_input("***请不要误操作!***\n请输入查询语句。\n") # select SmX,SmY,name from SMDTV93
    config = ConfigParser.ConfigParser()
    config.read('dot2text.cfg')
    connectstring = config.get('APPLICATION','connectstring')
    filename = config.get('APPLICATION','outputfile')
    sqlstring = config.get('APPLICATION','sqlstring')
    dbtype =config.get('APPLICATION','dbtype')
    main(filename=filename,sqlstring=sqlstring,dbtype=dbtype,connectstring=connectstring)

一个用python写的从数字高程格式文件(DEM)中提取水系的模块

一个用python写的从数字高程格式文件(DEM)中提取水系的模块

 

https://bitbucket.org/luoboiqingcai/dem_waters_extractor

 

本模块的功能是从dem文件中提取出水系。

 

模块通过了基本测试,对《基于数字高程模型的水系提取算法》(地理学与国土研究2000.11;周贵云,刘瑜,邬伦)中提到的9*9维度的矩阵进行计算,结果与该文中所得结果完全一致。

 

写这个模块主要是用于学习目的。由于很多实际的问题没有考虑进来,如果用此模块处理的dem文件的维度比较大或dem文件所描述的地型为盆地或描述区域内有大的水坑或平底峡谷,程序可能要跑非常长的时间。

 

本模块参考了《基于数字高程模型的水系提取算法》(地理学与国土研究2000.11;周贵云,刘瑜,邬伦)提到的方法。

 

下面是测试矩阵:

 

[[1,1,3,4,5,5,7,5,4],
[1,2,4,4,4,4,6,5,3],
[4,4,3,4,3,3,6,7,5],
[3,3,2,3,2,2,4,6,7],
[1,2,2,2,1,2,3,4,5],
[3,3,2,1,1,2,3,6,6],
[2,3,3,1,1,2,5,7,8],
[1,2,3,3,3,3,4,8,6],
[1,1,2,3,3,4,5,7,8]]

 

 

以下是测试模块中各个函数的测试代码:

from demfunctions import (fill_sinks,lift,get_vect_matrix,count_water,river_map,river_paths,water_grad)
import pprint

def test_fill_sinks():
    data = [[1,1,3,4,5,5,7,5,4],
            [1,2,4,4,4,4,6,5,3],
            [4,4,3,4,3,3,6,7,5],
            [3,3,2,3,2,2,4,6,7],
            [1,2,2,2,1,2,3,4,5],
            [3,3,2,1,1,2,3,6,6],
            [2,3,3,1,1,2,5,7,8],
            [1,2,3,3,3,3,4,8,6],
            [1,1,2,3,3,4,5,7,8] ]
    return fill_sinks(data)

print test_fill_sinks()

def test_lift():
    data = [[1,1,3,4,5,5,7,5,4],
            [1,2,4,4,4,4,6,5,3],
            [4,4,3,4,3,3,6,7,5],
            [3,3,2,3,2,2,4,6,7],
            [1,2,2,2,1,2,3,4,5],
            [3,3,2,1,1,2,3,6,6],
            [2,3,3,1,1,2,5,7,8],
            [1,2,3,3,3,3,4,8,6],
            [1,1,2,3,3,4,5,7,8]]
    data_modified = fill_sinks(data)
    return lift(data_modified,0.1)

print test_lift()

def test_get_vect_matrix():
    data = [[1,1,3,4,5,5,7,5,4],
            [1,2,4,4,4,4,6,5,3],
            [4,4,3,4,3,3,6,7,5],
            [3,3,2,3,2,2,4,6,7],
            [1,2,2,2,1,2,3,4,5],
            [3,3,2,1,1,2,3,6,6],
            [2,3,3,1,1,2,5,7,8],
            [1,2,3,3,3,3,4,8,6],
            [1,1,2,3,3,4,5,7,8]]
    data_modified = fill_sinks(data)
    data_lifted = lift(data_modified,1e-5)
    return get_vect_matrix(data_lifted,1,1)

print test_get_vect_matrix()

def test_count_water():
    data = [[1,1,3,4,5,5,7,5,4],
            [1,2,4,4,4,4,6,5,3],
            [4,4,3,4,3,3,6,7,5],
            [3,3,2,3,2,2,4,6,7],
            [1,2,2,2,1,2,3,4,5],
            [3,3,2,1,1,2,3,6,6],
            [2,3,3,1,1,2,5,7,8],
            [1,2,3,3,3,3,4,8,6],
            [1,1,2,3,3,4,5,7,8]]
    data_modified = fill_sinks(data)
    data_lifted = lift(data_modified,1e-5)
    vect_matrix = get_vect_matrix(data_lifted,1,1)
    return count_water(vect_matrix)
print test_count_water()

def test_river_map():
    data = [[1,1,3,4,5,5,7,5,4],
            [1,2,4,4,4,4,6,5,3],
            [4,4,3,4,3,3,6,7,5],
            [3,3,2,3,2,2,4,6,7],
            [1,2,2,2,1,2,3,4,5],
            [3,3,2,1,1,2,3,6,6],
            [2,3,3,1,1,2,5,7,8],
            [1,2,3,3,3,3,4,8,6],
            [1,1,2,3,3,4,5,7,8]]
    data_modified = fill_sinks(data)
    data_lifted = lift(data_modified,1e-5)
    vect_matrix = get_vect_matrix(data_lifted,1,1)
    return river_map(count_water(vect_matrix),5)

pprint.pprint(test_river_map())

def test_river_paths():
    data = [[1,1,3,4,5,5,7,5,4],
            [1,2,4,4,4,4,6,5,3],
            [4,4,3,4,3,3,6,7,5],
            [3,3,2,3,2,2,4,6,7],
            [1,2,2,2,1,2,3,4,5],
            [3,3,2,1,1,2,3,6,6],
            [2,3,3,1,1,2,5,7,8],
            [1,2,3,3,3,3,4,8,6],
            [1,1,2,3,3,4,5,7,8]]
    data_modified = fill_sinks(data)
    data_lifted = lift(data_modified,1e-5)
    vect_matrix = get_vect_matrix(data_lifted,1,1)
    map_ = river_map(count_water(vect_matrix),5)
    return river_paths(map_,vect_matrix)

pprint.pprint(test_river_paths())

def test_water_grad():
    data = [[1,1,3,4,5,5,7,5,4],
            [1,2,4,4,4,4,6,5,3],
            [4,4,3,4,3,3,6,7,5],
            [3,3,2,3,2,2,4,6,7],
            [1,2,2,2,1,2,3,4,5],
            [3,3,2,1,1,2,3,6,6],
            [2,3,3,1,1,2,5,7,8],
            [1,2,3,3,3,3,4,8,6],
            [1,1,2,3,3,4,5,7,8]]
    r_max = len(data)
    c_max = len(data[0])
    data_modified = fill_sinks(data)
    data_lifted = lift(data_modified,1e-5)
    vect_matrix = get_vect_matrix(data_lifted,1,1)
    map_ = river_map(count_water(vect_matrix),5)
    path_dict = river_paths(map_,vect_matrix)
    #return path_dict
    #return water_grad(**path_dict)
    return water_grad(path_dict['cross_sections'],path_dict['paths'],r_max,c_max)

pprint.pprint(test_water_grad())

留个爪印

在google里发现这个网站。

好漂亮的网站。

期待在这里可以碰到新朋友。