Sebastián
unread,Jun 7, 2011, 11:45:23 PM6/7/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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é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í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í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á <b>" . $pointLocation-
>pointInPolygon($point, $polygon)."</b><br>";
}
?>