コード例 #1
0
def createIntermediateImage(translated, intermediateShape, pixels):
    intermediate = ()
    for x in translated.tolist()[0]:
        intermediate = intermediate + ((x[0], x[1]), )

    poly_unordered = MultiPoint(intermediate).convex_hull

    img_width, img_height = pixels

    intermediate_img = Image.new('1', (img_width, img_height))
    pixels = intermediate_img.load()
    white = 1  #(255,255,255)
    black = 0  #(0,0,0)

    for i in range(img_width):
        for j in range(img_height):
            point = Point(i, j)
            if poly_unordered.contains(point):
                pixels[i, j] = white  #formerly grey
            else:
                pixels[i, j] = black

    for i in intermediate:
        pixels[i[0], i[1]] = white

    intermediate_img.save(intermediateShape)
コード例 #2
0
def get_city_name():
    if request.headers['Content-Type'] == 'text/plain':
        try:
            text = request.data.decode("utf-8")
            lat, lon = text.split("+")
            cur = myConnection.cursor()
            query = "SELECT name, coordinates FROM geo_cords"
            cur.execute(query)
            count = 0
            point = Point(float(lat), float(lon))
            for place, coor in cur.fetchall():
                lats = []
                lons = []
                coor = coor.replace("{", "").replace("}", "").split(",")
                coor = list(map(float, coor))
                for index, val in enumerate(coor):
                    if index % 2 == 0:
                        lats.append(val)
                    else:
                        lons.append(val)
                points = []
                for i in range(len(lats)):
                    points.append(Point(lons[i], lats[i]))
                hull = MultiPoint(points=points).convex_hull
                if hull.contains(point):
                    count += 0
                    return "Location found in: " + place
            if count == 0:
                return "Location not found!"
        except:
            print("Invalid input provided!")
            return "Invalid Input!"
コード例 #3
0
def createIntermediateImage(translated, intermediateShape, pixels):
		intermediate=()
		for x in translated.tolist()[0]:
			intermediate = intermediate + ((x[0],x[1]),)

		poly_unordered = MultiPoint(intermediate).convex_hull

		img_width, img_height = pixels

		intermediate_img = Image.new('1', (img_width, img_height))
		pixels = intermediate_img.load()
		white = 1 #(255,255,255)
		black = 0 #(0,0,0)

		for i in range(img_width):
			for j in range(img_height):
				point = Point(i,j)
				if poly_unordered.contains(point):
					pixels[i,j] = white #formerly grey
				else:
					pixels[i,j] = black

		for i in intermediate:
			pixels[i[0],i[1]] = white

		intermediate_img.save(intermediateShape)
コード例 #4
0
def check_polygon_for_image(image_path, polygon):
    im = PIL.Image.open(image_path)
    width, height = im.size
    for x in range(width):
        for y in range(height):
            #print('Checking pixel '+str(x)+' '+str(y))
            point = Point(x, y)
            poly = MultiPoint(polygon).convex_hull
            #print(poly.contains(point))
            if poly.contains(point):
                rgb_list = []
                r, g, b = im.getpixel((x, y))
                rgb_list.append(r)
                rgb_list.append(g)
                rgb_list.append(b)
                hand_list.append(rgb_list)
                print(str(r) + ' ' + str(g) + ' ' + str(b))
            else:
                rgb_list = []
                r, g, b = im.getpixel((x, y))
                rgb_list.append(r)
                rgb_list.append(g)
                rgb_list.append(b)
                background_list.append(rgb_list)
    np.save('handlist.npy', hand_list)
    np.save('background_list.npy', background_list)
コード例 #5
0
ファイル: tesselect.py プロジェクト: antonsergeev/tesselect
def PreciseLabels(data_shape, argmin_xy, out_edges, mask_center):
    """
    Fuction
    """
    mesh_x, mesh_y = np.meshgrid(np.arange(data_shape[1]), np.arange(data_shape[0]))
    coords = np.vstack((mesh_x.ravel(), mesh_y.ravel())).T
    coords = MultiPoint(coords)
    label_data_prec = np.zeros(data_shape, dtype=int)
    
    num = np.sum(mask_center)  # number of precise labels
    percentage = np.rint(np.linspace(0,num,21)).astype(int)
    count = 0  # number of calculated labels
    print('Calculated: ', end='')
    
    for i, outs in enumerate(out_edges):
        if mask_center[i] == True:
            poly = MultiPoint(argmin_xy.T[outs]).convex_hull
            inpoints = [point for point in coords if poly.contains(point)]
            for point in inpoints:
                label_data_prec[point.y, point.x] = i + 1
            
            if count in percentage:
                print('{}%... '.format(np.argwhere(percentage==count)[0,0]*5), end='')
            elif count == num - 1:
                print('100%')
            count += 1
    
    return label_data_prec
