defCross (A, b):returnA[0] * b[1]-a[1] *B[0]defVectorminus (A, b):return((A[0]-b[0]) *1000, (A[1]-b[1]) *1000)defGetltdis (A, B): Lon1, LAT1, Lon2, Lat2= Map (radians, [a[0], a[1], b[0], b[1]]) Dlon= Lon2-Lon1 Dlat= Lat2-LAT1 a= sin (dlat/2) **2 + cos (LAT1) * cos (LAT2) * sin (DLON/2) **2C= 2 *Asin (SQRT (a)) R= 6371.393#print A, b returnc * R * 1000.0defTriangleare (A,B,C): x, y, z=Getltdis (A, B), Getltdis (B,c), Getltdis (c,a) C= (x + y + z)/2returnsqrt ((c) * (c-y) * (c-z) * (C-x))defGrahamscanarea (data): Data.sort (Key=Lambdax: (X[0],x[1]), reverse=False) ans= [0] * (len (data) * *) M=0 forIteminchData:top=len (item) while(M > 1 andCross (Vectorminus (ans[m-1], ans [m-2]), Vectorminus (item, ans [m-2])) <= 0): M = m-1Ans[m]=Item M= m + 1k=m Flag=True data.reverse () forIteminchData:ifFlag:flag=FalseContinue while(M > K andCross (Vectorminus (ans[m-1], ans [m-2]), Vectorminus (item, ans [m-2])) <= 0): M = m-1ans [m]=Item M= m + 1m= M-1b= [Ans[i] forIinchRange (0, m)]ifLen (b) < 3:return0#if Debug:print b returnArea (b)defArea (b): ans= 0.0 forIinchRange (len (b)):ifi = = 0ori + 1 >= len (b):Continuex, y= B[i], B[i + 1] ans+=Triangleare (B[0], x, y)returnAns
Python convex hull (latitude and longitude) + area [approximate]