def pointLineDistance(point, line): point_x = point[0] point_y = point[1] line_s_x = line[0][0] line_s_y = line[0][1] line_e_x = line[1][0] line_e_y = line[1][1] if line_e_x - line_s_x == 0: return abs(point_x - line_s_x),[line_s_x-point_x,0] if line_e_y - line_s_y == 0: return abs(point_y - line_s_y),[0,line_s_y-point_y] k = (line_e_y - line_s_y) / (line_e_x - line_s_x) extend_line=[[point_x-1000,point_y-1000*(-1/k)],[point_x+1000,point_y+1000*(-1/k)]] inter=LineString(line).intersection(LineString(extend_line)) if inter.is_empty==True: dis1=math.pow((point_x-line_s_x)*(point_x-line_s_x)+(point_y-line_s_y)*(point_y-line_s_y), 0.5) dis2=math.pow((point_x-line_e_x)*(point_x-line_e_x)+(point_y-line_e_y)*(point_y-line_e_y), 0.5) if dis1>dis2: return dis2,[line_e_x-point_x,line_e_y-point_y] else: return dis1,[line_s_x-point_x,line_s_y-point_y] else: pt=GeoFunc.getPt(inter) dis=math.pow((point_x-pt[0])*(point_x-pt[0])+(point_y-pt[1])*(point_y-pt[1]), 0.5) return dis,[pt[0]-point[0],pt[1]-point[1]]
def getDirectNFP(self,poly1,poly2,**kw): if 'index' in kw: i=kw['index'][0] j=kw['index'][1] centroid=GeoFunc.getPt(Polygon(self.polys[i]).centroid) else: # 首先获得poly1和poly2的ID i=self.getPolyIndex(poly1) j=self.getPolyIndex(poly2) centroid=GeoFunc.getPt(Polygon(poly1).centroid) # 判断是否计算过并计算nfp if self.nfp_list[i][j]==0: nfp=NFP(poly1,poly2).nfp #self.nfp_list[i][j]=GeoFunc.getSlide(nfp,-centroid[0],-centroid[1]) if self.store_nfp==True: with open("record/nfp.csv","a+") as csvfile: writer = csv.writer(csvfile) writer.writerows([[poly1,poly2,nfp]]) return nfp else: return GeoFunc.getSlide(self.nfp_list[i][j],centroid[0],centroid[1])
def __init__(self,polys,**kw): self.polys=PolyListProcessor.deleteRedundancy(copy.deepcopy(polys)) self.area_list,self.first_vec_list,self.centroid_list=[],[],[] # 作为参考 for poly in self.polys: P=Polygon(poly) self.centroid_list.append(GeoFunc.getPt(P.centroid)) self.area_list.append(int(P.area)) self.first_vec_list.append([poly[1][0]-poly[0][0],poly[1][1]-poly[0][1]]) self.nfp_list=[[0]*len(self.polys) for i in range(len(self.polys))] self.load_history=False self.history_path=None self.history=None if 'history_path' in kw: self.history_path=kw['history_path'] if 'load_history' in kw: if kw['load_history']==True: # 从内存中加载history 直接传递pandas的df对象 缩短I/O时间 if 'history' in kw: self.history=kw['history'] self.load_history=True self.loadHistory() self.store_nfp=False if 'store_nfp' in kw: if kw['store_nfp']==True: self.store_nfp=True self.store_path=None if 'store_path' in kw: self.store_path=kw['store_path'] if 'get_all_nfp' in kw: if kw['get_all_nfp']==True and self.load_history==False: self.getAllNFP() if 'fast' in kw: # 为BLF进行多进程优化 if kw['fast']==True: self.res=[[0]*len(self.polys) for i in range(len(self.polys))] #pool=Pool() for i in range(1,len(self.polys)): for j in range(0,i): # 计算nfp(j,i) #self.res[j][i]=pool.apply_async(getNFP,args=(self.polys[j],self.polys[i])) self.nfp_list[j][i]=GeoFunc.getSlide(getNFP(self.polys[j],self.polys[i]),-self.centroid_list[j][0],-self.centroid_list[j][1])
def getCentroid(poly): return GeoFunc.getPt(Polygon(poly).centroid)