コード例 #6
0
ファイル: server.py プロジェクト: vishwajeet1132/apitest
def get_city_name():
    if request.headers['Content-Type'] == 'text/plain':
        try:
            text = request.data.decode("utf-8")
            lat,long=text.split("+")
            cur=myConnection.cursor()
            query="select name,parent,coordinates from compute"
            cur.execute(query)
            sd=pd.DataFrame(cur.fetchall(),columns=["name","parent","coordinates"])
            for index in sd.iterrows():
                kj=sd.coordinates[index[0]].replace("{","").replace("}","").split(",")
                xs=[]
                ys=[]
                c=0
                for i in kj:
                    p=float(i)
                    if c%2==0:
                        xs.append(p)
                    else:
                        ys.append(p)
                    c+=1
                sd.coordinates[index[0]]=list(zip(xs,ys))
            x=float(lat)
            y=float(long)
            for index, row in sd.iterrows():
                poly = MultiPoint(row["coordinates"]).convex_hull
                point = Point(y,x)
                if poly.contains(point)==True:
                    print(str(sd.loc[index,"name"]))
                    return "the place of location is " + str(sd.loc[index,"name"])
        except:
            print("wrong input given by user")
            return "you have entered wrong data"
    else:
        return "415 Unsupported Media Type ;)"
コード例 #7
0
ファイル: figure_S5_facs.py プロジェクト: jbkinney/16_titeseq
def in_gate(data, gate, name1, name2):
    x_data = data[name1]
    y_data = data[name2]
    x_data = [np.log10(max(x, 1e-10)) for x in x_data]
    y_data = [np.log10(max(y, 1e-10)) for y in y_data]
    poly = MultiPoint(gate).convex_hull
    usethis = [poly.contains(Point(x, y)) for x, y in zip(x_data, y_data)]
    return usethis
コード例 #8
0
ファイル: adsb-filter.py プロジェクト: zymITsky/adsb-tools
class FlightParser(object):
  def __init__(self, args):
    self.bounds = args.bounds
    self.date = args.date
    self.days_ahead = int(args.days_ahead)
    self.bounds_fp = geojson.load(open(args.bounds))
    self.coords = self.bounds_fp['features'][0]['geometry']['coordinates'][0]
    self.shape = MultiPoint(self.coords).convex_hull
    self.out_tmpfile = "%s.json" % str(uuid.uuid4())
    self.inside = []

  def run(self):
    if self.days_ahead == 1:
      self.parse(self.date)
    else:
      year, month, day = self.date.split('-')
      for date in self.find_dates(int(year), int(month), int(day)):
        self.parse(date)
    with open(self.out_tmpfile, 'w') as f:
      f.write(json.dumps(inside))
    print 'Filtered data is now in %s' % self.out_tmpfile

  def find_dates(self, year, month, day):
    base = datetime.datetime(year, month, day)
    for obj in [base + datetime.timedelta(days=x) for x in range(0, self.days_ahead)]:
      yield obj.strftime('%Y-%m-%d')

  def parse(self, date):
    print 'Downloading http://history.adsbexchange.com/Aircraftlist.json/%s.zip' % date
    temp_file = '/tmp/adsb_%s.zip' % date
    if not os.path.exists(temp_file):
      r = requests.get('http://history.adsbexchange.com/Aircraftlist.json/%s.zip' % date, stream=True)
      with open(temp_file, 'wb') as f:
        total_length = int(r.headers.get('content-length'))
        for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): 
          if chunk:
            f.write(chunk)
            f.flush()
    self.filter(temp_file, date)

  def filter(self, f, date):
    out_tmpfile = 'filtered_%s.json' % date
    zf = zipfile.ZipFile(f)
    for info in zf.infolist():
      try:
        data = json.loads(zf.read(info.filename))
        print "Working on", info.filename
        for sample in data['acList']:
          if 'Lat' in sample and 'Long' in sample and 'Icao' in sample:
            point = Point([sample['Long'], sample['Lat']])
            if self.shape.contains(point):
              self.inside.append(sample)    
      except Exception as e:
        print "Could not read %s from ZIP archive" % info.filename
        print "Error:", e

    os.remove(f)
