Google Distance Matrix API - avoid or detect ferries - restriction

There is an avoid parameter, but as stated in the docs, it doesn't preclude the route from a solution.
Anyone know of a way to detect the ferries in a route?

Related

Best way to organize search results by location in a Django Rest Framework backend?

There are some naive ways to do this but I was wondering whether there is a more proficient way to achieve this functionality. I have a django rest framework backend and a react native front end. I have a table with objects that includes an Address object with the object's street address. What I would like to do is to return results sorted by distance from the user. Right now the database is small but soon we may have to paginate results.
I have a couple of ideas but I'm wondering whether there is a cleaner way to accomplish this.
For example the address field contains a lat/lng portion that is currently left blank, one idea is to populate this field on create/update operations using the google maps API geocoding functionality, then when the user makes a search request we order by l2 distance from their coordinates. One issue is that this could become very inefficient as the table grows larger. If we need O(N log N) operations every time the user is at a different location - even using tricks like caching. I know that some larger companies shard their database over regions to help with overhead in situations like this but we are relatively small right now and so such an approach would be overkill.
I would appreciate any advice that could help me tailor a solution to this problem. I can provide more information as well.

Using Redmine REST API to concurrently update Issues

Hoping someone could shed some light as my searches have turned up very little information.
I want to use Redmine's REST API for Issues to do:
GET /issues/[id].json to get the content of a specific issue.
Make changes to the above content.
Finally PUT /issues/[id].json the content back.
But I want to perform this using some form of concurrency control (ideally optimistic locking), so that content isn't changed by someone else around 2, promptly followed by 3 destroying said change.
This link hints on such possibility:
redmine.exceptions.ConflictError - (Why does this class exist?)
I'd assume there'd be some way of specifying a compare value, possibly updated_on, to do compare-and-swap-esk locking with PUT /issues/[id].json, but I can't find anything regarding this.
Redmine's web interface provides a concurrency control mechanism, so I'm stumped as to why there's so little information on this.

Restful API - handling large amounts of data

I have written my own Restful API and am wondering about the best way to deal with large amounts of records returned from the API.
For example, if I use GET method to myapi.co.uk/messages/ this will bring back the XML for all message records, which in some cases could be 1000's. This makes using the API very sluggish.
Can anyone suggest the best way of dealing with this? Is it standard to return results in batches and to specify batch size in the request?
You can change your API to include additional parameters to limit the scope of data returned by your application.
For instance, you could add limit and offset parameters to fetch just a little part. This is how pagination can be done in accordance with REST. A request like this would result in fetching 10 resources from the messages collection, from 21st to 30th. This way you can ask for a specific portion of a huge data set:
myapi.co.uk/messages?limit=10&offset=20
Another way to decrease the payload would be to only ask for certain parts of your resources' representation. Here's how facebook does it:
/joe.smith/friends?fields=id,name,picture
Remember that while using either of these methods, you have to provide a way for the client to discover each of the resources. You can't assume they'll just look at the parameters and start changing them in search of data. That would be a violation of the REST paradigm. Provide them with the necessary hyperlinks to avoid it.
I strongly recommend viewing this presentation on RESTful API design by apigee (the screencast is called "Teach a Dog to REST"). Good practices and neat ideas to approach everyday problems are discussed there.
EDIT: The video has been updated a number of times since I posted this answer, you can check out the 3rd edition from January 2013
There are different ways in general by which one can improve the API performance including for large API sizes. Each of these topics can be explored in depth.
Reduce Size Pagination
Organizing Using Hypermedia
Exactly What a User Need With Schema Filtering
Defining Specific Responses Using The Prefer Header
Using Caching To Make Response
More Efficient More Efficiency Through Compression
Breaking Things Down With Chunked Responses
Switch To Providing More Streaming Responses
Moving Forward With HTTP/2
Source: https://apievangelist.com/2018/04/20/delivering-large-api-responses-as-efficiently-as-possible/
if you are using .net core
you have to try this magic package
Microsoft.AspNetCore.ResponseCompression
then use this line in configureservices in startup file
services.AddResponseCompression();
then in configure function
app.UseResponseCompression();

API to look up business name, given a specific location?

I'm really hoping there's an existing service for something like this. I have a location (could be GPS coordinates or a street address, I can use geocoding or reverse geocoding services to switch between them) and I want to find a business that's listed as being approximately at that place.
If this service doesn't already exist, I'm thinking the best way to do what I want is to get a list of businesses close to a location, go through those and single out the closest one to the point I want, and say I'm "in" it if the distance is less than such and such.
If you have some pointers for which services I should look into (for either pinpointing one business or getting a list proximate to a location) or you think my methodology is stupid, please let me know!
edit: it's looking like the yahoo local search thing can pretty much do what I want. I'm going to start tinkering with that
Google Maps doesn't offer this yet. They do reverse geocoding from a lat/long to an address but not a business or interest.
I'm looking this up myself to see who offers this but the two I know of so far are GeoAPI (recently purchased by twitter) and SimpleGeo.
What you're looking for is Google Places which also allows you to specify the business type as well.
This is just a hunch, but have you checked out the Google Maps API?

How do you document a tree-to-tree transformation in a human-readable format?

I need to document an application that serves as a facade for a set of webservices. The application accepts SOAP requests and transforms these requests into a format understandable by the underlying web service. There are several such services, each with its own interface. Some accept SOAP, some HTTP POST, some... other formats not mentioned in polite society.
I need to document how we map the fields from our SOAP calls to the fields for these other formats. Before everyone cries "XSLT" I must mention that the notation must be human-friendly. Ideally it would be something Excel-able.
Has anyone encountered this sort of problems before? How did you solve it? Is there a human-friendly notation for tree-to-tree transformations that can fit on a spreadsheet?
I've had to do just this. The way I did it was to just start writing, following the hierarchical structure.
I eventually would find that I was repeating myself. An example was that certain elements had a common set of attributes. I would pull the documentation of that common set up before the sections on the specific elements. Same thing with documentation of handling of specific simpleTypes.
Eventually, there was even some high level discussion on the overall flow and "philosophy" of the transformation. But I let it all happen bit by bit, fixing it as I became bored with repetition.
That said, I'm a developer, not a tech writer.
I haven't really found anything so far, but I've found pointers to many libraries that help transform objects of one type to another in Java. For reference, I'm listing the most promising ones here, all doing some kind of JavaBean to JavaBean conversion:
Transmorph
EZMorph
Dozer