public boolean mergeFromParsedText(final Waypoint parsedWaypoint, final String parsePraefix) {
        boolean changed = false;

        final String waypointTypeName = getWaypointType().getL10n().toLowerCase(Locale.getDefault());

        if (this.isUserDefined()) {
            //type
            if (this.getWaypointType() == WaypointType.WAYPOINT &&
                    parsedWaypoint.getWaypointType() != WaypointType.WAYPOINT) {
                changed = true;
                waypointType = parsedWaypoint.getWaypointType();
            }
            //name: change when existing waypoint has a "default name"
            if (startsWithAnyLower(getName(), parsePraefix, waypointTypeName) &
                    !startsWithAnyLower(parsedWaypoint.getName(), parsePraefix, waypointTypeName)) {
                this.setName(parsedWaypoint.getName());
                changed = true;
            }
        }

        //calcState, only if coords are empty, otherwise mismatch between coords and formula can occur
        if (getCoords() == null && getCalcStateConfig() == null && parsedWaypoint.getCalcStateConfig() != null) {
            setCalcStateConfig(parsedWaypoint.getCalcStateConfig());
            changed = true;
        }

        if (getCoords() == null && !hasProjection() && parsedWaypoint.hasProjection()) {
            setProjection(parsedWaypoint.getProjectionType(), parsedWaypoint.getProjectionDistanceUnit(),
                    parsedWaypoint.getProjectionFormula1(), parsedWaypoint.getProjectionFormula2());
            setPreprojectedCoords(parsedWaypoint.getPreprojectedCoords());
            setCoordsPure(parsedWaypoint.getCoords());
            changed = true;
        }

        //coordinates
        if (getCoords() == null && parsedWaypoint.getCoords() != null) {
            setCoords(parsedWaypoint.getCoords());
            changed = true;
        }

        //user note
        if (StringUtils.isBlank(this.getUserNote()) && StringUtils.isNotBlank(parsedWaypoint.getUserNote())) {
            this.setUserNote(parsedWaypoint.getUserNote());
            changed = true;
        }

        if (parsedWaypoint.isVisited()) {
            setVisited(true);
        }

        return changed;
    }
similar to getGpxId, but includes geocode to be unique across different caches
main/src/main/java/cgeo/geocaching/models/Waypoint.java