def get_store_connection_string(info): cparam = info["connectionParameters"] if cparam.get("dbtype", "") == "postgis": return "PG:dbname=%s port=%s host=%s user=%s password=%s" % ( cparam["database"], cparam["port"], cparam["host"], cparam["user"], cparam["password"]) elif "url" in cparam: url = urlparse.urlparse(cparam["url"]) if url.scheme != "file" or url.netloc: raise ValueError("Only local files are suported.") return tools.get_resource_path(url.path) else: raise ValueError("Unhandled type '%s'" % cparam.get("dbtype", "<unknown>"))
def update(self, ws, ft_name, ds_name, metadata): ds = ws.get_datastore(ds_name) ft = ds[ft_name] self.name = ft_name # Set basic attributes. self.ms.name = "ft:%s:%s:%s" % (ws.name, ds_name, ft_name) self.ms.status = mapscript.MS_OFF self.ms.type = ft.get_geomtype_mapscript() self.ms.setProjection(ft.get_proj4()) self.ms.setExtent(*ft.get_extent()) # Configure the connection to the store. # This is a little hacky as we have to translate stuff... info = ws.get_datastore_info(ds_name) cparam = info["connectionParameters"] if cparam.get("dbtype", None) in ["postgis", "postgres", "postgresql"]: self.ms.connectiontype = mapscript.MS_POSTGIS self.ms.connection = "dbname=%s port=%s host=%s user=%s password=%s" % ( cparam["database"], cparam["port"], cparam["host"], cparam["user"], cparam["password"]) self.ms.data = "%s FROM %s" % (ds[ft_name].get_geometry_column(), ft_name) self.set_metadata("ows_extent", "%s %s %s %s" % (ft.get_extent().minX(), ft.get_extent().minY(), ft.get_extent().maxX(), ft.get_extent().maxY())) #elif cpram["dbtype"] in ["shp", "shapefile"]: else: self.ms.connectiontype = mapscript.MS_SHAPEFILE url = urlparse.urlparse(cparam["url"]) self.ms.data = tools.get_resource_path(url.path) # TODO: strip extention. #else: # raise ValueError("Unhandled type '%s'" % info["dbtype"]) # Deactivate wms and wfs requests, because we are a virtual layer. self.set_metadatas({ "wms_enable_request": "!GetCapabilities !GetMap !GetFeatureInfo !GetLegendGraphic", "wfs_enable_request": "!GetCapabilities !DescribeFeatureType !GetFeature", }) # Update mra metadatas, and make sure the mandatory ones are left untouched. self.update_mra_metadatas(metadata) self.update_mra_metadatas({"name": ft_name, "type": "featuretype", "storage": ds_name, "workspace": ws.name, "is_model": True})
def __init__(self): builder = Gtk.Builder() builder.add_from_file("ui.glade") self.win = builder.get_object("window") """ :type: Gtk.Window """ self.win.set_title('Google Translate') self.win.set_icon_from_file(get_resource_path('icon.png')) self.src_lang_combo = builder.get_object("src_lang") """ :type: Gtk.ComboBoxText """ self.trn_lang_combo = builder.get_object("trn_lang") """ :type: Gtk.ComboBoxText """ self.src_text = builder.get_object("src_text") """ :type: Gtk.TextView """ self.trn_text = builder.get_object("trn_text") """ :type: Gtk.TextView """ self.src_listen_btn = builder.get_object("src_listen_btn") """ :type: Gtk.Button """ self.trn_listen_btn = builder.get_object("trn_listen_btn") """ :type: Gtk.Button """ self.close_btn = builder.get_object("close") """ :type: Gtk.Button """ self.spinner = builder.get_object("spinner") """ :type: Gtk.Spinner """ for lang in languages: self.src_lang_combo.append(lang[0], lang[1]) if lang[0] != 'auto': self.trn_lang_combo.append(lang[0], lang[1]) self.src_lang_combo.set_active_id('auto') self.trn_lang_combo.set_active_id(trn_lang) self.src_listen_btn.connect("clicked", self.on_button_clicked) self.close_btn.connect("clicked", self.on_close_clicked) # self.win.set_keep_above(True) self.win.show() width = self.win.get_border_width() + self.win.get_allocated_width() if width > 0: self.win.move(get_screen_resolution('width') - width, 0) self.win.set_keep_above(True) self.start_translate()
def update(self, ws, c_name, cs_name, metadata): cs = ws.get_coveragestore(cs_name) self.name = c_name # Set basic attributes. self.ms.name = "c:%s:%s" % (cs_name, c_name) self.ms.status = mapscript.MS_OFF self.ms.type = mapscript.MS_LAYER_RASTER self.ms.setProjection(cs.get_proj4()) self.ms.setExtent(*cs.get_extent()) self.ms.setProcessingKey("RESAMPLE","AVERAGE") # Configure the connection to the store. # This is a little hacky as we have to translate stuff... info = ws.get_coveragestore_info(cs_name) cparam = info["connectionParameters"] #if cparam["dbtype"] in ["tif", "tiff"]: self.ms.connectiontype = mapscript.MS_RASTER url = urlparse.urlparse(cparam["url"]) self.ms.data = tools.get_resource_path(url.path) # TODO: strip extention. #else: # raise ValueError("Unhandled type '%s'" % cparam["dbtype"]) # Deactivate wms and wcs requests, because we are a virtual layer. self.set_metadatas({ "wms_enable_request": "!GetCapabilities !GetMap !GetFeatureInfo !GetLegendGraphic", "wcs_enable_request": "!GetCapabilities !DescribeCoverage !GetCoverage", }) # Update mra metadatas, and make sure the mandatory ones are left untouched. self.update_mra_metadatas(metadata) self.update_mra_metadatas({"name": c_name, "type": "coverage", "storage": cs_name, "workspace": ws.name, "is_model": True})
class Captcha(object): IMAGE_PATH = get_resource_path('images') def __init__(self, logger=None): if logger: global LOGGER LOGGER = logger os.makedirs(self.IMAGE_PATH, 0o755, True) # 下载原图 def download_image(self, url, name): # noinspection PyBroadException try: if os.path.isdir(self.IMAGE_PATH): response = requests.get(url, verify=False) content = response.content with open(os.path.join(self.IMAGE_PATH, name), 'wb') as f: f.write(content) return True else: return False except Exception: LOGGER.exception("下载图片时遇到异常: ") return False # 读取原图 def read_image(self, filename, flags=None): file_path = filename if os.path.isfile(filename) else os.path.join( self.IMAGE_PATH, filename) if os.path.isfile(file_path): if flags: return cv2.imread(file_path, flags) else: return cv2.imread(file_path) else: LOGGER.error("输入的原图[%s]不存在, 请检查!" % file_path) return None # 获取原图大小, image: 原图名称 def get_size(self, image): img = self.read_image(image) h, w = img.shape[:2] return w, h # 获取滑块小图匹配背景大图缺口位置 def get_position(self, background_image, slide_image, show=False): """ background_image: 背景图片名称 slide_image: 滑块图片名称 """ # 读取为灰度图 background = self.read_image(background_image, cv2.IMREAD_GRAYSCALE) slide = self.read_image(slide_image, cv2.IMREAD_GRAYSCALE) # 图像反色 bg_gray_anti = abs(255 - background) # 获取背景灰度反色图与滑块灰度图匹配结果 result = cv2.matchTemplate(bg_gray_anti, slide, cv2.TM_CCOEFF_NORMED) # 获取匹配结果中最大匹配的位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) if show: # 在背景灰度反色图中框出匹配滑块下图的位置 h, w = slide.shape[:2] cv2.rectangle(bg_gray_anti, max_loc, (max_loc[0] + w, max_loc[1] + h), 255, 2) cv2.imshow('bg', bg_gray_anti) # 等待任意按键退出, 最长等待2000ms cv2.waitKey(2000) # 关闭所有窗口 cv2.destroyAllWindows() # 获取匹配结果最大值在匹配结果二维数组中的索引, 即(行, 列)坐标 # 行坐标: 距离top的长度, 列坐标: 距离left的长度 row, col = np.unravel_index(result.argmax(), result.shape) LOGGER.debug("匹配位置: (%d, %d)" % (row, col)) return row, col # 计算滑动轨迹 @staticmethod def get_track(distance): """ 拿到移动轨迹, 模仿人的滑动行为, 先匀加速后匀减速 匀变速运动基本公式: ① v = v0 + at ② s = v0t + (1/2)at² ③ v² - v0² = 2as :param distance: 需要移动的距离 :return: 存放每0.2秒移动的距离 """ # 初速度 v = 0 # 单位时间为0.2s来统计轨迹, 轨迹即0.2内的位移 t = 0.2 # 位移/轨迹列表, 列表内的一个元素代表0.2s的位移 tracks = [] # 当前的位移 current = 0 # 到达mid值开始减速 mid = int(distance * 7 / 8) # 先滑过一点, 最后再反着滑动回来 over = 10 distance += over while current < distance: # 加速度越小, 单位时间的位移越小, 模拟的轨迹就越多越详细 if current < mid: # 加速运动 a = random.randint(2, 10) else: # 减速运动 a = -random.randint(3, 15) # 初速度 v0 = v # 0.2秒时间内的位移 s = int(v0 * t + 0.5 * a * (t**2)) s = s if s > 1 else 1 # 当前的位置 current += s # 添加到轨迹列表 tracks.append(s) # 速度已经达到v, 该速度作为下次的初速度 v = v0 + a * t # 滑动超过的实际值 over += current - distance o = over # 反向滑动到准确位置 for i in range(int(over)): if o <= 3: tracks.append(-o) break else: r = -random.randint(1, 3) tracks.append(r) o += r return tracks