コード例 #9
0
def city_point(city):
    """
    :param city:需要查询的城市
    :return:城市内的符合要求的等距坐标

    """
    list_p = []
    list_q = []
    # 根据接口查询城市边界的坐标
    url = city_url.format(0, GAODE_API_KEY, city)
    response = requests.get(url=url, headers=headers)
    data = response.json()
    # 获得城市边界坐标
    poly = data['districts'][0]['polyline']

    # 不匹配岛屿
    # poly = re.sub('\|.*\|',';',poly)
    # poly = poly.split("|")
    poly = re.sub('\|', ';', poly)
    # print(len(poly))
    # 将坐标进行处理,获得四个角落的坐标,构造一个矩形网络
    poly_list1 = poly.split(';')
    poly_list2 = list(zip(*[a.split(',') for a in poly_list1]))
    max_lng = max([int(a.replace('.', '')) for a in poly_list2[0]])
    min_lng = min([int(a.replace('.', '')) for a in poly_list2[0]])
    max_lat = max([int(a.replace('.', '')) for a in poly_list2[1]])
    min_lat = min([int(a.replace('.', '')) for a in poly_list2[1]])
    # 纬度1°为111.3195km,经度每度为111.3195cos(纬度)
    g = int((max_lng - min_lng) * 102.3022 / 4242640)
    g1 = [round(min_lng + i * 4242640 / 102.3022) for i in range(1, g)]
    h = int((max_lat - min_lat) * 111.3195 / 4242640)
    h1 = [round(min_lat + i * 4242640 / 111.3195) for i in range(1, h)]
    # 获得矩形网络内距离为4.2km的所有坐标
    while g1:
        g11 = g1.pop()
        # print(g11)
        for j in h1:
            list_p.append((g11, j))
    k = [a.split(',') for a in poly_list1]
    coords = [
        tuple(map(int, (i.replace('.', ''), j.replace('.', '')))) for i, j in k
    ]
    poly = MultiPoint(coords).convex_hull
    # 根据判断所有属于城市内的坐标并返回值

    for p in list_p:
        if poly.contains(Point(p)):

            list_q.append(p)
    # print(len(list_p))
    t_list = []

    for a, b in list_q:
        t_geohash = mzgeohash.encode((a / 1000000, b / 1000000), length=12)
        t_list.append((a / 1000000, b / 1000000, t_geohash))
    # print(t_list)
    return t_list
コード例 #10
0
    def Find_Average_Hexagon_Color(self, hex_coords, im):
        from shapely.geometry import Point, MultiPoint

        coords = list(hex_coords)

        # Default RGB values to black opaque and pixel counter to zero.
        rgb = [0, 0, 0]
        count = 0

        # Calculate hexagon bounding box.
        minx = min(coords[::2])
        maxx = max(coords[::2])
        miny = min(coords[1::2])
        maxy = max(coords[1::2])

        bbox_coords = [minx, miny, maxx, miny, maxx, maxy, minx, maxy]

        # Calculate polygon center.
        midx = (minx + maxx) / 2.0
        midy = (miny + maxy) / 2.0

        coords[::2]  = [(self.scale * (x - midx)) + midx for x in coords[::2]]
        coords[1::2] = [(self.scale * (y - midy)) + midy for y in coords[1::2]]

        subhex_coords = list(zip(coords[::2], coords[1::2]))

        subhex_hull = MultiPoint(subhex_coords).convex_hull

        # Flatten subhex list of tuples to conventional list for plotting.
        subhex_coords = list(sum(subhex_coords, ()))

        for x in range(int(math.floor(minx)), int(math.ceil(maxx))):
            for y in range(int(math.floor(miny)), int(math.ceil(maxy))):
                mypt = Point(x, y)
                if(subhex_hull.contains(mypt)):
                    r, g, b = im.getpixel(tuple([x, y]))
                    rgb[0] += r
                    rgb[1] += g
                    rgb[2] += b
                    count  += 1

        rgb[0] = rgb[0] / count
        rgb[1] = rgb[1] / count
        rgb[2] = rgb[2] / count

        rgb_color = tuple([int(i) for i in rgb])

        return bbox_coords, subhex_coords, rgb_color
コード例 #11
0
    def Find_Average_Hexagon_Color(self, hex_coords, im):
        from shapely.geometry import Point, MultiPoint

        coords = list(hex_coords)

        # Default RGB values to black opaque and pixel counter to zero.
        rgb = [0, 0, 0]
        count = 0

        # Calculate hexagon bounding box.
        minx = min(coords[::2])
        maxx = max(coords[::2])
        miny = min(coords[1::2])
        maxy = max(coords[1::2])

        bbox_coords = [minx, miny, maxx, miny, maxx, maxy, minx, maxy]

        # Calculate polygon center.
        midx = (minx + maxx) / 2.0
        midy = (miny + maxy) / 2.0

        coords[::2] = [(self.scale * (x - midx)) + midx for x in coords[::2]]
        coords[1::2] = [(self.scale * (y - midy)) + midy for y in coords[1::2]]

        subhex_coords = list(zip(coords[::2], coords[1::2]))

        subhex_hull = MultiPoint(subhex_coords).convex_hull

        # Flatten subhex list of tuples to conventional list for plotting.
        subhex_coords = list(sum(subhex_coords, ()))

        for x in range(int(math.floor(minx)), int(math.ceil(maxx))):
            for y in range(int(math.floor(miny)), int(math.ceil(maxy))):
                mypt = Point(x, y)
                if (subhex_hull.contains(mypt)):
                    r, g, b = im.getpixel(tuple([x, y]))
                    rgb[0] += r
                    rgb[1] += g
                    rgb[2] += b
                    count += 1

        rgb[0] = rgb[0] / count
        rgb[1] = rgb[1] / count
        rgb[2] = rgb[2] / count

        rgb_color = tuple([int(i) for i in rgb])

        return bbox_coords, subhex_coords, rgb_color
