from geopy import distance
from shapely import wkt
from shapely.geometry import MultiPoint
def multipoint_bound_distance(multi_point: MultiPoint):
bounds = multi_point.bounds
dist = distance.geodesic((float(bounds[1]), float(bounds[0]), 0),
(float(bounds[3]), float(bounds[2]), 0)).meters
return dist
def points_mean_shift_centroid(multi_point: MultiPoint, min_point_num: int, min_dist: float) -> MultiPoint:
points_len = len(multi_point)
dist = multipoint_bound_distance(multi_point)
if points_len > min_point_num and dist > min_dist:
points = list(multi_point)
if points_len < 50:
iter_num, iter_step = 10, 1
elif points_len < 100:
iter_num, iter_step = 20, 2
else:
iter_num, iter_step = 50, 5
while len(points) > min_point_num and dist > min_dist and iter_num > 0:
centroid = MultiPoint(points).centroid
dists = map(lambda p: centroid.distance(p), points)
zip_dists = list(zip(dists, points))
zip_dists_sorted = sorted(zip_dists, key=lambda x: x[0])
points = [i[1] for i in zip_dists_sorted[:-iter_step]]
iter_num -= iter_step
bounds = MultiPoint(points).bounds
dist = distance.geodesic((float(bounds[1]), float(bounds[0]), 0),
(float(bounds[3]), float(bounds[2]), 0)).meters
if len(points) > 0:
return MultiPoint(points)
else:
return multi_point
else:
return multi_point
def points_mean_shift_envelop(multi_point: MultiPoint, min_point_num: int, min_dist: float) -> MultiPoint:
points_len = len(multi_point)
dist = multipoint_bound_distance(multi_point)
if points_len > min_point_num and dist > min_dist:
points = list(multi_point)
if points_len < 50:
iter_num, iter_step = 10, 1
elif points_len < 100:
iter_num, iter_step = 20, 2
else:
iter_num, iter_step = 50, 5
while len(points) > min_point_num and dist > min_dist and iter_num > 0:
linestring = MultiPoint(points).envelope.boundary
points = list(filter(lambda p: not linestring.intersects(p), points))
iter_num -= iter_step
bounds = MultiPoint(points).bounds
dist = distance.geodesic((float(bounds[1]), float(bounds[0]), 0),
(float(bounds[3]), float(bounds[2]), 0)).meters
if len(points) > 0:
return MultiPoint(points)
else:
return multi_point
else:
return multi_point
if __name__ == '__main__':
mp = wkt.loads(
'MultiPoint ((121.27113204270939661 31.2555466953818808),(121.27185691198660322 31.25766057661304842),(121.27438739823689673 31.25504125113677034),(121.27224584271759511 31.25504952140218862),(121.27721697210799334 31.25616275660227927),(121.27464841693159769 31.25658314547172978),(121.2721028683162956 31.25496954397139859),(121.27109204990709657 31.25568170139715107),(121.27397553548479436 31.25508525238232949),(121.27110904684890613 31.25563769881161846),(121.27414950485720624 31.25496822579910017),(121.27417849973940633 31.2550242212051792),(121.27390554784220456 31.25501526334603142),(121.2746724127389939 31.25651414194033961),(121.27395753868799488 31.25491125554535898),(121.27495736303910689 31.25546810057063851),(121.27152091403100087 31.25773322461613901),(121.27454283388119904 31.25663755932740884),(121.27482246207139838 31.25645731544068084),(121.27471440536609748 31.25659313532198169),(121.27457039698920482 31.25517337812145868),(121.27252722392590556 31.2550033518056587),(121.27259178091340175 31.25513346713568907),(121.27135400271369292 31.25550866046265952),(121.27399853143360531 31.25509224881687942),(121.27256878502750226 31.25501847097919139),(121.27149212251279664 31.25768703843889895),(121.27684780910900031 31.25706865110796073),(121.27604617350249328 31.25636293268932064),(121.2751303325684944 31.25696907078593156),(121.27313368448319864 31.25499238301998872),(121.27343439356289423 31.25524331969103997),(121.27496736137810274 31.25495310017684147),(121.27613015900050186 31.25626792017148858),(121.27695901626910313 31.25624279514801884),(121.27538328846050319 31.25700203208375072),(121.27476439657959872 31.25675512729366901),(121.27144498631599845 31.25564064584013835),(121.27367658795830607 31.25700229436273148),(121.27472340378359661 31.25662813386315975),(121.27463541921819967 31.25654114756018132),(121.2730387010506945 31.25689639358902028),(121.27518232353409644 31.25675606331081013),(121.27297971183540426 31.25503940686814985),(121.27375857378289936 31.25507628593146947),(121.27224484260989357 31.25687451753280044),(121.27150797465249354 31.25777363121709129),(121.27432347422490011 31.25510219870130868),(121.27618638791619787 31.255873634024681),(121.27446045014470144 31.25516117749543099),(121.27184191467109997 31.25766057896749928),(121.27433747176519319 31.25508319658856848),(121.28140027142329416 31.26198912998221857),(121.27642710758810551 31.25705187350911984),(121.27626313574360495 31.25782089659422169),(121.27401852791909675 31.25503024586728884),(121.27708899280500532 31.26280776099723013),(121.27142399006990559 31.25575664889181837),(121.33955594221650642 31.31297709989613054),(121.27487893293850618 31.2551177609493287),(121.27102406215119856 31.25588571168416863),(121.27378156947580123 31.25656027909684909),(121.27290472517499609 31.25501541859595989),(121.27453843619609586 31.25670916208605021),(121.27728296099050453 31.25525074873186071),(121.27508933974519323 31.25684207733469933),(121.27632312567959616 31.2562038911061606),(121.27604643227789438 31.25640194561928098),(121.27338002586259336 31.25504021778098007),(121.27151997250270199 31.25770662947671141),(121.27165894751320252 31.25776660748151059),(121.27976554117850583 31.26044736989378947),(121.27193489839409324 31.25504757013809964),(121.27468741007909614 31.25671613919227099),(121.27529131151599984 31.25505061770367021),(121.27492136913569709 31.25665110346580988),(121.27383874184050683 31.25508222811447112),(121.27622514248369612 31.25681090458459011),(121.27135300290790099 31.25540766084280975),(121.27492336875729961 31.25678510286229894),(121.27417749965420057 31.25660021787816945),(121.27734395037269621 31.25632173722386042),(121.27408251664409988 31.25504423596251868),(121.2749693610117987 31.25504909965939149),(121.27146298276329617 31.25766163854695989),(121.27468100583379851 31.25648060294671993),(121.27299670850730706 31.25696339997524831),(121.27163131574960175 31.25774851644040098),(121.271674944681493 31.25749560556526063),(121.27445129207150387 31.25656654836581083),(121.27388555111170376 31.25662826287286933),(121.27156496441159561 31.25776062227737029),(121.27099106815849439 31.25554871763736031),(121.27200688552389352 31.254876559222879),(121.27099806676160654 31.25640071465457126),(121.27455690884619344 31.25639707236349096),(121.27179992237400086 31.25657658795697103),(121.27464441759450153 31.25679414561892955),(121.27454143593739389 31.25515716505520913),(121.27558125402200062 31.25701300188906018),(121.27457950510189733 31.25657363400778976),(121.27474440011209822 31.25661013068221905),(121.27335664491130274 31.25506334823234056),(121.27266576774449902 31.25497045594702072),(121.27617115178199469 31.25699191235800001),(121.27386255542420201 31.25506426988089004),(121.27464341805050196 31.25513614943746887),(121.2724408079095042 31.25479049147535093),(121.27107805228320103 31.25666270144500913),(121.274557433128507 31.25515816259513002),(121.274652416468399 31.25516614799004955),(121.27429347950649685 31.25505220342957102),(121.27442380249370046 31.25494031634255876),(121.27454243577709292 31.25504016516059025),(121.27615115524889688 31.25695991545723018),(121.27732495334019802 31.25785673666073095),(121.27485038180509491 31.25516111763570848),(121.27487621556349495 31.25514212391902902),(121.27473340810109903 31.25506520267445865),(121.27325266334419496 31.25508036433807035),(121.2730866927867055 31.25526838971802945),(121.27152722735600321 31.25777499447335117),(121.27126103143220348 31.25546788978225976),(121.27402152737690244 31.25508524528267884),(121.27566723908779522 31.25696098891789987),(121.27191190253830655 31.25493157400169864),(121.27146398290929596 31.2555506430476413),(121.27281774066109676 31.25499043220372997),(121.27148997790860108 31.25766763428385175),(121.27616415306829367 31.25653791442449858),(121.27489437385919757 31.25661310768470003),(121.27603717519629356 31.25558893576766906),(121.27686603221749806 31.25629580901367177),(121.2747743951611028 31.25479713008857985),(121.27146598250070042 31.2558646420410291),(121.2722598402109071 31.25502751925904832),(121.2756812369724031 31.25519699069203838),(121.2747655914910041 31.25668792850830968),(121.28013316540109656 31.25720338631229112),(121.27491590184969539 31.25514886292139138),(121.27153796927520091 31.25768962668220041),(121.27592119503650281 31.25698395027297138),(121.27501335304660302 31.25668608930584824),(121.27474839940499862 31.25663213001999097),(121.27446844850790342 31.25658517311876849),(121.27689302743540622 31.25710380315997838),(121.27570743451900626 31.25693055826625155),(121.27607216902630682 31.25625292899266938),(121.27206687444780187 31.25700954511347973),(121.27416351760689395 31.25510994933338083),(121.27151197392950621 31.25778663055838891),(121.27114803978619761 31.25581869225811005),(121.27471240598900692 31.25496513922729847),(121.27453143769569976 31.2551381666338095),(121.27403952419609823 31.25517424230890029),(121.27466991829540177 31.25491464117082074),(121.2735496107368931 31.25502031840468931),(121.27562781015879523 31.25698430559950936),(121.27461742260450706 31.25515315339134048),(121.27408851558010383 31.25507523496856166),(121.2749303675601027 31.25665310208265879),(121.2742184923865949 31.25691221086945859),(121.27626113652739548 31.2553489023756903),(121.27461742264239319 31.25497615378235849),(121.27547227330730095 31.25507802277308045),(121.27564524289699932 31.25703699209567077),(121.27312968519190406 31.25502138357744997),(121.27389654943179664 31.25499126478961998),(121.27112204449539945 31.25568769664963042),(121.27581421366099335 31.25652996752556945),(121.27605217257530512 31.25576093311297043),(121.27259064287770229 31.25494310321134961),(121.27496236221070092 31.25520510038595035),(121.27466041482790615 31.25657814364090825),(121.27107398102630498 31.25585853471272912),(121.27496536168169428 31.2552030999315491),(121.27421149391639688 31.25510521594188162),(121.27387955241509587 31.25512726711566103),(121.27616015397609317 31.2553459176685493),(121.2741555037718939 31.25515122447047034),(121.27348195666540676 31.25498930679266962),(121.27295671593610393 31.25496641060849967),(121.27698601019500302 31.26425677321736885),(121.27146098347110126 31.25538964387454044),(121.27604117436490583 31.25639893336760977),(121.28216714869149939 31.25310604042739016),(121.27317296175610295 31.25693512198892066),(121.27609616487509925 31.25627792530069016))')
shift = points_mean_shift_centroid(mp, 4, 200)
print(shift)
shift = points_mean_shift_envelop(mp, 4, 200)
print(shift.wkt)
from copy import deepcopy
from geopy import distance
from shapely import wkt
from shapely.geometry import MultiPoint, Point
def multipoint_bound_distance(multi_point: MultiPoint):
bounds = multi_point.bounds
return distance.geodesic((float(bounds[1]), float(bounds[0]), 0),
(float(bounds[3]), float(bounds[2]), 0)).meters
def get_iter_step(points_len: int):
if points_len < 30:
iter_num, iter_remove_num = 5, 2
elif points_len < 50:
iter_num, iter_remove_num = 10, 2
elif points_len < 100:
iter_num, iter_remove_num = 10, 4
elif points_len < 120:
iter_num, iter_remove_num = 10, 6
elif points_len < 150:
iter_num, iter_remove_num = 10, 8
else:
iter_num, iter_remove_num = 10, 10
return iter_num, iter_remove_num
def points_centroid_sort(multi_point: MultiPoint):
centroid = multi_point.centroid
dist_point_list = map(lambda p: (centroid.distance(p), p), list(multi_point))
return sorted(dist_point_list, key=lambda x: x[0])
def points_mean_shift_centroid(multi_point: MultiPoint, min_point_num: int, min_dist: float) -> MultiPoint:
points_len = len(multi_point)
dist = multipoint_bound_distance(multi_point)
if points_len > min_point_num and dist > min_dist:
points = list(multi_point)
iter_num, iter_remove_num = get_iter_step(points_len)
while len(points) > min_point_num and dist > min_dist and iter_num > 0:
points_centroid_sorted = points_centroid_sort(MultiPoint(points))
points = [i[1] for i in points_centroid_sorted[:-iter_remove_num]]
dist = multipoint_bound_distance(MultiPoint(points))
iter_num -= 1
if len(points) > 0:
return MultiPoint(points)
return multi_point
if __name__ == '__main__':
mp = wkt.loads(
'MultiPoint ((121.27113204270939661 31.2555466953818808),(121.27185691198660322 31.25766057661304842),(121.27438739823689673 31.25504125113677034),(121.27224584271759511 31.25504952140218862),(121.27721697210799334 31.25616275660227927),(121.27464841693159769 31.25658314547172978),(121.2721028683162956 31.25496954397139859),(121.27109204990709657 31.25568170139715107),(121.27397553548479436 31.25508525238232949),(121.27110904684890613 31.25563769881161846),(121.27414950485720624 31.25496822579910017),(121.27417849973940633 31.2550242212051792),(121.27390554784220456 31.25501526334603142),(121.2746724127389939 31.25651414194033961),(121.27395753868799488 31.25491125554535898),(121.27495736303910689 31.25546810057063851),(121.27152091403100087 31.25773322461613901),(121.27454283388119904 31.25663755932740884),(121.27482246207139838 31.25645731544068084),(121.27471440536609748 31.25659313532198169),(121.27457039698920482 31.25517337812145868),(121.27252722392590556 31.2550033518056587),(121.27259178091340175 31.25513346713568907),(121.27135400271369292 31.25550866046265952),(121.27399853143360531 31.25509224881687942),(121.27256878502750226 31.25501847097919139),(121.27149212251279664 31.25768703843889895),(121.27684780910900031 31.25706865110796073),(121.27604617350249328 31.25636293268932064),(121.2751303325684944 31.25696907078593156),(121.27313368448319864 31.25499238301998872),(121.27343439356289423 31.25524331969103997),(121.27496736137810274 31.25495310017684147),(121.27613015900050186 31.25626792017148858),(121.27695901626910313 31.25624279514801884),(121.27538328846050319 31.25700203208375072),(121.27476439657959872 31.25675512729366901),(121.27144498631599845 31.25564064584013835),(121.27367658795830607 31.25700229436273148),(121.27472340378359661 31.25662813386315975),(121.27463541921819967 31.25654114756018132),(121.2730387010506945 31.25689639358902028),(121.27518232353409644 31.25675606331081013),(121.27297971183540426 31.25503940686814985),(121.27375857378289936 31.25507628593146947),(121.27224484260989357 31.25687451753280044),(121.27150797465249354 31.25777363121709129),(121.27432347422490011 31.25510219870130868),(121.27618638791619787 31.255873634024681),(121.27446045014470144 31.25516117749543099),(121.27184191467109997 31.25766057896749928),(121.27433747176519319 31.25508319658856848),(121.28140027142329416 31.26198912998221857),(121.27642710758810551 31.25705187350911984),(121.27626313574360495 31.25782089659422169),(121.27401852791909675 31.25503024586728884),(121.27708899280500532 31.26280776099723013),(121.27142399006990559 31.25575664889181837),(121.33955594221650642 31.31297709989613054),(121.27487893293850618 31.2551177609493287),(121.27102406215119856 31.25588571168416863),(121.27378156947580123 31.25656027909684909),(121.27290472517499609 31.25501541859595989),(121.27453843619609586 31.25670916208605021),(121.27728296099050453 31.25525074873186071),(121.27508933974519323 31.25684207733469933),(121.27632312567959616 31.2562038911061606),(121.27604643227789438 31.25640194561928098),(121.27338002586259336 31.25504021778098007),(121.27151997250270199 31.25770662947671141),(121.27165894751320252 31.25776660748151059),(121.27976554117850583 31.26044736989378947),(121.27193489839409324 31.25504757013809964),(121.27468741007909614 31.25671613919227099),(121.27529131151599984 31.25505061770367021),(121.27492136913569709 31.25665110346580988),(121.27383874184050683 31.25508222811447112),(121.27622514248369612 31.25681090458459011),(121.27135300290790099 31.25540766084280975),(121.27492336875729961 31.25678510286229894),(121.27417749965420057 31.25660021787816945),(121.27734395037269621 31.25632173722386042),(121.27408251664409988 31.25504423596251868),(121.2749693610117987 31.25504909965939149),(121.27146298276329617 31.25766163854695989),(121.27468100583379851 31.25648060294671993),(121.27299670850730706 31.25696339997524831),(121.27163131574960175 31.25774851644040098),(121.271674944681493 31.25749560556526063),(121.27445129207150387 31.25656654836581083),(121.27388555111170376 31.25662826287286933),(121.27156496441159561 31.25776062227737029),(121.27099106815849439 31.25554871763736031),(121.27200688552389352 31.254876559222879),(121.27099806676160654 31.25640071465457126),(121.27455690884619344 31.25639707236349096),(121.27179992237400086 31.25657658795697103),(121.27464441759450153 31.25679414561892955),(121.27454143593739389 31.25515716505520913),(121.27558125402200062 31.25701300188906018),(121.27457950510189733 31.25657363400778976),(121.27474440011209822 31.25661013068221905),(121.27335664491130274 31.25506334823234056),(121.27266576774449902 31.25497045594702072),(121.27617115178199469 31.25699191235800001),(121.27386255542420201 31.25506426988089004),(121.27464341805050196 31.25513614943746887),(121.2724408079095042 31.25479049147535093),(121.27107805228320103 31.25666270144500913),(121.274557433128507 31.25515816259513002),(121.274652416468399 31.25516614799004955),(121.27429347950649685 31.25505220342957102),(121.27442380249370046 31.25494031634255876),(121.27454243577709292 31.25504016516059025),(121.27615115524889688 31.25695991545723018),(121.27732495334019802 31.25785673666073095),(121.27485038180509491 31.25516111763570848),(121.27487621556349495 31.25514212391902902),(121.27473340810109903 31.25506520267445865),(121.27325266334419496 31.25508036433807035),(121.2730866927867055 31.25526838971802945),(121.27152722735600321 31.25777499447335117),(121.27126103143220348 31.25546788978225976),(121.27402152737690244 31.25508524528267884),(121.27566723908779522 31.25696098891789987),(121.27191190253830655 31.25493157400169864),(121.27146398290929596 31.2555506430476413),(121.27281774066109676 31.25499043220372997),(121.27148997790860108 31.25766763428385175),(121.27616415306829367 31.25653791442449858),(121.27489437385919757 31.25661310768470003),(121.27603717519629356 31.25558893576766906),(121.27686603221749806 31.25629580901367177),(121.2747743951611028 31.25479713008857985),(121.27146598250070042 31.2558646420410291),(121.2722598402109071 31.25502751925904832),(121.2756812369724031 31.25519699069203838),(121.2747655914910041 31.25668792850830968),(121.28013316540109656 31.25720338631229112),(121.27491590184969539 31.25514886292139138),(121.27153796927520091 31.25768962668220041),(121.27592119503650281 31.25698395027297138),(121.27501335304660302 31.25668608930584824),(121.27474839940499862 31.25663213001999097),(121.27446844850790342 31.25658517311876849),(121.27689302743540622 31.25710380315997838),(121.27570743451900626 31.25693055826625155),(121.27607216902630682 31.25625292899266938),(121.27206687444780187 31.25700954511347973),(121.27416351760689395 31.25510994933338083),(121.27151197392950621 31.25778663055838891),(121.27114803978619761 31.25581869225811005),(121.27471240598900692 31.25496513922729847),(121.27453143769569976 31.2551381666338095),(121.27403952419609823 31.25517424230890029),(121.27466991829540177 31.25491464117082074),(121.2735496107368931 31.25502031840468931),(121.27562781015879523 31.25698430559950936),(121.27461742260450706 31.25515315339134048),(121.27408851558010383 31.25507523496856166),(121.2749303675601027 31.25665310208265879),(121.2742184923865949 31.25691221086945859),(121.27626113652739548 31.2553489023756903),(121.27461742264239319 31.25497615378235849),(121.27547227330730095 31.25507802277308045),(121.27564524289699932 31.25703699209567077),(121.27312968519190406 31.25502138357744997),(121.27389654943179664 31.25499126478961998),(121.27112204449539945 31.25568769664963042),(121.27581421366099335 31.25652996752556945),(121.27605217257530512 31.25576093311297043),(121.27259064287770229 31.25494310321134961),(121.27496236221070092 31.25520510038595035),(121.27466041482790615 31.25657814364090825),(121.27107398102630498 31.25585853471272912),(121.27496536168169428 31.2552030999315491),(121.27421149391639688 31.25510521594188162),(121.27387955241509587 31.25512726711566103),(121.27616015397609317 31.2553459176685493),(121.2741555037718939 31.25515122447047034),(121.27348195666540676 31.25498930679266962),(121.27295671593610393 31.25496641060849967),(121.27698601019500302 31.26425677321736885),(121.27146098347110126 31.25538964387454044),(121.27604117436490583 31.25639893336760977),(121.28216714869149939 31.25310604042739016),(121.27317296175610295 31.25693512198892066),(121.27609616487509925 31.25627792530069016))')
shift = points_mean_shift_centroid(mp, 20, 200)
print(shift)
网友评论