PHP Get Shape Coordinates From Points - php

Im sure if the title is exactly what I am trying to describe so sorry if it isnt.
Ok here is what i am trying to do:
What i want to do is create a function that you can enter unlimited ammount of coordinates ( the blue dots) and then it will create a shape like so and then return all coordinates the shape covers. Because this is for working with pixels, there will be no decimal coordinates.
Something that can be used like so:
print_r(get_coords(12,6, 23,13, 30,9, 37,24, 24,34, 25,24, 7,30, 6,15));
// ^ Will output an array of all x and y coordinates that the shape covers
How would i go about doing something like this?

http://php.net/imagefilledpolygon

Related

How to create png from array of pixel color data in PHP?

Lets say I have an arrays of pixels. Basically an array of this data {x,y,r,g,b,a} for each pixel.
How would I go about converting all this data into an actual image file (png preferably)?
Could not find a solution. Any help would be very appreciated.
I had some time to code up a little example. You should be able to see and note that:
the red component increases towards the bottom of the image
the green component increases towards the right of the image
the blue component is absent
the alpha channel is random and between 0 (opaque) and 127 (fully transparent)
// Define width and height
$w=800;
$h=600;
// Create truecolour image so we can have infinitely many colours rather than a limited palette
$img=imagecreatetruecolor($w,$h);
imagesavealpha($img,true);
imagealphablending($img,false);
// Iterate over all pixels
for($y=0;$y<$h;$y++){
for($x=0;$x<$w;$x++){
$r = round(255*$y/$h);
$g = round(255*$x/$w);
$b = 0;
$alpha = rand(0,127);
$color = imagecolorallocatealpha($img,$r,$g,$b,$alpha);
imagesetpixel($img,$x,$y,$color);
}
}
// Save result
imagepng($img,"result.png");
I'll admit I haven't actually used this API, but looks like PHP has what you're looking for.
You create an image identifier with imagecreate or one of the related functions, then color in each pixel with imagesetpixel, using a color identifier created with imagecolorallocatealpha. From there you should be able to output as a PNG with imagepng.
It's worth noting that this image library seems to support drawing lines and shapes and other structures higher than the per-pixel level, so I'd also look into whether your code necessarily needs to build a big pixel array, rather than drawing the image some other way.

geoPHP point in polygon