コード例 #12
0
def get_neighborhood_from_kml(results, kml_path):
  test_lat, test_lon = (results['geometry']['location']['lat'],
                        results['geometry']['location']['lng'])
  test_point = Point(float(test_lat), float(test_lon))
  kml = etree.parse(kml_path)
  placemarks = kml.findall('//kml:Placemark', namespaces=NSMAP)
  found_neighborhood = None
  for placemark in placemarks:
    el = placemark.find(COORDINATES, namespaces=NSMAP)
    coords = []
    for coord in el.text.split(' '):
      lat, lon, _ = coord.split(',')
      coords.append((float(lon), float(lat)))
    poly = MultiPoint(coords).convex_hull
    if poly.contains(test_point):
      name = placemark.find('kml:name', namespaces=NSMAP)
      found_neighborhood = name.text
  if found_neighborhood is None:
    return get_neighborhood(results)
  return found_neighborhood
コード例 #13
0
def get_neighborhood_from_kml(lat_lon, kml_path):
  test_lat, test_lon = lat_lon
  test_point = Point(float(test_lat), float(test_lon))
  kml = etree.parse(kml_path)
  placemarks = kml.findall('//kml:Placemark', namespaces=NSMAP)
  found_neighborhood = None
  for el in kml.findall('.//kml:coordinates', namespaces=NSMAP):
    coords = []
    for coord in el.text.split(' '):
      lat, lon, _ = coord.split(',')
      coords.append((float(lon), float(lat)))
    poly = MultiPoint(coords).convex_hull
    if poly.contains(test_point):
      placemark = el.getparent().getparent().getparent().getparent()
      if 'MultiGeometry' in str(placemark.tag):
        placemark = placemark.getparent()
      val = placemark.find('kml:ExtendedData/kml:Data[@name=\'32CitiesNa\']/kml:value', namespaces=NSMAP)
      if val is not None:
        found_neighborhood = val.text
  return found_neighborhood
コード例 #14
0
def get_inlier_guess(rect_pts,
                     horz_idx,
                     vert_idx,
                     lines1,
                     lines2,
                     dist=300,
                     radius_multiple=5):
    accepted_pts = set()
    for (horz, vert) in itertools.product(horz_idx, vert_idx):
        hp1, hp2 = lines1[horz], lines2[horz]
        vp1, vp2 = lines1[vert], lines2[vert]

        hu = hp2 - hp1
        vu = vp2 - vp1

        A = np.array([[hu[0], -vu[0]], [hu[1], -vu[1]]])
        b = np.array([vp1[0] - hp1[0], vp1[1] - hp1[1]])
        mult = np.linalg.solve(A, b)

        pt = np.mean([hp1 + mult[0] * hu, vp1 + mult[1] * vu], 0)

        dists = np.sum((rect_pts - pt)**2, 1)
        idx = np.argmin(dists)
        if dists[idx] < 10:
            accepted_pts.add(idx)
    accepted_pts = list(accepted_pts)

    # Broaden the search to any nearby points
    hull = MultiPoint(rect_pts[accepted_pts, :]).convex_hull
    hull = prep(hull.buffer(np.sqrt(hull.area) * radius_multiple))
    inlier_guess = [
        i for i in range(rect_pts.shape[0])
        if hull.contains(Point(rect_pts[i, :]))
    ]

    #     plt.scatter(rect_pts[:,0], rect_pts[:,1], c='r')
    #     plt.scatter(rect_pts[inlier_guess,0], rect_pts[inlier_guess,1], c='y')
    #     plt.scatter(rect_pts[accepted_pts,0], rect_pts[accepted_pts,1], c='g')
    #     plt.show()

    return inlier_guess
