Ejemplo n.º 1
0
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>"))
Ejemplo n.º 2
0
    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})
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
    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})
Ejemplo n.º 5
0
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