Dear Sean,

thanks.
i fear i wont get much faster than this:

from shapely.prepared import prep
from shapely.geometry import Point
from shapely.geometry import Polygon
from shapely.geometry import MultiPoint
poly=Polygon(zip([0.0,0.3,0.3,0.2,0.0],[0.2,0.2,0.4,0.5,0.4]))
points = MultiPoint(zip(np.random.rand(100000),np.random.rand(100000)))

poly_prep = prep(poly)
points_prep = prep(points)

hits = map(poly_prep.contains, points)
#from timeit import Timer
#t = Timer(lambda: map(poly_prep.contains, points))
#print t.timeit(number=1)

#t = Timer(lambda: points.intersection(poly))
#print t.timeit(number=1)

…which is about a second on my machine.
i will look for some other approaches instead.

thanks a million for your reply,
cheers.


2014/1/8 Sean Gillies <sean.gill...@gmail.com>

> Hi Conrad,
>
> The key thing to understand about Shapely's operations (intersection,
> union, etc) is that they involve sets of points in space and not sets of
> Python objects. A.intersection(B) returns a Python object that represents
> all the points in the intersection of A's points and B's points.
>
> If you want just a point-in-polygon test and to track your points
> precisely, you could do something like this:
>
>     from shapely.prepared import prep
>
>     poly = prep(poly)
>
>     for xy in a:
>         if poly.intersects(Point(xy)):
>             # plot it
>
> Yours,
>
>
> On Wed, Jan 8, 2014 at 2:29 AM, Conrad Jackisch <coja...@gmail.com> wrote:
>
>> dear community,
>>
>> i am struggling with a intersection of a large number of points with a
>> polygon. i use shapely which helps already but returns only the coordinates
>> of intersecting points of a MultiPoint object. is there anyone who could
>> help with a way to simply get the indexes of intersecting points?
>>
>> - - - 8< snip - - -
>>
>> import numpy as np
>> import matplotlib.pyplot as plt
>> from shapely.geometry import Polygon
>> from shapely.geometry import asMultiPoint
>>
>> poly=Polygon(zip([0.0,0.3,0.3,0.2,0.0],[0.2,0.2,0.4,0.5,0.4]))
>> a = array([[0.1,0.1],[0.2,0.3],[0.15,0.45]])
>> points = asMultiPoint(a)
>>
>> #plot example
>> ax = plt.figure(figsize=(8, 4))
>> ax = plt.subplot(121)
>>
>> patch = PolygonPatch(poly)
>> ax.add_patch(patch)
>> for p in points:
>>     ax.plot(p.x, p.y, 'o', color='#999999')
>>
>> pyplot.show()
>>
>> #intersection
>> np.asarray(points.intersection(poly))
>> #this gives me the coordinates of the values - but not the index, which i
>> need much more.
>>
>> - - - snap >8 - - -
>>
>> of cause this example is very small and it was possible to compare the
>> results with the given points. however, for large sets (about one million
>> of points) this will slow down everything...
>>
>> if you have any idea, i was most happy.
>> thanks,
>> conrad
>>
>> _______________________________________________
>> Community mailing list
>> Community@lists.gispython.org
>> http://lists.gispython.org/mailman/listinfo/community
>>
>>
>
>
> --
> Sean Gillies
>
> _______________________________________________
> Community mailing list
> Community@lists.gispython.org
> http://lists.gispython.org/mailman/listinfo/community
>
>
_______________________________________________
Community mailing list
Community@lists.gispython.org
http://lists.gispython.org/mailman/listinfo/community

Reply via email to