コード例 #15
0
ファイル: seismic_network.py プロジェクト: nimanshr/toolbox
class SeismicNetwork(object):
    def __init__(self, net_lats, net_lons):
        poly_x, poly_y = pyproj.transform(wgs84, pj_laea, net_lons, net_lats)
        self.polygon = MultiPoint(zip(poly_x, poly_y)).convex_hull

    def contains(self, lat, lon):
        x, y = pyproj.transform(wgs84, pj_laea, lon, lat)
        point = Point(x, y)
        if self.polygon.contains(point):
            return True
        else:
            return False

    def inside_network(self, epi_lats, epi_lons):
        """
        This function returns epicenter coordinates located inside a seismic
        station network. The point-in-polygon problem is solved based on ray
        casting method.

        :param epi_lats: Latitudes of earthquake epicenters.
        :param epi_lons: Longitudes of earthquake epicenters.

        :type epi_lats: numpy.array, list/tuple or scalar
        :type epi_lons: numpy.array, list/tuple or scalar

        :returns:
            Epicenter coordinates located within network. The first and second
            columns are latitude and longitude, respectively.
        :rtype: numpy.array
        """
        epi_x, epi_y = pyproj.transform(wgs84, pj_laea, epi_lons, epi_lats)
        r = []
        for i, (x, y) in enumerate(zip(epi_x, epi_y)):
            epicenter = Point(x, y)
            if epicenter.within(self.polygon):
                r.append((epi_lats[i], epi_lons[i]))
        return np.array(r)
