Point in polygon

85 views
Skip to first unread message

Sebastián

unread,
Jun 7, 2011, 11:45:23 PM6/7/11
to Geospatial Python
hi, i'm new in python and i want to know if a point is inside a
polygon.
so i found this script

def point_in_poly(x,y,poly):

n = len(poly)
inside =False
counter = 0

p1x,p1y = poly[0]
for i in range(n+1):
p2x,p2y = poly[i % n]
if y > min(p1y,p2y):
if y <= max(p1y,p2y):
if x <= max(p1x,p2x):
if p1y != p2y:
xinters = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
if p1x == p2x or x <= xinters:
inside = not inside
counter = counter + 1
p1x,p1y = p2x,p2y

#return inside
if (counter % 2 == 0):
return "OUT"
else:
return "IN"

i have an example
poligono = [(-33.416032,-70.593016), (-33.415370,-70.589604),
(-33.417340,-70.589046), (-33.417949,-70.592351),
(-33.416032,-70.593016)]
lat= -33.416032
lon= -70.593016
print point_in_poly(lat,lon,poligono) # lat, lon
print point_in_poly(lon,lat,poligono) #lon, lat

in both cases it prints OUT, but is a vertex that point, so i don't
know why is not working.

i found a php script and it works very good, but i don't know how to
convert it to python

<?php
class pointLocation {
var $pointOnVertex = true; // Check if the point sits exactly on
one of the vertices

function pointLocation() {
}

function pointInPolygon($point, $polygon, $pointOnVertex = true) {
$this->pointOnVertex = $pointOnVertex;

// Transform string coordinates into arrays with x and y values
$point = $this->pointStringToCoordinates($point);
$vertices = array();
foreach ($polygon as $vertex) {
$vertices[] = $this->pointStringToCoordinates($vertex);
}

// Check if the point sits exactly on a vertex
if ($this->pointOnVertex == true and $this->pointOnVertex($point,
$vertices) == true) {
return "v&eacute;rtice";
}

// Check if the point is inside the polygon or on the boundary
$intersections = 0;
$vertices_count = count($vertices);

for ($i=1; $i < $vertices_count; $i++) {
$vertex1 = $vertices[$i-1];
$vertex2 = $vertices[$i];
if ($vertex1['y'] == $vertex2['y'] and $vertex1['y'] == $point['y']
and $point['x'] > min($vertex1['x'], $vertex2['x']) and $point['x'] <
max($vertex1['x'], $vertex2['x'])) { // Check if point is on an
horizontal polygon boundary
return "l&iacute;mite";
}
if ($point['y'] > min($vertex1['y'], $vertex2['y']) and $point['y']
<= max($vertex1['y'], $vertex2['y']) and $point['x'] <=
max($vertex1['x'], $vertex2['x']) and $vertex1['y'] != $vertex2['y'])
{
$xinters = ($point['y'] - $vertex1['y']) * ($vertex2['x'] -
$vertex1['x']) / ($vertex2['y'] - $vertex1['y']) + $vertex1['x'];
if ($xinters == $point['x']) { // Check if point is on the polygon
boundary (other than horizontal)
return "l&iacute;mite";
}
if ($vertex1['x'] == $vertex2['x'] || $point['x'] <= $xinters) {
$intersections++;
}
}
}
// If the number of edges we passed through is even, then it's in
the polygon.
if ($intersections % 2 != 0) {
return "adentro";
} else {
return "afuera";
}
}

function pointOnVertex($point, $vertices) {
foreach($vertices as $vertex) {
if ($point == $vertex) {
return true;
}
}
}

function pointStringToCoordinates($pointString) {
$coordinates = explode(",", $pointString);
return array("x" => $coordinates[0], "y" => $coordinates[1]);
}
}

/*** Example ***/
$pointLocation = new pointLocation();
$points = array("-33.415370,-70.589604", "-33.41496,-70.59205",
"-33.41647,-70.59169", "-33.41500,-70.58443");
$polygon = array("-33.416032,-70.593016", "-33.415370,-70.589604",
"-33.417340,-70.589046", "-33.417949,-70.592351",
"-33.416032,-70.593016");
foreach($points as $key => $point) {
echo "$key ($point) est&aacute; <b>" . $pointLocation-
>pointInPolygon($point, $polygon)."</b><br>";
}
?>
Reply all
Reply to author
Forward
0 new messages