Polygon-Containment-Test in matplotlib artist

Ich habe den folgenden Code, zunächst gesammelt ausHier., die matplotlib verwendet, formschön, cartopy, um eine Weltkarte zu zeichnen.

Wenn ein Klick gemacht wird, muss ich feststellen, in welchem Land er gemacht wurde. Ich kann eine hinzufügenpick_event Rückruf auf die Zeichenfläche wird jedoch bei jedem Künstler aufgerufen (cartopy.mpl.feature_artist.FeatureArtist, der einem Land entspricht).

Wie kann ich bei einem Künstler und einem Mausereignis mit XY-Koordinaten die Eindämmung bestimmen?

ich habe es versuchtartist.get_clip_box().contains, aber es ist nicht wirklich ein Polygon, sondern ein einfaches Rechteck.

Der Standard-Eindämmungstest für dieFeatureArists istNoneAlso musste ich meinen eigenen Eindämmungstest hinzufügen.

Wie kann ich im FeatureArtist korrekt überprüfen, ob der Mausereignispunkt enthalten ist?

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.io.shapereader as shpreader
import itertools, pdb, subprocess, time, traceback
from itertools import *
import numpy as np
from pydoc import help as h

shapename = 'admin_0_countries'
countries_shp = shpreader.natural_earth(resolution='110m',
                                        category='cultural', name=shapename)

earth_colors = np.array([(199, 233, 192),
                                (161, 217, 155),
                                (116, 196, 118),
                                (65, 171, 93),
                                (35, 139, 69),
                                ]) / 255.
earth_colors = itertools.cycle(earth_colors)

ax = plt.axes(projection=ccrs.PlateCarree())


def contains_test ( artist, ev ):
    print "contain test called"
    #this containmeint test is always true, because it is a large rectangle, not a polygon
    #how to define correct containment test
    print "click contained in %s?: %s" % (artist.countryname, artist.get_clip_box().contains(ev.x, ev.y))
    return True, {}

for country in shpreader.Reader(countries_shp).records():
    # print country.attributes['name_long'], earth_colors.next()
    art = ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                      facecolor=earth_colors.next(),
                      label=country.attributes['name_long'])

    art.countryname = country.attributes["name_long"] 
    art.set_picker(True)
    art.set_contains(contains_test)
    def pickit ( ev ):
        print "pickit called"
        print ev.artist.countryname



def onpick ( event ):
    print "pick event fired"

ax.figure.canvas.mpl_connect("pick_event", onpick)


def onclick(event):
    print 'button=%s, x=%s, y=%s, xdata=%s, ydata=%s'%(event.button, event.x, event.y, event.xdata, event.ydata)

ax.figure.canvas.mpl_connect('button_press_event', onclick)
plt.show()

Antworten auf die Frage(1)

Ihre Antwort auf die Frage