コード例 #16
0
class Planta:
    """
    Essa classe cuida do problema de conhecer todos os pontos dentro de uma determinada
    forma geométrica.
    """
    # Inicializados no init:
    pontos_internos = None
    pontos_paredes = None
    fontes = None
    granularidade = None
    # Setados ao procurar os pontos internos (função procurar_pontos_internos):
    origem = None
    poligono = None

    def __init__(self, granularidade: Union[float, int]):
        self.pontos_internos = set()
        self.pontos_paredes = list()
        self.fontes = list()

        if not isinstance(granularidade, (float, int)):
            raise Exception("Informe a granularidade do tipo float ou int.")
        self.granularidade = granularidade

    def adicionar_parede(self, *pontos: Union[Ponto, List[Union[float, int]]]):
        """
        Adiciona uma lista de pontos (que é uma parede) à lista de paredes.

        A planta lembra de todas paredes que a definem.
        É importante saber quais são as paredes porque é preciso saber se um determinado
        feixe, que surge numa fonte e vai até um ponto, atravessa paredes ou não.
        """
        """
        ABAIXO, UM BUCADO DE CHECAGEM DE TIPOS!
        """
        if len(pontos) < 2:
            raise Exception(
                "Ao adicionar uma parede, informe mais pontos! Lembre que uma parede é uma linha."
            )

        for ponto in pontos:
            # vamos verificar todos itens
            if isinstance(ponto, Ponto):
                # é ponto, sem problemas
                pass
            elif not isinstance(ponto, list):
                # não é ponto nem lista: problemas!
                ex = """
                Passe pontos separados por vírgula.
                Exemplo: adicionar_parede(Ponto(1,1), Ponto(0,0))
                ou adicionar_parede([1,1], [0,0])"""
                raise Exception(ex)
            elif len(ponto) < 2:
                # não é ponto, mas é lista e não tem pelo menos 2 itens? problemas!
                raise Exception(
                    "Ao adicionar uma parede, informe mais pontos! Lembre que uma parede é uma linha."
                )
            else:
                # não é ponto, é lista, tem pelo menos 2 itens: vamos ver se todos itens são numéricos!
                for x in ponto:
                    if not isinstance(x, (float, int)):
                        raise Exception(
                            "as coordenadas dos pontos precisam ser float ou int!"
                        )

        self.pontos_paredes.append(pontos)

    def simular_fontes(self, *fontes: Ponto):
        """
        Avalia a intensidade do sinal em todos os pontos internos de acordo com as fontes informadas.

        Obs: cada ponto irá guardar sua nova intensidade.
        """

        # Se algum dos itens abaixo for none, chamamos a função que os seta

        checks = (self.pontos_internos, self.origem, self.poligono)
        if any([x is None for x in checks]):
            self.procurar_pontos_internos()

        # Setamos as fontes na propriedade da classe. Isso é pra que a função self.avaliar() possa
        # consultar quais são as fontes!
        self.fontes = fontes

        # A função abaixo seta o valor de cada ponto de acordo com as fontes.
        for ponto in self.pontos_internos:
            if ponto in self.fontes:
                continue
            self.avaliar(ponto)

    def procurar_pontos_internos(self):
        """
        Escolhe um ponto de partida (ou seja, uma origem) e vai pulando de vizinho em vizinho até
        encontrar todos os pontos que estão dentro da planta. Se parece com um Breadth-First-Search.

        - A escolha da origem é assim: primeiro vejo se o ponto exatamente no meio dos limites da planta
        está dentro da planta.

        Se não tiver, eu vou gerar pontos aleatórios dentro dos limites da planta até um cair
        dentro da planta.

        - Esta é a função que gera o polígono da planta. O polígono é construído com base nas pontas
        das paredes. Também, o polígono é o que usamos pra dizer se um ponto está dentro ou fora
        da planta.
        """
        """
        SETANDO POLÍGONO DA PLANTA
        """
        # Pegando todos os pontos de todas paredes
        pontos_paredes = []
        for parede in self.pontos_paredes:
            pontos_paredes.extend(parede)

        # Pegando a casca convexa que é formada por esses pontos, e formando o polígono
        self.poligono = MultiPoint(pontos_paredes).convex_hull
        """
        ACHANDO A ORIGEM
        """
        # Achando o ponto central dentro dos limites da planta
        minx, miny, maxx, maxy = self.poligono.bounds

        origem = [media(minx, maxx), media(miny, maxy)]
        origem = Ponto(*origem)

        if self.poligono.contains(origem):
            self.origem = origem

        else:
            self.origem = ponto_aleatorio(self.poligono)

        # Eu considero a origem como ponto interno!
        self.pontos_internos.add(self.origem)
        """
        BUSCANDO TODOS PONTOS EM TORNO DA ORIGEM, DENTRO DO POLÍGONO
        """
        self.origem.calcular_vizinhos(self.granularidade)
        fifo = fila(self.origem.vizinhos)

        while fifo:
            novo_ponto = fifo.popleft()

            if not self.poligono.contains(novo_ponto):
                # Se o ponto atual está fora da planta, ignore-o
                continue

            if novo_ponto in self.pontos_internos:
                # Se o ponto atual está dentro da planta e já foi visitado, ignore-o
                continue

            # Adiciono o ponto atual
            self.pontos_internos.add(novo_ponto)

            # Acrescento seus vizinhos na fila para serem verificados
            fifo.extend(novo_ponto.calcular_vizinhos(self.granularidade))

    def encontrar(self, p: Union[Ponto, List[Union[float, int]]]):
        """
        Retorna qual é o ponto correspondente às coordenadas passadas.

        Já que a área dentro da planta foi "discretizada", se você me der um ponto qualquer, eu te digo
        qual é o ponto correspondente na discretização que foi feita a partir da granularidade passada.

        Observação: nem sempre retorna qual o ponto discreto mais próximo, porque sempre arredondo as
        coordenadas pra baixo!
        """

        if isinstance(p, Ponto):
            pass
        elif not isinstance(p, list):
            # não é ponto nem lista: problemas!
            raise Exception(
                "Informe o ponto como um objeto Ponto ou lista de coordenadas")
        elif len(p) < 2:
            # não é ponto, mas é lista e não tem pelo menos 2 itens? problemas!
            raise Exception("Informe o ponto com todas suas coordenadas!")
        else:
            for x in p:
                # não é ponto, é lista, tem pelo menos 2 itens: vamos ver se todos itens são numéricos!
                if not isinstance(x, (float, int)):
                    raise Exception(
                        "As coordenadas do ponto precisam ser float ou int!")
            p = Ponto(*p)

        # quantas "granularidades" inteiras temos da origem até o ponto, no eixo x?
        delta_x = int((p.x - self.origem.x) / self.granularidade)
        # quantas "granularidades" inteiras temos da origem até o ponto, no eixo y?
        delta_y = int((p.y - self.origem.y) / self.granularidade)

        estimativa = [
            self.origem.x + delta_x * self.granularidade,
            self.origem.y + delta_y * self.granularidade
        ]

        estimativa = Ponto(*estimativa)

        if self.poligono.contains(estimativa):
            for pi in self.pontos_internos:
                if pi == estimativa:
                    # Isso serve para retornar o mesmo objeto que tem dentro de pontos_internos,
                    # para não perder a informação de vizinhos
                    return pi
            return estimativa
        return None

    def avaliar(self, p: Ponto):
        """
        Essa função só serve para chamar para a função que vai realizar o cálculo.

        Isso serve para podermos ter várias funções de cálculo,e poder trocar entre elas facilmente.
        O resto do código chama essa função (avaliar). Então basta mudar aqui e já era.

        Toda função de cálculo só pode receber um parâmetro: um ponto.
        """

        if not isinstance(p, Ponto):
            raise Exception(
                "A função de avaliar deve receber um objeto Ponto como parâmetro."
            )

        return self.avaliar_recepcao_sinal(p)

    def avaliar_distancia_simples(self, p: Ponto):
        """
        Retorna a distância entre o ponto e a origem. Só pra brincar
        """
        p.valor = distancia_entre_pontos(p, self.origem)
        return p.valor

    def avaliar_perda_paredes(self, p: Ponto):
        """
        Retorna a quantidade de paredes que o sinal do roteador intercepta até chegar no ponto p.
        """
        fonte = self.fontes[0]
        intersecoes = []
        for parede in self.pontos_paredes:
            if line_intersection(parede, [fonte, p]):
                intersecoes.append(parede)

        return intersecoes

    def avaliar_recepcao_sinal(self, p: Ponto):
        """
        A função que iremos utilizar é a da página 179 do livro projetando WLAN.

        A atenuação do sinal pode ser medido através da seguinte fórmula:
        L = L(d0) + 10*n*log(d)

        L(d0): é a perda de propagação de referência a um metro de distância em dB. Esse valor é tabelado de acordo com
        a faixa de frequência, como vamos trabalhar com 2.4GHZ, então o valor de L(d0) será 40.2 dB

        n: Gradiente distância-potência, é o decaimento da potência após uma distância em metros. Utilizaremos o valor
        2.8 que é para obstrução média

        d: distância do transmissor para o receptor

        para calcular o nível de recepcao usaremos a somamos os ganhos e perdas:

        Iremos utilizar como base o roteador Roteador Wireless IWR 1000N que tem Potência de 20dBm e ganho da antena
        5dbi, então:

        (25 - L) - n*atenuação parede interna - n*atenuação parede externa

        atenuação parede interna: 4db

        atenuação parede externa: 18db
        """
        potencia_transmissor = 20
        ganho_antena = 5
        atenuacao_parede = 4
        qtd_paredes = len(self.avaliar_perda_paredes(p))
        distancia_transmissor_receptor = distancia_entre_pontos(
            p, self.fontes[0])
        atenuacao_propagacao = 40.2 + 10 * log10(
            distancia_transmissor_receptor)

        p.valor = abs(potencia_transmissor + ganho_antena -
                      atenuacao_propagacao - qtd_paredes * atenuacao_parede)

        return abs(p.valor)
