Beispiel #1
0
class PSQL:
    def __init__(self, database):
        self.connection = None
        self.db = database
        self.sgbd = None
        self.dbAtrib = None
        self.settings()
        self.error_log = ErrorLog(self.__class__.__name__)
        self.cursor = self.get_connection().cursor()

    def settings(self):
        try:
            self.db.db_name = "nycgisdb"
            self.db.user = "******"
            self.db.host = "localhost"
            self.db.pswrd = "m2a3rcio"
            self.sgbd = psycopg2
            self.dbAtrib = ("dbname='" + self.db.db_name + "' user='******' host='"
                            + self.db.host + "' password='******'")
        except TypeError as e:
            print e.message

    def select(self, arg):
        self.cursor.execute(arg)
        self.connection.commit()
        return self.cursor.fetchall()

    def get_connection(self):
        try:
            self.connection = self.sgbd.connect(self.dbAtrib)
            return self.connection
        except Exception as e:
            self.error_log.open()
            self.error_log.write(e.message)
            self.error_log.close()
class ConnectionFactory:
    def __init__(self, database):
        self.connection = None
        self.db = database
        self.sgbd = None
        self.dbAtrib = None
        self.settings()
        self.error_log = ErrorLog(self.__class__.__name__)
        self.cursor = self.get_connection().cursor()

    def get_connection(self):
        try:
            self.connection = self.sgbd.connect(user=self.db.user, passwd=self.db.pswrd, db=self.db.db_name)
            return self.connection
        except Exception as e:
            self.close()
            self.error_log.open()
            self.error_log.write(e.message)
            self.error_log.close()

    def close(self):
        self.connection.close()

    def settings(self):
        pass
class RealEstateSettings:

    def __init__(self, inputdata, outputdata):
        dao = DAOPsql('furman')
        self.geo = GeoSearch(dao)
        self.error_log = ErrorLog(self.__class__.__name__)
        self.progress = Progress()
        self.input = inputdata
        self.output = outputdata

    def fix_acris(self):
        tuples = self.preprocess()
        real_estates = []
        while tuples:
            try:
                t = tuples.pop(0)
                bbl = Normalizer.set_bbl(t[0], t[1], t[2])
                address = t[3]+" "+t[4]
                address = Normalizer.set_address(address, bbl)
                date = Normalizer.set_str_to_epoch(t[5])
                price = t[6]
                real_estates.append((bbl, address, date, price))
            except ValueError:
                self.error_log.open()
                self.error_log.write(t[1]+", "+str(t[0]))
                self.error_log.close()
            except KeyboardInterrupt:
                print ""
                print "Stopped"
                CsvManager.append_geo_codes(real_estates, self.output)
        CsvManager.append_geo_codes(real_estates, self.output)

    def preprocess(self):
        tuples = CsvManager.read(self.input)
        num = CsvManager.read_progress()
        print num
        if num == 0:
            CsvManager.write_geo_codes([], self.output)
            CsvManager.write_progress('0')
        self.progress.set_size(len(tuples))
        self.progress.update_progress(num)
        Normalizer.set_tuple(num, tuples)
        return tuples

    def build_geocodings(self):
        nominatim = NominatimGeocode(self.progress, self.error_log, self.geo)
        google = GoogleGeocode(self.progress, self.error_log, self.geo)
        opencage = OpenCageGeocode(self.progress, self.error_log, self.geo)
        bing = BingGeocode(self.progress, self.error_log, self.geo)
        tiger = TIGERGeocode(self.progress, self.error_log, self.geo)
        return nominatim, google, opencage, bing, tiger

    def search_lat_long(self):
        tuples = self.preprocess()
        count = 1
        nominatim, google, opencage, bing, tiger = self.build_geocodings()
        while tuples:
            t = tuples.pop(0)
            status, found = self.geocode_process(t, nominatim)
            if not found:
                if status == -1:
                    status, found = self.geocode_process(t, bing)
                    if not found and status == -1:
                        self.geocode_process(t, tiger)
                elif status == -2:
                    i = 1
                    while i < 3:
                        print "Waiting 45' for the "+Normalizer.set_order(str(i))+" time"
                        time.sleep(2700)
                        status, found = self.geocode_process(t, nominatim)
                        if found:
                            continue
                        elif status == -2:
                            i += 1
                        elif status == -3:
                            return
                if count % 100 == 0:
                    for i in range(3):
                        t = tuples.pop(0)
                        status, found = self.geocode_process(t, google)
                        time.sleep(3)
                        if not found:
                            self.geocode_process(t, opencage)
                            time.sleep(3)
                        else:
                            t = tuples.pop(0)
                            self.geocode_process(t, opencage)
                            time.sleep(3)
            count += 1

    def geocode_process(self, t, geocode):
        re, num = geocode.get_coordinates(t)
        if num:
            CsvManager.append_geo_codes([re], self.output)
            self.progress.update_progress(num)
        else:
            val = CsvManager.read_progress()
            self.progress.update_progress(val+1)
        return re, num