i need some help, google makes me sad
I got polygon http://geojson.io/#id=gist:anonymous/069b8a955897723ca256&map=4/58.75/48.03
And it covering a lot.
And i got geoPHP library https://github.com/phayes/geoPHP
Which got methods contains, covers, coveredBy...
And everything is normal, except that point like 74.224074, 96.428248 is always false for methods contains,coveredBy,covers, etc for this polygon. But it must be true.
Please, tell me why. I got a headache.
OR
Tell me please, how check that the lat lng is inside polygon. I tested about 3 libraries in perl and php, making my own code, etc... But the right results i got only from google containsLocation in javascript. But i have to use it on server side, not in browser. If there any chance to use containsLocation in nodejs it would be very nice.
Thank you
A little code for geoPHP:
$a='JSON FROM LINK';
$b=geoPHP::load("POINT(74.224074 96.428248)","wkt");
$a=geoPHP::load($a, 'json');
$result=$a->contains($b);
var_dump($result);
And it will be false
EDIT:
I think i got it.
GeoJson making coordinates in wrong way, longtitude, latitude. But it must be latitude, longtitude.
Will try and then write here if it works
ANSWER:
Use this www.birdtheme.org/useful/v3tool.html to make polygon on maps. It making it in right way(latitude,longtitude)
Working code for geoPHP:
include_once('geoPHP.inc');
$addr=file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address='.urlencode($_GET['address']).'&sensor=false');
foreach($addr->{results} as $addr1)
{
if(array_key_exists("geometry",$addr1)){
$lat=$addr1->{geometry}->{location}->{lat};
$lng=$addr1->{geometry}->{location}->{lng};
break;
}
}
$point1 = geoPHP::load("POINT($lat $lng)","wkt");
$ya200=geoPHP::load("POLYGON((41.51 12.3, 38.27 28.83, 32.55 41.84, 27.6 55.55, 29.54 71.37, 33.43 83.32, 36.6 94.92, 36.6 99.49, 35.17 111.45, 32.55 124.8, 35.17 130.78, 39.64 142.73, 43.58 152.58, 45.83 166.29, 56.17 163.83, 63.07 159.26, 68.66 154.69, 72.18 148.71, 75.93 140.63, 78.49 129.02, 80.3 114.26, 80.98 100.2, 81.2 87.54, 80.87 73.83, 79.62 59.41, 76.27 40.43, 71.07 28.13, 67.2 23.2, 63.55 20.04, 59.01 17.23, 54.16 15.12, 48.46 13.36,41.51 12.3))","wkt");
var_dump($ya200->contains($point1));
I am the maintainer of the geoPHP library (https://geophp.net). You have your latitude and longitude mixed up. WKT specifies that x comes first, then y, and then (optionally) z. This makes sense, as we usually do things in XYZ order.
It's conventional in mathematics for the horizontal axis to be X, and the vertical axis to be Y. If we think of a globe overlaid on a piece of graphing paper with X and Y axes specified, we can see that longitude is the horizontal axis, which corresponds to X, and the latitude is the vertical axis, which corresponds to Y. Therefore reading it as "longitude, latitude" makes perfect sense.
Regrettably, this sensical approach is backwards from the way mariners and other cartographers have described coordinates on the globe it throughout history. Historically it has often been described as "latitude, longitude".
This clash of history vs mathematical-convention is why you see different conventions in different systems. In Google Maps API its "latitude, longitude", while in OpenLayers it's "longitude, latitude".
In this particular case, you are using WKT, which is specified in "longitude, latitude" order.
WKT format expects POINT(lon, lat), with lon being first. You mixed up the order. Corrected:
geoPHP::load("POINT($lon $lat)","wkt");
I have answered almost the same question but don't know how to make a repost of it, so I just repeat it here (sorry)
If you use this PHP library (https://github.com/xopbatgh/sb-polygon-pointer), it may do all you need
(but first you need to convert GEOjson coordinates to lat/lng)
Plan to do:
Insert the coordinates of your polygon into array
Ask the library is the any point with lat/lng inside this polygon
$polygonBox = [
[55.761515, 37.600375],
[55.759428, 37.651156],
[55.737112, 37.649566],
[55.737649, 37.597301],
];
$sbPolygonEngine = new sbPolygonEngine($polygonBox);
$isCrosses = $sbPolygonEngine->isCrossesWith(55.746768, 37.625605);
// $isCrosses is boolean
After hours of struggle, I could not get the contains method to work with geoPHP. It turns out, as pointed out from this SO response that the geos library needs to be installed manually (no composer), which I could not get working after sifting through documentation on archive.org.
As an alternative, I found the mjaschen/phpgeo to be simple to use to do polygon contains point calculations. Simply load in your lat lons to objects and call the contains method as outlined in the documentation:
$polygon = new Polygon();
$polygon->addPoint(new Coordinate(12.3, 41.51));
$polygon->addPoint(new Coordinate(28.83, 38.27));
$polygon->addPoint(new Coordinate(41.84, 32.55));
$point = new Coordinate(74.224074, 96.428248)
var_dump($polygon->contains($point))
All advanced methods in geoPHP requires that GEOS is installed. If You are not able to install it but still want to use intersects test for point and polygon, then I have forked geoPHP and added Polygon->pointInPolygon and MultiPolygon->pointInPolygon methods for that purpose. Take a look:
https://github.com/sookoll/geoPHP
$point = \geoPHP::load('POINT (x y)','wkt');
$polygon = \geoPHP::load('POLYGON ((x y...))','wkt');
$point_is_in_polygon = $polygon->pointInPolygon($point);

Translating degrees to SVG coordinates

I am looking for a function either PHP or jQuery to translate degrees into SVG equivalent coordinates, if any, to ease up the conversions.
E.g.:
90 degree = x1="0%" y1="0%" x2="100%" y2="0%"
180 = x1="0%" y1="0%" x2="0%" y2="100%"
etc.. this is the question. I am looking for a function that will handle any conversion of degree from 0 to 360 into SVG coordinates.
I am looking into http://keith-wood.name/svg.html, and several other pages so far, but no luck.
A simple "no" will be very helpful also, if you are sure there is no such function exists. At least I will have to cease searching for something that do not exists :)
Any hint or reference will be very much appreciated. Thanks.
UPDATE:
A homework reference: http://www.zahniser.net/~russell/computer/index.php?title=Angle%20and%20Coordinates
It is simple geometry. Have a look at the unit circle http://en.wikipedia.org/wiki/Unit_circle
First convert your degrees to radians with
radians = degrees * Pi / 180
x = cos(radians) // will give you the value of y fom -1 to 1
y = sin(radians) // will give you the value of x fom -1 to 1
it's available in all programming languages I know, just choose the syntax that fits yours.
I'm assuming you're working with the <line> element. You could use the transform attribute to rotate the <line> by a specified degree. This is much simpler than calculating the values by hand.

3d wave front object coordinate data from multidimensional arrays in php

Hi i made a simple script (algorithm) to parse a wavefront object file with php .i can extract the 3d coordinate of each vertex an assign them into an array i have array $y,$x,$z of each vertex.
my goal is to create a cube of vertex around the main coordinates, so i took the negative and the positive coordinates of each axis turn them into an absolute value an divided them by a distance of separation .
eg :
$separator = 02.0000 ;
$z_minus = -23.3344 ;
$z_plus = 13.3445 ;
$z_length = abs($z_minus) + abs($z_plus);
$number_of_vertex_z = $z_length/$separator;
the same process give me the $number_of_vertex for each axis .from that i can use a loop to create the x,y,z coordinates of new points to form a cube of points around my 3d shape .
my end goal will be to keep only the points that are within 02.0000 of the original 3d obj its a form of triangulation i will like to have some advice on how to do it efficiently.
it is important for me to form a cube first then extract the end points because i want the result object to be a subdivided version of the original made out of equal size rectangular faces similar to gcode for 3d printing but in my case my object will be made out of multiple little square faces.
thanks i hope my goal is clear enough.

Projecting only some part of SVG on Google Map

I have SVG files, which I'd like to:
export and use as custom ground overlay with flat Euclidean projection (econym.org.uk/gmap/example_custommapflat.htm).
take only polygons and project them on Google Map
My SVG files have some rules in common:
they all are 4096x4096px
main objects of the map are centered
I have done some experiments, one of which could be seen here -- http://dev.ondigital.eu/map/map.php* (remove map.php from the URL to see svg, png and other files). As you can see, the problem is, that polygons points are being projected on the left side instead of being centered + the aspect ratio is absolutely incorrect.
So the question is: How to calculate the aspect ratio, when:
svg's viewBox attribute is present
svg's viewBox attribute is not present and/or each polygon has to be transformed (like in our map.svg).
And what about the offset (object centration)?
Thank you in advance!
*Not tested with IE
Is it possible that you're confusing DivPixels with ContainerPixels?
Try changing
var latlng = self.projection.fromPixelToLatLng(
new GPoint(point[0], point[1]),
self.map.getZoom()
);
to
var latlng = self.map.fromContainerPixelToLatLng(
new GPoint(parseFloat(point[0]), parseFloat(point[1]))
);
In this case, the fact that you use Strings rather than Numbers probably isn't causing any problems, yet, but it's a good idea to use Numbers now, and avoid the possibility of the + operator doing String concatenation instead of addition on your coordinates later in your project.

Categories