コード例 #17
0
ファイル: bvc.py プロジェクト: shiyangC/dstermpaper
def pcontains(points, point):
    hull = MultiPoint(points).convex_hull
    return hull.contains(point)
コード例 #18
0
def blockers_gen(rate, scenario, route, Plot=False, tolerance=150):
    #The blockage rate is given in square meters blocked
    blockers = {}
    blockers['objects'] = []
    '''
    totalArea = (scenario['boundaries']['xmax']-scenario['boundaries']['xmin'])*(
                scenario['boundaries']['ymax']-scenario['boundaries']['ymin'])
    routeBuffer = route.buffer(tolerance, cap_style=3)
    totalArea = routeBuffer.area - 2*tolerance*np.sqrt(((tolerance**2)/2) - (tolerance/2)**2)
    #'''

    routeBuffer = MultiPoint([
        (scenario['boundaries']['xmin'], scenario['boundaries']['ymin']),
        (scenario['boundaries']['xmin'] + tolerance,
         scenario['boundaries']['ymin']),
        (scenario['boundaries']['xmin'],
         scenario['boundaries']['xmin'] + tolerance),
        (scenario['boundaries']['xmax'] - tolerance,
         scenario['boundaries']['ymax']),
        (scenario['boundaries']['xmax'],
         scenario['boundaries']['xmax'] - tolerance),
        (scenario['boundaries']['xmax'], scenario['boundaries']['ymax'])
    ]).convex_hull

    totalArea = routeBuffer.area

    totalBlockers = np.random.poisson(rate * totalArea)
    #print(totalArea)
    #print(totalBlockers)

    nBlockers = 0
    while (nBlockers < totalBlockers):  #rate*totalArea):
        centroidX = np.random.randint(scenario['boundaries']['xmin'],
                                      scenario['boundaries']['xmax'])
        centroidY = np.random.randint(scenario['boundaries']['ymin'],
                                      scenario['boundaries']['ymax'])

        point = Point([centroidX, centroidY])
        '''    
        if type(route) == type(LineString([(0,0),(1,1)])):
            upperlimit = route.parallel_offset(tolerance,'left')
            lowerlimit = route.parallel_offset(tolerance,'right')

            if not (upperlimit.crosses(point) or lowerlimit.crosses(point)):
                continue
        '''
        if not (routeBuffer.contains(point)):
            continue

        blockers['objects'].append({})
        blockers['objects'][-1][
            'nVertices'] = 4  #All objects are quadrilaterals

        blockers['objects'][-1]['centroid'] = {'x': centroidX, 'y': centroidY}

        blockers['objects'][-1]['polygon'] = Polygon([
            (centroidX - 0.5, centroidY + 0.5),
            (centroidX + 0.5, centroidY + 0.5),
            (centroidX + 0.5, centroidY - 0.5),
            (centroidX - 0.5, centroidY - 0.5)
        ])

        if Plot:
            x, y = blockers['objects'][-1]['polygon'].exterior.xy
            plt.plot(x, y, color='red')

        nBlockers += 1
    plt.show()
    return blockers
