coordinates are recorded well in the data table but when I transform them with st_as_sf they are not converted well - geospatial

data table plants_noFD coordinates
the resulting map with wrong coordinates
So, my problem is that the Northing coordinates are placed close to the equator (< 1°N in decimal degres) instead of being in Northern Europe. The coordinates in the data table are correct but when I use st_as_sf function the coordinates are wrongly converted. My coordinates should place points in Finland.
St_as_sf comes from sf package and this function converts foreign object into an sf object aka a spatial feature https://r-spatial.github.io/sf/
points_plants_sf = st_as_sf(plants_noFD, coords = c("EASTING_EPSG3067", "NORTHING_EPSG3067"), crs = 3067)
ggplot() + geom_sf(data = points_plants_sf)
instead of 65°N the northing coordinates are 0.0025°N

Related

transferring scalar values from an unstructured grid to a structured grid: not quite the results I was expecting

Here's some code, it is supposed to convert a mesh to an unstructured voxel grid, then 'append' a value to a structured grid. The unstructured grid falls within the bounds of the structured grid.
It all 'works' except the final output is not as expected, the voxelised mesh appears to be 'cut into quarters and rearrahged. so I suspect an issue with the assignment of the scalar value.
# Convert the mesh to voxels
voxels = pv.voxelize(mesh, density=resolution, check_surface=False)
num_points = voxels.GetNumberOfPoints()
val = context_values[idx]
scalars = np.full(num_points, val)
vtk_scalars = numpy_to_vtk(scalars, deep=True)
vtk_scalars.SetName('context_number') # Add name to the vtk_scalars object
voxels.GetPointData().AddArray(vtk_scalars)
# Create a cell locator for the grid
locator = pv._vtk.vtkCellLocator()
locator.SetDataSet(grid)
locator.BuildLocator()
I think the issue is in here
Voxels is the unstructured grid and Grid is the structured grid I'm trying to transfer the scalar values to.
I believe the locator.FindCell(voxels.points[i]) is finding the cell in the Grid and assigning the value from the voxel cell.
# Loop over center points of each cell in voxels
for i in range(voxels.points.shape[0]):
# Find the cell in grid that contains the center point
cell_id = locator.FindCell(voxels.points[i])
if cell_id >= 0:
# Set the scalar value of the cell in grid to the scalar value of the center point in voxels
grid.point_arrays["context"][cell_id] = voxels.point_arrays["context_number"][i]
Can you spot where I'm going wrong?
Here's the current output

How to find all points within some circles in PostGIS

I've been given a array of center points(longitude and latitude) and corresponding radius,
and try to find all points in these circles.
I known how to find points in the specified circle (the center is (CPLng, CPLat), and radius is 3000m), using the below sql
SELECT l.*, ST_Distance(workplace_geom, ref_geom) as distance
FROM locations AS l
CROSS JOIN (SELECT ST_MakePoint(CPLng, CPLat)::geography AS ref_geom) AS r
WHERE ST_DWithin(workplace_geom, ref_geom, 3000)
In order to get all point in series of circles, should I just union every set of points? or any other alternatives?

KMZ - Line with angulation and direction

Good afternoon.
Sorry for my bad english.
I would like to draw fixed lines in the map that would set the starting point with the coordinates, an angle of direction and dimension to the line without setting the end point coordinates.
Example: A line that would start in a given geographical coordinates -12.3456789, -49.3456789 has angle of 123 ° clockwise and has XXkm dimension.
It is possible to add lines like this in KMZ Google Earth?
Please to post it with some example code or suggestions.
KML (or KMZ) only can represent a line as a collection of points with at a minimum a start and end point.
https://developers.google.com/kml/documentation/kmlreference#linestring
You could calculate an end point from a starting point, angle of direction (or heading), and distance then represent display it in Google Earth using KML.
For example in the OpenSextant geodesy java library you can create a Geodetic2DArc and calculate the endpoint in 3 lines of java code like this:
Geodetic2DPoint start = new Geodetic2DPoint(new Longitude(-49.3456789, Angle.DEGREES),
new Latitude(-12.3456789, Angle.DEGREES));
Geodetic2DArc arc = new Geodetic2DArc(start, 5000.0, new Angle(123, Angle.DEGREES));
Geodetic2DPoint endPt = arc.getPoint2();
The distance is in meters so if you want a long line segment then you need a larger distance.
Then with the associated Giscore library you could export the line into KML directly with few more lines of java code:
KmlOutputStream kos = new KmlOutputStream(new FileOutputStream("out.kml"));
Feature f = new Feature();
f.setName("line");
List<Point> pts = new ArrayList<Point>(2);
pts.add(new Point(start));
pts.add(new Point(endPt));
f.setGeometry(new Line(pts));
kos.write(f);
kos.close();

VTK: Put Label/Text near points in the 3d plot

I have written a code which plots multiple 3d points as spheres. I want to add some text near each sphere in 3D to mention some info about each point. But I have vtkPoints to store points positions which doesn't have GetOutputPort which I need in labelMApper (and also used glyph3d to make spheres)
vtkSmartPointer<vtkLabeledDataMapper> labelMapper = vtkSmartPointer<vtkLabeledDataMapper>::New();
labelMapper->SetInputConnection( vtkpoints->GetOutputPort() ); // No GetOutputPort()
vtkSmartPointer<vtkActor2D> labelActor = vtkSmartPointer<vtkActor2D>::New();
labelActor->SetMapper(labelMapper);
renderer->AddActor(labelActor);
You should construct a vtkPolyData from the points and set it as Input to the label mapper.
Something like this:
vtkNew<vtkPolyData> labelPolyData;
labelPolyData->SetPoints(labelPoints);
labelMapper->SetInput(labelPolyData); // Note: If you're using VTK from master (6.x), this is SetInputData(...)
renderer->AddActor2D(labelActor);

