def getBbox(self): '''! ''' ptos = self.__poli.getPuntos() x = [i.getX() for i in ptos] y = [i.getY() for i in ptos] return [Punto2D(min(x), max(y)), Punto2D(max(x), min(y))]
def setNegativos(self, Negativos): '''! @brief: Método para introducir la propiedad Negativos. @param Neagativos bool|str|int: Estado de la propiedad Negativos. @note Neagativos True: Permite alojar números negativos. @note Neagativos False: No permite alojar números negativos. @exception: Se producira una excepción si el valor introducido no se puede convertir a bool. @exception: Se producira una excepcion si se cambia la propiedad negativos a Flase y existen coordenadas negativas en la clase. ''' Punto2D.setNegativos(self, Negativos) if self.getNegativos() == False: if self.__Z != None and self.__Z < 0: raise Exception("La coordenada Z de la clase es negativa.")
def main(): l=Linea2D(Punto2D(10,10),Punto2D(20,30)) print(l.toString()) print(l.toJSON()) print(loads(l.toJSON())['Punto inicial']['X']) print(l.toGeoJSON()) print(loads(l.toGeoJSON())['coordinates']) print(l.toWKT()) l.setFromWKT('LINESTRING (100.0 10.0, 20.0 30.0)') print(l.toWKT()) l.setFromGeoJSON('{"type":"LineString","coordinates":[[10.0,10.0],[20.0,30.0]]}') print(l.toWKT())
def setNegativos(self, Negativos): '''! @brief: Método para introducir la propiedad Negativos. @param Neagativos bool|str|int: Estado de la propiedad Negativos. @note Neagativos True: Permite alojar números negativos. @note Neagativos False: No permite alojar números negativos. @exception: Se producira una excepción si el valor introducido no se puede convertir a bool. @exception: Se producira una excepcion si se cambia la propiedad negativos a Flase y existen coordenadas negativas en la clase. ''' Punto2D.setNegativos(self, Negativos) if self.getNegativos()==False: if self.__Z!=None and self.__Z<0: raise Exception("La coordenada Z de la clase es negativa.")
def PointIn(self,Punto2D,tolerance=0): #Añadir tolerancia. '''! @brief: El método comprueba si un punto se encuentra sobre la línea. The method check if point is in line. ''' v1=self.getAX() v2=self.getAY() if v1==0: #Incremento de X es 0. Línea vertical. vals=[self.__pini.getY(),self.__pfin.getY()] vals.sort() vals[0]=vals[0]-tolerance vals[1]=vals[1]+tolerance if Punto2D.getY()>=vals[0] and Punto2D.getY()<=vals[1]: return True else: return False if v2==0: #Incremento de Y es 0. Línea horizontal. vals=[self.__pini.getX(),self.__pfin.getX()] vals.sort() vals[0]=vals[0]-tolerance vals[1]=vals[1]+tolerance if Punto2D.getX()>=vals[0] and Punto2D.getX()<=vals[1]: return True else: return False val=self.__pini.getY()-((self.__pini.getX()*v2)/v1)+(v2/v1)*Punto2D.getX() print(val,tolerance,Punto2D.getY()) if Punto2D.getY()+tolerance<=val and Punto2D.getY()-tolerance>=val: return True else: return False
def setFromWKT(self,wkt): '''! ''' try: coor = wkt.split('LINESTRING')[1] except Exception as e: raise Exception(e) coor = coor.replace('(', '') coor = coor.replace(')', '') coor=coor.split(',') if len(coor)>2: raise Exception("La linea contiene más de dos puntos.") vals=coor[0].rstrip().split() self.setPuntoInicial(Punto2D(vals[0],vals[1])) vals=coor[1].rstrip().split() self.setPuntoFinal(Punto2D(vals[0],vals[1]))
def setFromWKT(self, wkt): '''! ''' self.__poli = None self.__Huecos = [] coor = wkt.split('POLYGON')[1] coor = coor.split(')') for indi1, i in enumerate(coor): puntos = [] print(i) if indi1 == 0: i = i.replace('(', '') i = i.split(',') for j in i: j = j.rstrip() j = j.split() puntos.append(Punto2D(j[0], j[1])) pol = poli2d.PoliLinea2D() pol.setPoliLineaFromPuntos(puntos) self.__poli = pol else: if i == '': continue i = i[1:] i += ')' i = 'LINESTRING ' + i #print(i) pol = poli2d.PoliLinea2D() pol.setWKT(i) self.setHuecos(pol)
def toGeoJSON(self): '''! ''' val = Punto2D.toGeoJSON(self).split('\n') val[2] = '"coordinates":' + '[' + str(self.getX()) + ',' + str( self.getY()) + ',' + str(self.__Z) + ']' return '\n'.join(val)
def setFromGeoJSON(self,geojson): '''! ''' try: coors=loads(geojson) except Exception as e: raise Exception(e) if coors['type'] != 'LineString': raise Exception("El GeoJSON introducido no corresponde con una línea") else: coor = coors['coordinates'] if len(coors)>2: raise Exception("") else: self.setPuntoInicial(Punto2D(coor[0][0],coor[0][1])) self.setPuntoFinal(Punto2D(coor[1][0],coor[1][1]))
def toString(self): '''! @brief: Método que devuleve toda la información del punto en formato str. @return str: Un string con toda la información del punto. ''' val = Punto2D.toString(self).split('\n') val.insert(2, "Z:" + str(self.__Z)) return '\n'.join(val)
def toJSON(self): '''! @brief: Método que devuleve toda la información del punto en formato JSON. @return str: Un string en formato JSON. ''' val=Punto2D.toJSON(self).split('\n') val.insert(3,'"Z":'+'"'+str(self.__Z)+'"'+",") return '\n'.join(val)
def toJSON(self): '''! @brief: Método que devuleve toda la información del punto en formato JSON. @return str: Un string en formato JSON. ''' val = Punto2D.toJSON(self).split('\n') val.insert(3, '"Z":' + '"' + str(self.__Z) + '"' + ",") return '\n'.join(val)
def toString(self): '''! @brief: Método que devuleve toda la información del punto en formato str. @return str: Un string con toda la información del punto. ''' val=Punto2D.toString(self).split('\n') val.insert(2,"Z:"+str(self.__Z)) return '\n'.join(val)
def getCentroide(self): '''! ''' ptos = self.__poli.getPuntos()[0:-1] X = [i.getX() for i in ptos] Y = [i.getY() for i in ptos] X = mean(X) Y = mean(Y) return Punto2D(X, Y)
def main(): pl = PoliLinea2D() pl.setPoliLineaFromLineas([ l2d.Linea2D(Punto2D(0.0, 0.0), Punto2D(10, 0)), l2d.Linea2D(Punto2D(10.0, 0), Punto2D(-10, 10)), l2d.Linea2D(Punto2D(-10, 10.0), Punto2D(10, 10)), l2d.Linea2D(Punto2D(10.0, 10.0), Punto2D(-10, 0)), l2d.Linea2D(Punto2D(-10.0, 0), Punto2D(0, 0)) ]) print(pl.isClose()) print(pl.selfIntersect()) print(pl.getLongitud()) print(pl.getLongitudParcial()) print(pl.toGeoJSON()) print(pl.toWKT()) pl.setWKT('LINESTRING (30 10, 10 30, 40 40)') print(pl.toWKT()) pl.setFromGeoJSON( '{"type":"LineString","coordinates": [[0.0,0.0],[10.0,0.0],[-10.0,10.0],[10.0,10.0],[-10.0,0.0],[0.0,0.0]]}' ) print(pl.toWKT())
def setWKT(self, wkt): '''! ''' self.__ptos = [] coor = wkt.split('LINESTRING')[1] coor = coor.replace('(', '') coor = coor.replace(')', '') coor = coor.split(',') Puntos = [] for i in coor: i = i.rstrip() i = i.split() Puntos.append(Punto2D(i[0], i[1])) self.setPoliLineaFromPuntos(Puntos)
def __init__(self, *args,**kwargs): '''! Constructor de la clase Punto2D. *args: La clase admite en el constructor dos o tres argumentos.\n Dos argumentos:\n args1: Punto Punto2D: Punto2D con el valor de las coordenadas X e Y. args2: Z float|int|str: Valor de la coordenada Z.\n Tres argumentos:\n args1 X float: Valor de la coordenada X.\n args2 Y float: Valor de la coordenada Y.\n args3 Z float: Valor de la coordenada Z.\n Parametros de tipo kwargs(para todos los constructores):\n kwargs negativos bool: Estado de la propiedad negativos. @exception: Se producira una excepción si se introducen más o menos argumentos de los admitidos por la clase. @exception: Se producira una excepción si no se reconoce el kwarg introducido. ''' Negativos=None if len(kwargs)>0: for key in kwargs: if key.lower()=='negativos': aux=kwargs[key] self.setNegativos(aux) else: raise Exception("El argumento: "+key+" no se reconoce") if len(args)==2: #Punto2D,Z if isinstance(args[0], Punto2D): CoordenadaX = args[0].getX() CoordenadaY = args[0].getY() CoordenadaZ = args[1] if Negativos==None: Negativos = args[0].getNegativos() self.setNegativos(Negativos) # Inicializar la clase padre. Punto2D.__init__(self, CoordenadaX, CoordenadaY, negativos=Negativos) self.setZ(CoordenadaZ) else: raise Exception("Se esperaba un objeto de la clase Punto2D como primer argumento del constructor") elif len(args)==3: CoordenadaX = args[0] CoordenadaY = args[1] CoordenadaZ = args[2] if Negativos==None: Negativos = True # Valor por defecto. self.setNegativos(Negativos) # Inicializar la clase padre. Punto2D.__init__(self, CoordenadaX, CoordenadaY, negativos=Negativos) self.setZ(CoordenadaZ) elif len(args)==0: Punto2D.__init__(self) #Constructor vacio. pass else: raise Exception("La clase Punto3D recibe 2 o 3 parametros como argumentos.\nSe han introducido: "+str(len(args))+" parametros.")
def setFromGeoJSON(self, geojson): '''! ''' try: coors = loads(geojson) except Exception as e: raise Exception(e) if coors['type'] != 'LineString': raise Exception( "El GeoJSON introducido no corresponde con una línea") else: coor = coors['coordinates'] puntos = [] for i in coor: puntos.append(Punto2D(i[0], i[1])) self.setPoliLineaFromPuntos(puntos)
def toPunto2D(self): '''! @brief: Método que devuelve un objeto de la clase Punto2D, equivalente al Punto3D de la clase. @return Punto2D: Punto2D equivalente ''' return Punto2D(self.getX(), self.getY(), negativos=self.getNegativos())
def __init__(self, *args, **kwargs): '''! Constructor de la clase Punto2D. *args: La clase admite en el constructor dos o tres argumentos.\n Dos argumentos:\n args1: Punto Punto2D: Punto2D con el valor de las coordenadas X e Y. args2: Z float|int|str: Valor de la coordenada Z.\n Tres argumentos:\n args1 X float: Valor de la coordenada X.\n args2 Y float: Valor de la coordenada Y.\n args3 Z float: Valor de la coordenada Z.\n Parametros de tipo kwargs(para todos los constructores):\n kwargs negativos bool: Estado de la propiedad negativos. @exception: Se producira una excepción si se introducen más o menos argumentos de los admitidos por la clase. @exception: Se producira una excepción si no se reconoce el kwarg introducido. ''' Negativos = None if len(kwargs) > 0: for key in kwargs: if key.lower() == 'negativos': aux = kwargs[key] self.setNegativos(aux) else: raise Exception("El argumento: " + key + " no se reconoce") if len(args) == 2: #Punto2D,Z if isinstance(args[0], Punto2D): CoordenadaX = args[0].getX() CoordenadaY = args[0].getY() CoordenadaZ = args[1] if Negativos == None: Negativos = args[0].getNegativos() self.setNegativos(Negativos) # Inicializar la clase padre. Punto2D.__init__(self, CoordenadaX, CoordenadaY, negativos=Negativos) self.setZ(CoordenadaZ) else: raise Exception( "Se esperaba un objeto de la clase Punto2D como primer argumento del constructor" ) elif len(args) == 3: CoordenadaX = args[0] CoordenadaY = args[1] CoordenadaZ = args[2] if Negativos == None: Negativos = True # Valor por defecto. self.setNegativos(Negativos) # Inicializar la clase padre. Punto2D.__init__(self, CoordenadaX, CoordenadaY, negativos=Negativos) self.setZ(CoordenadaZ) elif len(args) == 0: Punto2D.__init__(self) #Constructor vacio. pass else: raise Exception( "La clase Punto3D recibe 2 o 3 parametros como argumentos.\nSe han introducido: " + str(len(args)) + " parametros.")
def toGeoJSON(self): '''! ''' val=Punto2D.toGeoJSON(self).split('\n') val[2]='"coordinates":'+'['+str(self.getX())+','+str(self.getY())+','+str(self.__Z)+']' return '\n'.join(val)
def getNegativos(self): '''! @brief: Método que devuelve el valor actual de la propiedad negativos. @return bool: Estado de la propiedad Negativos. ''' return Punto2D.getNegativos(self)