コード例 #19
0
           
            if exclude_France=="True":
                m.readshapefile(shape_file,'France')

                for shape in m.France:
                    if shape == m.France[0]:
                        poly = MultiPoint(shape).convex_hull
                    else:
                        poly = poly.union(MultiPoint(shape).convex_hull)

                for row in cfile:
                    if isnumber(row[1]) and isnumber(row[2]) and isnumber(row[3]):
                        x=float(row[3])
                        y=float(row[2])
                        po = Point(m(x,y))
                        if not poly.contains(po):
                            for i in range(0,int(row[1])):
                                lat.append(y)
                                lon.append(x)
            else:
                for row in cfile:
                    if isnumber(row[1]) and isnumber(row[2]) and isnumber(row[3]):
                        for i in range(0,int(row[1])):
                            lat.append(float(row[2]))
                            lon.append(float(row[3]))



            #make figure
            fig = plt.figure(figsize=(12,5))
コード例 #20
0
def clusteredBlockerGen(parentRate: float, daughterRate: float,
                        daughterSigma: float, scenario, route, tolerance,
                        Plot):
    '''
    This function generates unitary area obstacles following a Thomas Clustered
    Process


    '''

    #The blockage rate is given in square meters blocked
    blockers = {}
    blockers['objects'] = []

    routeBuffer = MultiPoint([
        (scenario['boundaries']['xmin'], scenario['boundaries']['ymin']),
        (scenario['boundaries']['xmin'] + tolerance,
         scenario['boundaries']['ymin']),
        (scenario['boundaries']['xmin'],
         scenario['boundaries']['xmin'] + tolerance),
        (scenario['boundaries']['xmax'] - tolerance,
         scenario['boundaries']['ymax']),
        (scenario['boundaries']['xmax'],
         scenario['boundaries']['xmax'] - tolerance),
        (scenario['boundaries']['xmax'], scenario['boundaries']['ymax'])
    ]).convex_hull

    totalArea = routeBuffer.area

    nClusters = np.random.poisson(parentRate * totalArea)

    clusterPoints = np.random.poisson(daughterRate, nClusters)
    totalBlockers = sum(clusterPoints)

    if Plot:
        print(nClusters, clusterPoints, totalBlockers)

    cluster = 0
    while cluster < nClusters:

        inside = False
        while not inside:
            parentX = np.random.randint(scenario['boundaries']['xmin'],
                                        scenario['boundaries']['xmax'])
            parentY = np.random.randint(scenario['boundaries']['ymin'],
                                        scenario['boundaries']['ymax'])

            point = Point([parentX, parentY])

            inside = routeBuffer.contains(point)

        perCluster = 0
        nPoints = clusterPoints[cluster]
        cluster += 1
        while (perCluster < nPoints):
            centroidX = parentX + np.random.normal(0, daughterSigma)
            centroidY = parentY + np.random.normal(0, daughterSigma)

            point = Point([centroidX, centroidY])

            #if not (routeBuffer.contains(point)):
            #    continue

            blockers['objects'].append({})
            blockers['objects'][-1][
                'nVertices'] = 4  #All objects are quadrilaterals

            blockers['objects'][-1]['centroid'] = {
                'x': centroidX,
                'y': centroidY
            }

            blockers['objects'][-1]['polygon'] = Polygon([
                (centroidX - 0.5, centroidY + 0.5),
                (centroidX + 0.5, centroidY + 0.5),
                (centroidX + 0.5, centroidY - 0.5),
                (centroidX - 0.5, centroidY - 0.5)
            ])

            if Plot:
                x, y = blockers['objects'][-1]['polygon'].exterior.xy
                plt.plot(x, y, color='red')

            perCluster += 1

    plt.show()
    return blockers
コード例 #21
0
i = 0
coords_list2 = []
with open(TWITTER_FILE) as f:
    f.readline()
    for line in f:
        try:
            data = json.loads(line[0:len(line) - 2])
            if data["coordinates"]["coordinates"]:
                point = Point(data["coordinates"]["coordinates"][1],
                              data["coordinates"]["coordinates"][0])
                        # data["coordinates"]["coordinates"][lat, lgt]
                for suburb in suburbs.keys():
                    for dict in suburbs[suburb].items():
                        poly = dict[1][1]
                        if poly.contains(point):
                            suburbs[suburb]['count'] += 1
                            scores = sid.polarity_scores(data['text'])
                            sorted_scores = sorted(scores.items(), key=lambda item: item[1], reverse=True)
                            if sorted_scores[0][0] != 'neg':
                                suburbs[suburb]['count_pos'] += 1
                                print ++i
        except TypeError:
            continue
        except ValueError:
            data = json.loads(line[0:len(line) - 1])
            if data["coordinates"]:
                coords = [data["coordinates"]["coordinates"][1],
                          data["coordinates"]["coordinates"][0]]
                coords_list2.append(coords)
                print coords