What techniques does the community use to edit a polygon on a Bing map?
Thinking of a vector drawing program, you can select a side, add a point to bisect a side, move the point which rubberbands the bisected side, etc.
The use case is the user has drawn a polygon, but they want to adjust it or make tweaks to it once drawn.
As far as I know, there is no framework implementation for what you want to accomplish that would work "out of the box". However, all the building blocks are there. You have the Polygon object to represent your polygon on the map. For the sides, you can use the Polyline. For your vertices, you can use the Pushpin. All these shapes have the ability to handle their own mouse events, so with a bit of code and a day's work you can roll yourself a simple polygon editor.
The idea is to have a number of Polyline segments(2 vertices each) that surround your polygon. These Polyline segments would have mousedown event handlers on them so when the user clicks on a side, you know where he/she clicked. Using this information, you can now update your Polygon and the surrounding Polylines to include this new vertex.
For your vertices, you can use pushpins to visualize them. For each vertex, supply the mousedown and mousemove events. When the user clicks on on a vertex, the mousedown will fire. This is your cue that the user wants to move that vertex, so you can enable your mousemove handler for that vertex to take effect. When the user subsequently moves his mouse, you will move the vertex with the mouse, while also updating the polygon and the relevant polylines(or updated all of them if you are lazy).
Anyway here is what I have done for the project I am working on. It is a roof measurement tool but you can see that it has much of the same functionality you want to achieve, i.e. the user can edit a polygon by moving vertices. This was done using the regular v7 API so you should be able to achieve something similar as well.
Related
UPD: Done. Look at this beautiful polygon.
UPD: In Flutter / openstreetmap, I want to let users draw a polygon by tapping a map and/or clicking a button. The polygon should be not filled. I need a very simple example just to get an idea of how it works.
The final task is:
I am making a flutter application that should give the user the ability to get information about markers located within a certain area on the map. I use osm. By pressing the button, the user initiates the construction of an arbitrary polygon, each corner of which is formed at the place of the next pressing of the button. When the construction of the polygon is completed, the objects inside the polygon are shown, the rest are hidden or not built. After that, the cycle ends by clearing the map.
I haven't found any solution for osm. I would appreciate any help. I don't have any code yet)
You can use the flutter_map library, I'm sure you can understand the documentation and how to set it up.
Then use PolygonLayerOptions(polygons: [Polygon(points: polygonList)]) as a layer on top of the OSM layer. Then set up the list polygonList and use the FlutterMap()'s onTap callback to get the position at which the user tapped and add the LatLng to the polygonList list. There are multiple other configuration options within the Polygon() constructor, and those can be found through IntelliSense or similar. To have no fill, just set the color to transparent.
I use this method (or a very similar one) for my app which lets users download areas of map. The user taps the top left and bottom right of a rectangular area they want to download, by code calculates the top right and bottom left, and a polygon is drawn to show the user exactly where they tapped. Make sure to use setState() or similar.
I have GPS coordinates, which are coming from cars. I'm trying to display their movement using mapbox. It works mostly fine, but because coordinates are imprecise, sometimes markers displayed inside houses, rivers, etc.
Is there a way to specify that the animation should follow the closest road?
Yes. That's exactly what the Map Matching API does.
I try to repeat a marker at the same coordinates when I am moving the map to infinity, in the same way that layers.
example : https://www.mapbox.com/mapbox-gl-js/example/geojson-polygon/
Has anyone found how to do that please?
If it's not possible, conversely is it possible to not repeat layers when you moving the map ?
Thank you
The Link example you provided is not using Markers to render the shaded area. It is using a feature, in this case a polygon, included in a layer (a layer can have many features).
In MapBox the rendered map is made up of any number of layers (including the tile data) which is rendered whenever you scroll or drag to a particular area of the map. For example as you keep dragging to the right in the map it will just keep rendering in the relevant layers and tiles.
The Marker functionality has a different purpose which is as a one off selected point which is useful for a user click or hover interaction.
I have several GeoJSON features on the map and wonder if leaflet could notify me when I am over a feature. I think that's geofencing?
Yes, and there is nothing very complicated to implement it.
What do you mean by "I am over a feature"?
If you mean your mouse pointer or a kind of marker / point that represents your current position, you would simply need a plugin like leaflet-pip to determine which features contain your position, if any (react on map"mousemove" event for the mouse).
If you mean the current map view intersects some of the features, that would be slightly more complex, but still easily solved through another library like turf. Look for turf.intersect method. You would need to iterate over all your features, checked against a rectangle built from the current map view (probably something like: L.rectangle(map.getBounds()).toGeoJSON()).
I need to show a view on which I need to animate a polygon using its vertices. The polygon should be touchable, thus fire an event once touched, and I need to be able to move its vertices using some animation procedure, once it has fired that event.
I need to have three polygons like that to form a 3D Cube.
The darkened area is the view (actually an image) on which I have the cube.
There are two steps in the process: drawing and event handling.
Drawing can be done with Quartz2D, by implementing a drawRect in a view, calculating the coordinates of the cube on screen, followed by creating and drawing the path, which works fine for solidly filled shapes. The alternative method uses an OpenGL view where you specify triangles.
At the event handling end, you can implement onTouchesBegan: and friends to get the location of the interaction, and possibly hitTest: to allow other views below it to handle subsequent events. The next thing you will need to decide is how accurate you want to be - you can define a box that roughly matches the cube and test that for touches. Most people will want to touch it somewhere in the middle anyway. For accurate testing, you need the screen coordinates, and test each triangle in each polygon to see if it contains the location. Google turned up a nice explanation on the maths needed for that. In the OpenGL case, you'll have to manually repeat the calculations performed by OpenGL to find out where on screen your polygons have ended up.