convert kml polygons to svg paths

I have a KML file with placemarkers, each of which has polygon coordinates. I'd like to change the fill color of the polygons on the fly, depending on values I read in from a json file. My understanding is that Google caches kml files, so you can't easily change the fill color of polygons on the fly.
So I'm trying to convert my kml polygons into svg paths so that I can use Raphael to place my polygons on my Google map. Then I can change fill colors with javascript.
But how do I convert polygon coordinates to svg paths, does anyone know?
A sample set of coordinates would be:
<Polygon><outerBoundaryIs><LinearRing><coordinates>-80.098181,40.42127 -80.096479,40.421262 -80.096464,40.421409 -80.096448,40.421551 -80.096444,40.421583 -80.096434,40.421666 -80.096406,40.421931 -80.096389,40.422087 -80.096353,40.422423 -80.09583,40.426101 -80.095525,40.428234 -80.095315,40.429714 -80.095276,40.429989 -80.092585,40.428593 -80.092273,40.428431 -80.09069,40.430519 -80.090384,40.430924 -80.08989,40.430618 -80.089699,40.4305 -80.089499,40.430359 -80.088738,40.429886 -80.088418,40.429688 -80.088254,40.429585 -80.087931,40.429384 -80.087086,40.428859 -80.086867,40.428722 -80.086658,40.428592 -80.086493,40.42849 -80.08617,40.428282 -80.086177,40.428265 -80.08621,40.428188 -80.0864,40.427742 -80.086397,40.42749 -80.086394,40.427125 -80.08631,40.426427 -80.086335,40.425887 -80.086235,40.425409 -80.085776,40.425327 -80.085442,40.42527 -80.084993,40.424585 -80.085076,40.42448 -80.085542,40.423842 -80.085679,40.423125 -80.085659,40.423011 -80.085626,40.422827 -80.085191,40.421758 -80.08467,40.420859 -80.084258,40.420336 -80.083828,40.4201 -80.083078,40.420005 -80.082504,40.420072 -80.081444,40.420196 -80.080888,40.420181 -80.080775,40.420178 -80.080604,40.420173 -80.080122,40.420161 -80.079753,40.420151 -80.07947,40.420144 -80.079287,40.420139 -80.078239,40.420296 -80.077661,40.420418 -80.076213,40.420726 -80.075673,40.420766 -80.075298,40.420719 -80.075127,40.420625 -80.074909,40.420307 -80.075028,40.419779 -80.07539,40.419028 -80.07583,40.41836 -80.076065,40.418108 -80.076528,40.417616 -80.077217,40.417124 -80.077503,40.417002 -80.077725,40.416907 -80.078391,40.416622 -80.078614,40.416528 -80.078657,40.41651 -80.078693,40.416491 -80.078755,40.416457 -80.079174,40.416233 -80.079205,40.416217 -80.079292,40.416128 -80.079439,40.415977 -80.079456,40.41596 -80.079614,40.415473 -80.079604,40.415377 -80.079584,40.415179 -80.07958,40.415168 -80.079539,40.415042 -80.079499,40.414915 -80.079407,40.414785 -80.079742,40.414965 -80.08086,40.415568 -80.081458,40.415889 -80.081535,40.41593 -80.082292,40.416343 -80.08238,40.416392 -80.082597,40.41651 -80.082624,40.416525 -80.082787,40.416614 -80.083508,40.417007 -80.083934,40.417239 -80.084422,40.417505 -80.084622,40.417432 -80.084852,40.417348 -80.085329,40.417179 -80.085419,40.417141 -80.085948,40.41695 -80.086252,40.417184 -80.088463,40.418885 -80.088964,40.418631 -80.089036,40.418595 -80.089145,40.418539 -80.089173,40.418525 -80.089346,40.418438 -80.089376,40.418457 -80.089398,40.418471 -80.089964,40.418827 -80.090299,40.419055 -80.091306,40.419739 -80.091642,40.419967 -80.091803,40.420088 -80.091966,40.420043 -80.092445,40.419915 -80.092561,40.419885 -80.096792,40.418748 -80.098853,40.41815 -80.098868,40.418242 -80.09943,40.421273 -80.098181,40.42127</coordinates></LinearRing></outerBoundaryIs></Polygon>
Disclaimer: I'm a bit rusty on geodetics, but think your #1 problem here is the coordinate system - lat, lng are projection-dependent data points, whereas your screen is a flat pixel one. What you need to do is convert these to northing and easting points first.
There is a projection conversion library out there called proj.4 - use this to convert your coordinates. If needed, there is a javascript port of it that you can easily adapt for your use at https://trac.osgeo.org/proj/
Generic conversion process would go like this (LAT, LNG are actual coordinates.)
var source = new Proj4js.Proj('WGS84');
var dest = new Proj4js.Proj('GOOGLE');
var p = new Proj4js.Point( LATITUDE, LONGITUDE ); // replace with actual coords!
var pdest = Proj4js.transform(source, dest, p);
At this point, pdest.x and pdest.y will contain your SVG-compatible coordinates.
After your coordinates are converted to pixel units, simply plot them - and mind the range and units. Northing and easting coordinates will be in 800,000 range, so you will likely be applying some transformations, such as translation and scaling.
End result should look like this (being rusty, I may have messed up and flipped lat/lng around, etc.)
Here's a working jsfiddle with a conversion and plot: http://jsfiddle.net/LPzKV/1/

Resources